定位授權

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. 先獲取用戶的授權狀態
//1.獲取用戶當前定位授權狀態
    /**
     typedef NS_ENUM(int, CLAuthorizationStatus) {

     kCLAuthorizationStatusNotDetermined = 0,//用戶沒有選擇

     kCLAuthorizationStatusRestricted,//應用不支持定位服務(可能手機有故障)

     kCLAuthorizationStatusDenied,//用戶被拒絕

     kCLAuthorizationStatusAuthorizedAlways //允許一直定位

     kCLAuthorizationStatusAuthorizedWhenInUse //允許使用期間定位
     */
    CLAuthorizationStatus state = [CLLocationManager authorizationStatus];//這是一個枚舉
  1. 如果授權狀態是未知的,表示用戶沒有選擇時允許還是拒絕,這時我們可以請求用戶授權
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)//用戶拒絕授權,這個時候可以彈窗提示用戶跳轉到設置界面
    {

    }
  1. 如果授權狀態是拒絕,表示用戶第一次彈窗不允許定位服務,系統的彈窗只會有一次,所以我們需要手動彈窗
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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容