博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS之地理位置及定位系统 -- 入门笔记(用Swift)
阅读量:6718 次
发布时间:2019-06-25

本文共 5168 字,大约阅读时间需要 17 分钟。

前言:关于地理位置及定位系统,在iOS开发中也比较常见,比如美团外面的餐饮店铺的搜索,它首先需要用户当前手机的位置,然后在这个位置附近搜索相关的餐饮店铺的位置,并提供相关的餐饮信息,再比如最常见的就是地图导航,地图导航更需要定位服务,然后根据用户的目的地选出一条路线。其实,作为手机用户这么长时间,或多或少会发现在有些app应用首次在你的手机安装成功后,首次启动可能就会提示"是否同意XXx(比如百度浏览器)获取当前位置"等这样一类的信息。可见地理位置及定位系统是企业app开发必不可少的技能。

本章将提供Swift版本和Objective-C两个版本的入门代码,分别实现显示当前手机或者是模拟器的地理经纬度坐标。

 

写在正式学习前的小贴士:

这是因为xcode升级造成的定位权限设置问题。

升级xcode6、xcode7以后打开以前xcode5工程,程序不能定位。工程升级到xcode6或xcode7编译时需要iOS8 要自己写授权,不然没权限定位。
解决方法:
首先在 info.plist里加入对应的缺少的字段 ,值设置为YES(前台定位写上边字段,前后台定位写下边字段)
          NSLocationWhenInUseUsageDescription   //允许在前台获取GPS的描述
          NSLocationAlwaysUsageDescription   //允许在前、后台获取GPS的描述

设置的图示:

 

好了,如果设置好了,那就正式进入编码学习吧,首先熟悉苹果提供的关于定位服务相关的类,方法以及属性:

1、定位服务和地图应用的介绍 定位服务: 获取用户当前的位置信息,针对用户的位置信息做相关的数据处理。

地图应用: 根据实际需求展示地图和周边环境信息,基于用户当前位置展示用户所关注的地图位置信息、以及为用户导航。

  • 定位服务要掌握的:
    • 主要操作的类:CLLocationManager
    • 所属库:CoreLocation
    • 结构体:CLLocationCoordinate2D(经纬度)、CLCLocationCoorRegion(区域)
  • 地图应用需要掌握的:
    • 框架:MapKit
    • 操作类:MKMapView

2、定位服务

  • 属性:
    • desiredAccuracy设置定位精确度,这是一个常量属性,一般用best
    • distanceFilter 重新定位的最小变化距离
  • 方法:

    • 设置什么时候开启定位的状态
      • requestAlwaysAuthorization() 始终开启定位
      • requestWhenInUseAuthorization() 当app进入前台的时候开启定位(iOS8的新方法)
      • 类方法locationServicesEnabled() 是否有定位服务功能(CLLocationManager)
      • startUpdatingLocation() 开启定位
  • 代理:

    • 代理的协议:
    • 代理的方法:可以直接进入这个库的API查看,只要就是定位错误调用的代理方法,定位成功调用的代理方法等等; 
  • 涉及到的对象

    • locations: CLLocation 该CLLocation对象的属性:
      • coordinate
        • longitude/latitude
  • 英语词汇积累:

    • accuracy 英 'ækjʊrəsɪ n. [数] 精确度,准确性
    • filter 英 'fɪltə 滤波器 过滤器;筛选;滤光器 过滤;渗透;用过滤法除去

下面提供的是Swift源码:

