系統對定位權限的設置會隨着時間發生變化,而我們只能擁抱變化!本文是對定位權限設置做個記錄,方便以後做系統適配。本篇也會持續更新~。
- 在iOS 7及以前: 系統設置裏面有
永不
、始終
選項。 - iOS8-10:
永不
、始終
選項,如果配置NSLocationWhenInUseUsageDescription
會出現使用應用期間
選項.
由於項目中不適配這麼低版本系統,所以接下來主要對iOS 11及以上截圖記錄並且會持續跟蹤。
一、iOS 11~12
請求權限的方式:
- requestWhenInUseAuthorization()
使用應用期間權限,要求info.plist
中配置NSLocationWhenInUseUsageDescription
這個key和對應的文案,配置之後,權限彈窗的文案是這個文案;設置中顯示的文案是首先看NSLocationAlwaysAndWhenInUseUsageDescription
的文案,沒有時才顯示NSLocationWhenInUseUsageDescription
的文案。 - requestAlwaysAuthorization()
總是允許權限,要求info.plist
中配置NSLocationWhenInUseUsageDescription
和NSLocationAlwaysAndWhenInUseUsageDescription
兩個key和對應的文案。配置之後,權限彈窗和設置中的文案是NSLocationAlwaysAndWhenInUseUsageDescription
的文案。
下面是iOS12的彈窗示例
使用期間權限彈窗 | “使用期間權限”設置 | 總是允許權限彈窗 | “總是允許”設置 |
---|---|---|---|
如果請求到了使用期間權限再請求總是允許彈窗,則彈窗顯示爲:NSLocationAlwaysAndWhenInUseUsageDescription
的文案,選項有“使用期間”和“始終允許”。
二、iOS 13
新增了“允許一次”的選項,無論是申請“使用期間”權限還是“始終允許”權限,都是彈同樣的窗. 彈窗的文案是NSLocationWhenInUseUsageDescription
的文案。設置中顯示的文案是NSLocationAlwaysAndWhenInUseUsageDescription
的文案。
權限彈窗 | 設置的定位服務 | 後臺定位權限升級彈窗 |
---|---|---|
- 如果用戶點擊的是“允許一次”,那麼得到的權限狀態是
authorizedWhenInUse
, 設置中顯示的是“下次詢問”,下次請求權限時還會再次彈窗。 - 如果請求“總是允許”權限,用戶點擊“使用APP時允許”,得到的是
authorizedAlways
;當app退到後臺後,系統會擇機彈窗提示用戶權限是否要"升級爲始終允許"。 - 如果請求“使用期間”權限,用戶點擊“使用APP時允許”,得到的是
authorizedWhenInUse
.
三、iOS 14
相比iOS 13,iOS14 定位彈窗中新增了“精確位置”的顯示,如下圖,用戶可以選擇“打開和關閉精確位置”。
如果用戶沒有打開“精確位置”權限,iOS 14中可以請求臨時的精確位置權限。
if #available(iOS 14.0, *) ,
self.manager.accuracyAuthorization != .fullAccuracy {
// 如果在用戶授權定位權限時,沒有選擇“精確位置”,那麼可以通過這個方法來請求“臨時的精確位置”權限
self.manager.requestTemporaryFullAccuracyAuthorization(withPurposeKey: "hahaKey") { error in
print("error=\(error)")
/* error有值的情況:(有值時不會彈授權彈窗)
1.你寫的PurposeKey參數hahaKey在plist的
Privacy - Location Temporary Usage Description Dictionary中沒找到。
2.已經有精確位置的權限了。(可在設置中查看)
3.app處於後臺時請求
4.精確位置權限獲取 self.manager.accuracyAuthorization */
}
}
注意:iOS 14及以上的權限彈窗中小地圖會不會顯示,取決於“設置-》隱私-》定位服務-》位置提醒是否打開”,未打開時沒有小地圖。
權限彈窗帶地圖 | 設置的定位服務 | 請求臨時精確位置權限 |
---|---|---|
- 彈窗中用戶點擊後的權限結果跟iOS 13一樣,不同的是可以點擊“精確位置”。
- 精確位置權限獲取通過accuracyAuthorization屬性,
fullAccuracy
爲已是完全精確,reducedAccuracy
爲降低精確度。
四、iOS 15-16
大體跟iOS 14一樣,不一樣的地方在於設置中的“下次詢問”變成了“下次詢問或在我共享時”。
“在我共享時”指的是"隱私-》定位-》系統服務-》共享我的位置"。
五、後臺定位
後臺需要如下操作:
- 在info.plist配置NSLocationAlwaysUsageDescription字段;
- Xcode勾選 Capabilities -> UIBackgroundModes > Location updates;
- CLLocationManager設置allowsBackgroundLocationUpdates爲YES;
- 首次使用定位時,需要申請權限,如下圖。