1. 請求用戶授權注意事項
(1) 在iOS8之后,蘋果強制要求開發者主動申請授權,否則你的應用將無法使用定位功能
iOS7之前,只要你使用了CLLocation這個框架,系統就會有自動彈窗-
(2) 請求授權分兩個步驟:
1.代碼請求
2.配置對應的plist文件
在使用時請求授權,代碼:[self.locatitonManager requestWhenInUseAuthorization],對應plist鍵: NSLocationWhenInUseUsageDescription始終請求授權,代碼:[self.locatitonManager requestAlwaysAuthorization],對應plist鍵:NSLocationAlwaysUsageDescription
(3) 如果用戶選擇了拒絕,怎么辦?
1.彈窗提示,跳轉到系統設置界面
2.使用其他方式獲取用戶位置
2. 使用期間授權
- 步驟
1.調用代碼 [self.locationManager requestWhenInUseAuthorization]
2.配置應用的plist文件:NSLocationWhenInUseUsageDescription
001.png
002.png
003.png
3. 處理用戶定位授權步驟
- 先獲取用戶的授權狀態
//1.獲取用戶當前定位授權狀態
/**
typedef NS_ENUM(int, CLAuthorizationStatus) {
kCLAuthorizationStatusNotDetermined = 0,//用戶沒有選擇
kCLAuthorizationStatusRestricted,//應用不支持定位服務(可能手機有故障)
kCLAuthorizationStatusDenied,//用戶被拒絕
kCLAuthorizationStatusAuthorizedAlways //允許一直定位
kCLAuthorizationStatusAuthorizedWhenInUse //允許使用期間定位
*/
CLAuthorizationStatus state = [CLLocationManager authorizationStatus];//這是一個枚舉
- 如果授權狀態是未知的,表示用戶沒有選擇時允許還是拒絕,這時我們可以請求用戶授權
if((state == kCLAuthorizationStatusAuthorizedAlways) || (state == kCLAuthorizationStatusAuthorizedWhenInUse))//表示已經支持定位
{
}
else if (state == kCLAuthorizationStatusNotDetermined)//表示用戶既沒有拒絕也沒有允許,這個時候我們需要彈窗請求授權定位
{
//1.創建locationManager
self.locationManager = [[CLLocationManager alloc] init];
//2.請求授權(不要忘記配置plist文件)
// [self.locationManager requestWhenInUseAuthorization];//使用期間授權
[self.locationManager requestAlwaysAuthorization];//一直授權,后臺時會調用更新位置方法
}
else if (state == kCLAuthorizationStatusDenied)//用戶拒絕授權,這個時候可以彈窗提示用戶跳轉到設置界面
{
}
- 如果授權狀態是拒絕,表示用戶第一次彈窗不允許定位服務,系統的彈窗只會有一次,所以我們需要手動彈窗
if((state == kCLAuthorizationStatusAuthorizedAlways) || (state == kCLAuthorizationStatusAuthorizedWhenInUse))//表示已經支持定位
{
}
else if (state == kCLAuthorizationStatusNotDetermined)//表示用戶既沒有拒絕也沒有允許,這個時候我們需要彈窗請求授權定位
{
//1.創建locationManager
self.locationManager = [[CLLocationManager alloc] init];
//2.請求授權(不要忘記配置plist文件)
// [self.locationManager requestWhenInUseAuthorization];//使用期間授權
[self.locationManager requestAlwaysAuthorization];//一直授權,后臺時會調用更新位置方法
}
else if (state == kCLAuthorizationStatusDenied)//用戶拒絕授權,這個時候可以彈窗提示用戶跳轉到設置界面
{
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"提示" message:@"您已經關閉了定位服務,該功能無法使用,請到通用-隱私-定位服務中開啟定位服務" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action1 =[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
UIAlertAction *action2 =[UIAlertAction actionWithTitle:@"系統設置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//判斷系統是否支持跳轉 (iOS8之后新增)
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]) {
//跳轉到系統設置界面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
}];
[alertVC addAction:action1];
[alertVC addAction:action2];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self presentViewController:alertVC animated:YES completion:nil];
});
}
4. iOS跳轉到系統設置界面
- 在項目中,我們經常會遇到使用位置、通知的需求,當用戶打開App時,經常喜歡關閉一切提醒的設置,我們需要提供給用戶設置這些設置的幫助頁面,使用快捷方式的方法設置,提高用戶的體驗度 在自己的項目中需要設置我們的代碼,在執行的方法中執行如下代碼,就會跳到系統的通知的設置中
NSURL *url = [NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
- 關于IOS系統功能的URL 匯總列表:
注: 模擬器大多數不支持,因為沒有這個功能
定位:prefs:root=LOCATION_SERVICES
蜂窩網絡:prefs:root=MOBILE_DATA_SETTINGS_ID
VPN — prefs:root=General&path=Network/VPN
Wi-Fi:prefs:root=WIFI
定位服務:prefs:root=LOCATION_SERVICES
個人熱點:prefs:root=INTERNET_TETHERING
關于本機:prefs:root=General&path=About
輔助功能:prefs:root=General&path=ACCESSIBILITY
飛行模式:prefs:root=AIRPLANE_MODE
鎖定:prefs:root=General&path=AUTOLOCK
亮度:prefs:root=Brightness
藍牙:prefs:root=General&path=Bluetooth
時間設置:prefs:root=General&path=DATE_AND_TIME
FaceTime:prefs:root=FACETIME
設置:prefs:root=General
鍵盤設置:prefs:root=General&path=Keyboard
iCloud:prefs:root=CASTLE
iCloud備份:prefs:root=CASTLE&path=STORAGE_AND_BACKUP
語言:prefs:root=General&path=INTERNATIONAL
音樂:prefs:root=MUSIC
Music Equalizer — prefs:root=MUSIC&path=EQ
Music Volume Limit — prefs:root=MUSIC&path=VolumeLimit
Network — prefs:root=General&path=Network
Nike + iPod — prefs:root=NIKE_PLUS_IPOD
Notes — prefs:root=NOTES
Notification — prefs:root=NOTIFICATIONS_ID
Phone — prefs:root=Phone
Photos — prefs:root=Photos
Profile — prefs:root=General&path=ManagedConfigurationList
Reset — prefs:root=General&path=Reset
Safari — prefs:root=Safari
Siri — prefs:root=General&path=Assistant
Sounds — prefs:root=Sounds
Software Update — prefs:root=General&path=SOFTWARE_UPDATE_LINK
Store — prefs:root=STORE
Twitter — prefs:root=TWITTER
Usage — prefs:root=General&path=USAGE
Wallpaper — prefs:root=Wallpaper