更新Xcode 9之后笨农,真機iOS 11就缆,在獲取用戶定位權限上有所變動。先看下官方文檔解釋:鏈接地址
英文:
中文:
概述
對位置服務的何時使用授權進行配置:
NSLocationWhenInUseUsageDescription鍵添加到您的應用程序的信息谒亦。plist文件竭宰。(在信息中,Xcode將這個密鑰顯示為“隱私-位置信息”份招。plist編輯切揭。)
創(chuàng)建和配置你的
CLLocationManager
對象。
調用
requestWhenInUseAuthorization()
在啟動任何位置服務之前锁摔,CLLocationManager對象的方法廓旬。
重要的
你需要提供NSLocationWhenInUseUsageDescription鍵在你的應用程序的信息。plist文件谐腰。如果該密鑰不存在孕豹,授權請求將立即失敗。
在需要位置服務的時候請求授權十气。例如励背,等待用戶激活你的應用程序的一個功能,該功能需要位置數據砸西。在啟動時不要請求授權椅野,除非您立即需要用戶的位置,或者在后臺啟動以接收位置更新籍胯。
要求在使用過程授權
清單1顯示了在啟動應用程序的位置相關服務之前竟闪,如何請求使用授權。只有在應用程序的授權狀態(tài)未確定時杖狼,才需要請求授權炼蛤。對于使用的授權,您可以調用
requestWhenInUseAuthorization()
方法蝶涩。如果您的應用程序的狀態(tài)已經確定理朋,您可以簡單地啟動您需要的服務絮识。
清單1
請求授權使用位置服務
let locationManager = CLLocationManager()
func enableBasicLocationServices() {
locationManager.delegate = self
switch CLLocationManager.authorizationStatus() {
case .notDetermined:
// Request when-in-use authorization initially
locationManager.requestWhenInUseAuthorization()
break
case .restricted, .denied:
// Disable location features
disableMyLocationBasedFeatures()
break
case .authorizedWhenInUse, .authorizedAlways:
// Enable location features
enableMyWhenInUseFeatures()
break
}
}
}
對授權狀態(tài)的更改作出響應
當您進行授權請求時,核心位置將異步處理您的請求嗽上,并將結果交付給您
locationManager(:didChangeAuthorization:)
位置管理器委托對象的方法次舌。使用該方法確定用戶是否授予或拒絕您的請求,并在響應中采取適當的操作兽愤。
清單2顯示了一個實現
locationManager(:didChangeAuthorization:)
當應用獲得授權彼念,當授權被拒絕或受到限制時,應用程序的位置相關功能就會被禁用浅萧。
清單2
對應用程序的授權進行更改
func locationManager(_ manager: CLLocationManager,
didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
case .restricted, .denied:
disableMyLocationBasedFeatures()
break
case .authorizedWhenInUse:
enableMyWhenInUseFeatures()
break
case .notDetermined, .authorizedAlways:
break
}
}
重要的
位置服務的可用性隨時可能發(fā)生變化逐沙。用戶可以在系統(tǒng)設置中禁用定位服務,無論是針對你的應用洼畅,還是針對所有的應用吩案。當設備進入飛機模式時,位置服務也會被禁用帝簇,當設備離開飛機模式時徘郭,它們可能會恢復。如果您的應用程序正在運行(在前臺或后臺)丧肴,當可用狀態(tài)更改時崎岂,系統(tǒng)將調用您的應用程序。
locationManager(_:didChangeAuthorization:)
方法通知您更改闪湾。
解釋下
簡單的來說:就是iOS 要更新新的Key冲甘,蘋果現在增加了一項新的隱私保護功能
NSLocationAlwaysAndWhenInUseUsageDeion
,并且原有的NSLocationAlwaysUsageDeion
被降級為NSLocationWhenInUseUsageDeion
途样。所以應用程序的Info.plist必須包含NSLocationAlwaysAndWhenInUseUsageDescription
和NSLocationWhenInUseUsageDescription
在Info.plist里設置好江醇,還不行。我們還需要去定位的界面何暇。
在控制器的里實現如下代碼
聲明
/**
位置管理器
*/
@property (nonatomic, strong)CLLocationManager *manager;
實現
_manager = [CLLocationManager new];
[_manager requestWhenInUseAuthorization];
-
注意:CLLocationManager對象要聲明不然的話陶夜,定位權限就是一閃而過,從而不能同意獲取定位裆站。
這樣點擊允許就可以成功定位了