iOS 定位服务

本文详细介绍了iOS中的定位服务,包括Core Location框架中的CLLocationManager、CLLocationManagerDelegate和CLLocation类的使用。内容涵盖Wi-Fi、蜂窝基站、GPS和iBeacon四种定位方式。此外,还讲解了定位服务的管理,如启动、停止、自动暂停以及后台运行,并探讨了地理信息编码与反编码的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值