iOS APP中定位服務(wù)選項(xiàng)中常用有三種授權(quán)狀態(tài):
- 1、永不
- 2、使用應(yīng)用期間
- 3、始終
image.png
如何讓APP同時(shí)擁有三種選擇?
需要進(jìn)行以下設(shè)置:
在應(yīng)用的info.plist文件中添加有關(guān)定位授權(quán)的屬性,常使用到的有兩個(gè):
1、NSLocationAlwaysUsageDescription 持續(xù)(一直)
這個(gè)關(guān)鍵字的意思是:持續(xù)(一直)定位描述,它的值是個(gè)NSString類(lèi)型,填寫(xiě)的就是向用戶請(qǐng)求定位授權(quán)時(shí)給用戶看的信息“XXXXX”,目的就是告訴用戶:我現(xiàn)在正在向你請(qǐng)求定位功能的授權(quán),之所以要使用你的手機(jī)的定位功能是因?yàn)閄XXXX原因,這是蘋(píng)果在iOS8開(kāi)始要求的。
2、NSLocationWhenInUseUsageDescription 使用期間
這個(gè)關(guān)鍵字的意思是:使用期間定位描述,它的值是個(gè)NSString類(lèi)型,填寫(xiě)的內(nèi)容與上面相似。
這兩個(gè)屬性用到哪個(gè)就添加哪個(gè),注意:這兩個(gè)屬性添加時(shí)要一字不差,否則APP檢測(cè)不到該屬性,如果兩個(gè)都添加那么用戶會(huì)有三種選擇,就像上圖顯示的一樣。
image.png
關(guān)于定位授權(quán)狀態(tài)改變時(shí),應(yīng)該如何處理:
// 定位失敗后執(zhí)行此方法
- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
if ( [error code] == kCLErrorDenied ) {
//第一次安裝含有定位功能的軟件時(shí)
//程序?qū)⒆詣?dòng)提示用戶是否讓當(dāng)前App打開(kāi)定位功能,
//如果這里選擇不打開(kāi)定位功能,
//再次調(diào)用定位的方法將會(huì)失敗,并且進(jìn)到這里。
//除非用戶在手機(jī)的設(shè)置頁(yè)面中重新對(duì)該軟件打開(kāi)定位服務(wù),
//否則程序只要用到定位就總會(huì)進(jìn)到這里。
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"定位服務(wù)已經(jīng)關(guān)閉"
message:@"請(qǐng)進(jìn)入系統(tǒng)【設(shè)置】>【隱私】>【定位服務(wù)】中打開(kāi)開(kāi)關(guān),并允許本應(yīng)用使用定位服務(wù)"
delegate:self
cancelButtonTitle:@"確定"
otherButtonTitles:nil, nil nil];
[alert show];
[_locationManager stopUpdatingLocation];
}
else if ([error code] == kCLErrorHeadingFailure) {
}
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
NSLog(@"【注意】 ———— 定位授權(quán)的狀態(tài)將要發(fā)生改變!");
switch (status) {
case kCLAuthorizationStatusNotDetermined: {
NSLog(@"定位授權(quán)狀態(tài):———— 用戶還未決定授權(quán)狀態(tài)!"); // 什么都不做,不能進(jìn)行定位(這種情況常見(jiàn)于第一次安裝應(yīng)用打開(kāi)后用戶還未決定如何選擇定位方式)
}
break;
case kCLAuthorizationStatusAuthorizedAlways: {
NSLog(@"定位授權(quán)狀態(tài):———— 已授權(quán)一直定位!");
if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]){
[_locationManager requestAlwaysAuthorization];
[_locationManager startUpdatingLocation]; // 開(kāi)始刷新定位
}
}
break;
case kCLAuthorizationStatusAuthorizedWhenInUse: {
NSLog(@"定位授權(quán)狀態(tài):———— 已授權(quán)使用期間定位!");
if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
[_locationManager requestWhenInUseAuthorization];
[_locationManager startUpdatingLocation]; // 開(kāi)始刷新定位
}
}
break;
case kCLAuthorizationStatusDenied: {
NSLog(@"定位授權(quán)狀態(tài):———— 已拒絕定位!");
[_locationManager stopUpdatingLocation]; // 停止刷新定位
}
break;
default:{
}
break;
}
}
#else
#endif