1 // 2 //  ViewController.swift 3 //  LocationManager 4 // 5 //  Created by HEYANG on 16/1/26. 6 //  Copyright © 2016年 HEYANG. All rights reserved. 7 // 8  9 import UIKit10 11 // 需要导入CoreLocation框架12 import CoreLocation13 14 class ViewController: UIViewController,CLLocationManagerDelegate {15 16     // 声明一个全局变量17     var locationManager:CLLocationManager!18     19     override func viewDidLoad() {20         super.viewDidLoad()21         locationManager = CLLocationManager()22         23         // 设置定位的精确度24         locationManager.desiredAccuracy = kCLLocationAccuracyBest25         26         // 设置定位变化的最小距离 距离过滤器27         locationManager.distanceFilter = 5028         29         // 设置请求定位的状态30         if #available(iOS 8.0, *) {31             locationManager.requestWhenInUseAuthorization()32         } else {33             // Fallback on earlier versions34             print("hello")35         }//这个是在ios8之后才有的36         37         // 设置代理为当前对象38         locationManager.delegate = self;39         40         if CLLocationManager.locationServicesEnabled(){41             // 开启定位服务42             locationManager.startUpdatingLocation()43         }else{44             print("没有定位服务")45         }46     47     }48     // 定位失败调用的代理方法49     func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {50         print(error)51     }52     // 定位更新地理信息调用的代理方法53     func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {54         if locations.count > 055         {56             let locationInfo = locations.last!57             let alert:UIAlertView = UIAlertView(title: "获取的地理坐标",58                 message: "经度是:\(locationInfo.coordinate.longitude),维度是:\(locationInfo.coordinate.latitude)",59                 delegate: nil, cancelButtonTitle: "是的")60             alert.show()61         }62     }63 }

 下面是Objective-C的源码:

1 // 2 //  ViewController.m 3 //  LocationManager 4 // 5 //  Created by HEYANG on 16/1/26. 6 //  Copyright © 2016年 HEYANG. All rights reserved. 7 // 8  9 #import "ViewController.h"10 11 #import 
12 13 14 @interface ViewController ()
15 16 /** 全局定位对象 */17 @property (nonatomic,strong)CLLocationManager *locationManager;18 19 @end20 21 @implementation ViewController22 23 - (void)viewDidLoad {24 [super viewDidLoad];25 26 CLLocationManager* locationManager = [[CLLocationManager alloc] init];27 28 // 设置定位精确度29 locationManager.desiredAccuracy = kCLLocationAccuracyBest;30 // 设置定位变化最小距离31 locationManager.distanceFilter = 50;32 33 // 设置定位服务的使用状态34 [locationManager requestWhenInUseAuthorization]; 35 locationManager.delegate = self;36 37 if ([CLLocationManager locationServicesEnabled]) {38 [locationManager startUpdatingLocation];39 }else{40 NSLog(@"本机不支持定位服务功能");41 }42 43 self.locationManager = locationManager;44 }45 // 定位失败调用的代理方法46 -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{47 NSLog(@"错误信息:%@",error);48 }49 // 定位数据更新调用的代理方法50 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray
*)locations{51 if (locations.count > 0) {52 CLLocation* location = locations.lastObject;53 CLLocationCoordinate2D coordinate2D = location.coordinate;54 NSString* message = [NSString stringWithFormat:@"经度:%lf,维度是:%lf",coordinate2D.longitude,coordinate2D.latitude];55 UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"显示当前位置的经纬度"                 message:message delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];56 [alertView show];57 58 }59 }60 61 @end

 

 

 

 转载请注明出处:

 

 

 

 

 

 

你可能感兴趣的文章
浙江电力使用RFID技术,有力保障电网运营
查看>>
呼叫中心管理之:让座席看见自己
查看>>
运营商全渠道建设的终极形态
查看>>
Java核心类库:内部类那点事儿
查看>>
《SAP入门经典(第5版)》——2.5 小结
查看>>
《软件建模与设计: UML、用例、模式和软件体系结构》一一1.8 软件建模和设计方法的发展...
查看>>
web 应用通用数据访问层 Fetchr
查看>>
《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2 建立基准...
查看>>
绕过 Windows 10 Cloud 限制 成功运行 Win32 应用程序
查看>>
Alamofire —— Swift 的 HTTP 客户端开发包
查看>>
《程序员的呐喊》一一1.13 弱类型机制够不够强
查看>>
Windows 10 Redstone 终将引入交互式动态瓷贴
查看>>
《机器人与数字人:基于MATLAB的建模与控制》——3.1节平移和旋转
查看>>
《途客圈创业记:不疯魔,不成活》一一1.3 iWeekend创业周末
查看>>
《精通SNMP》——2.4 标签类型和子类型
查看>>
《云数据中心构建实战:核心技术、运维管理、安全与高可用》——导读
查看>>
《Python自动化运维:技术与最佳实践》一2.4 探测Web服务质量方法
查看>>
《Android UI基础教程》——2.4节显示列表
查看>>
《Scala机器学习》一一1.5 使用Scala和Spark的Notebook工作
查看>>
Fast-FrameWork v0.1.1,JDK 8 MVC 框架
查看>>