iOS提供了四种不同的途径进行定位
(1)Wi-Fi,通过Wi-Fi路由器的地理位置信息查询,比较省电。iPhone、iPod touch和iPad都可以采用。
(2)蜂窝式移动电话基站,通过移动运营商基站定位。只有iPhone、3G版本的iPod touch和iPad可以采用。
(3)GPS卫星,通过GPS卫星位置定位,这种方式最为精准,单是耗电量大,不能遮挡。iPhone、iPod touche、iPad都可以采用。
(4)iBeacon微定位,苹果公司在iOS7后支持iBeacon技术。iBeacon技术是苹果研发的,它使用低功耗蓝牙技术,通过多个iBeacon基站创建一个信号区域,当设备进入该区域时,相应程序会提示用户进入这个区域。
Core Location框架
在iOS中,定位服务API主要使用Core Location框架,定位时主要使用CLLocationManager、CLLocationManagerDelegate和CLLocation这三个类。
(1)CLLocationManager,用于定位服务管理类,他能够给我们提供位置信息和高度信息,也可以监控设备进入或离开某个区域,还可以获得设备的运行方向。
(2)CLLocationManagerDelegate,是CLLocationManager类的委托协议。
(3)CLLocation,封装了位置信息和高度信息。
例:
Swift代码
// An highlighted block
//ViewController.swift文件
import UIKit
//引入CoreLocation模块
import CoreLocation
class ViewController:UIViewController,CLLocationManagerDelegate{
//经度
@IBOutlet weak var txtLng:UITextField!
//纬度
@IBOutlet weak var txtLat:UITextField!
//高度
@IBOutlet weak var txtAlt:UITextField!
//定义CLLocationManager类型的locationManager属性
var locationManager:CLLocationManager!
override func viewDidLoad(){
super.viewDidLoad()
//定位服务管理对象初始化
//创建并初始化locationManager属性
self.locationManager=CLLocationManager()
//设置定位服务委托对象为self
self.locationManager.delegate=self
/*desiredAccuracy属性,取值有6个常量:
(1)kCLLocationAccuracyNearestTenMeters,精确到10米
(2)kCLLocationAccuracyHundredMeters,精确到100米
(3)kCLLocationAccuracyKilometer,精确到1000米
(4)kCLLocationAccuracyThreeKilometers,精确到300米
(5)kCLLocationAccuracyBest,使用电池供电时最高的精度
(6)kCLLocationAccuracyBestForNavigation,导航情况下最高的精度,一般有外界电源时使用
*/
self.locationManager.desiredAccuracy=KCLLocationAcuracyBest
//设置distanceFilter属性,它是距离过滤器,定义设备移动后获得位置信息的最小距离,单位是米。
self.locationManager.distanceFilter=100.0
//iOS8新添加的,弹出用户授权对话框,为了能弹出授权对话框,需要修改工程配置info.plist属性列表,添加NSLocationAlwaysUsageDescription和NSLocationWhenInUserUsageDescription键
//要求用户“使用应用期间”授权
self.locationManager.requestWhenInUseAuthorization()
//要求用户“始终”授权
self.locationManager.requestAlwaysAuthorization()
//开始定位
self.locationManager.startUpdatingLocation()
}
override func viewWillDisappear(_ animated:Bool)
{
super.viewWillDisappear(animated)
//停止定位
self.locationManager.stopUpdatingLocation()
}
//定位成功,locations是位置变化的集合,它按照时间变化的顺序存放。如果要获得当前设备的位置,可以取集合最后一个元素
func locationManager(_ manager:CLLocationManager,didUpdateLocations locations:[Cllocation]){
//获取当前设备位置信息
var currlocation=locations[locations.count-1] as CLLocation
//获取纬度
self.txtLat.text=String(format:"%3.5f",currLocation.coordinate.latitude)
//获取经度
self.txtLng.text=String(format:"%3.5f",currLocation.coordinate.longitude)
//获取高度
self.txtAlt.text=String(format:"%3.5f",currLocation.altitude)
}
//定位失败
func locationManager(_ manager:CLLocationManager!,didFailWithError error:NSError!){
print("error:\(error.localizedDescription)")
}
//授权状态发生变化时调用
func locationManager(_ manager:CLLocationManager,didChangeAuthorizationStatus status:CLAuthorizationstatus){
switch status{
case .authorizedAlways:
print("已经授权")
case .authorizedWhenInUse:
print("使用时授权")
case .denied:
print("拒绝")
case .restricted:
print("受限")
case .notDetermined:
print("用户还没有确定")
}
}
}
ObjectiveC代码
// An highlighted block
//ViewController.m文件
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController()<CLLocationManagerDelegate>
//经度
@property(weak,nonatomic) IBOutlet UITextField *txtLng;
//纬度
@property(weak,nonatomic) IBOutlet UITextField *txtLat;
//高度
@property(weak,nonatomic) IBOutlet UITextField *txtAlt;
//定义CLLocationManager类型的locationManager属性
@property(nonatomic,strong)CLLocationManager *locationManager;
@end
@imlementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
//定位服务管理对象初始化
//创建并初始化locationManager属性
self.locationManager=[[CLLocationManager alloc] init];
//设置定位服务委托对象为self
self.locationManager.delegate=self;
/*desiredAccuracy属性,取值有6个常量:
(1)kCLLocationAccuracyNearestTenMeters,精确到10米
(2)kCLLocationAccuracyHundredMeters,精确到100米
(3)kCLLocationAccuracyKilometer,精确到1000米
(4)kCLLocationAccuracyThreeKilometers,精确到300米
(5)kCLLocationAccuracyBest,使用电池供电时最高的精度
(6)kCLLocationAccuracyBestForNavigation,导航情况下最高的精度,一般有外界电源时使用
*/
[self.locationManager KCLLocationAccuracyBest];
[self.locationManager requestAlwaysAuthorization];
//开始定位
[self.locationManager startUpdatingLocation];
}