国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

快速入門:CoreLocation框架進(jìn)行定位和iOS不同版本間定位的差異

2019-11-14 18:28:14
字體:
供稿:網(wǎng)友

使用CoreLocation框架進(jìn)行定位

  • 廢話不多說,直接上干貨

1. iOS8之前的定位

  • 直接上代碼,代碼里面有詳細(xì)的步驟
#import "ViewController.h"// 0. 導(dǎo)入頭文件#import <CoreLocation/CoreLocation.h>@interface ViewController () <CLLocationManagerDelegate>/** 位置管理者 */@PRoperty (nonatomic, strong) CLLocationManager *manager;@end@implementation ViewController- (CLLocationManager *)manager{    if (!_manager) {        // 1. 創(chuàng)建CLLocationManager        _manager = [[CLLocationManager alloc] init];        // 2. 設(shè)置代理        _manager.delegate = self;        // 每隔多少米定位一次        _manager.distanceFilter = 100;        /**         kCLLocationAccuracyBestForNavigation // 最適合導(dǎo)航         kCLLocationAccuracyBest; // 最好的精確度,僅次于kCLLocationAccuracyBestForNavigation         kCLLocationAccuracyNearestTenMeters; // 附近10m         kCLLocationAccuracyHundredMeters; // 100m         kCLLocationAccuracyKilometer; // 1千米         kCLLocationAccuracyThreeKilometers; // 3千米         */        // 設(shè)置定位精確度        // 并不是精確度越高就越好,精確度越高,就越耗性能,越費(fèi)電,要根據(jù)需求來設(shè)置精確度        _manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;    }    return _manager;}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{    // 3.開始更新地址    // 此處重點(diǎn):一定要在info.plist文件中加上key:Privacy - Location Usage Description,value可以隨便寫    [self.manager startUpdatingLocation];}#pragma mark - 實(shí)現(xiàn)CLLocationManagerDelegate代理方法// 4.實(shí)現(xiàn)代理方法- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{    CLLocation *location = [locations lastObject];    NSLog(@"%@ -- %f", location.description, location.speed);}@end
  • 注意點(diǎn):第三步出,一定要在info.plist文件中加上key:Privacy - Location Usage Description,如圖所示:

2.iOS8的定位

  • iOS8相對于之前的版本,蘋果進(jìn)一步加強(qiáng)了對用戶隱私的保護(hù)。
    當(dāng)APP想訪問用戶的隱私信息時(shí),系統(tǒng)不再自動彈出一個(gè)對話框讓用戶授權(quán)
  • 解決方案:

    • (1)調(diào)用iOS 8.0的API,主動請求用戶授權(quán)

      • -(void)requestAlwaysAuthorization // 請求允許在前后臺都能獲取用戶位置的授權(quán)
      • -(void)requestWhenInUseAuthorization // 請求允許在前臺獲取用戶位置的授權(quán)
    • (2)務(wù)必在info.plist文件中配置對應(yīng)的鍵值, 否則以上請求授權(quán)的方法不生效
      NSLocationAlwaysUsageDescription : 允許在前后臺獲取GPS的描述
      NSLocationWhenInUseDescription : 允許在前臺獲取GPS的描述

#import "ViewController.h"#import <CoreLocation/CoreLocation.h>@interface ViewController () <CLLocationManagerDelegate>/** 位置管理者 */@property (nonatomic, strong) CLLocationManager *manager;@end@implementation ViewController- (CLLocationManager *)manager{    if (_manager == nil) {        _manager = [[CLLocationManager alloc] init];        _manager.delegate = self;        // 采取前臺定位        // 1. 需要在info.plist文件中添加key:NSLocationWhenInUseUsageDescription        // 2. 如果需要在后臺繼續(xù)定位,需要勾選后臺模式,當(dāng)程序進(jìn)入后臺后,會在最上方出現(xiàn)一個(gè)藍(lán)條//        [_manager requestWhenInUseAuthorization];        // 采用前后臺定位        // 1. 需要在info.plist文件中添加NSLocationAlwaysUsageDescription這個(gè)key        // 2. 這種模式的后臺定位,不需要勾選后臺模式,也不會出現(xiàn)藍(lán)條        [_manager requestAlwaysAuthorization];        // requestWhenInUseAuthorization和requestAlwaysAuthorization請求同時(shí)存在:        // 1. requestWhenInUseAuthorization請求在前,會先彈出前臺授權(quán)描述,第二次啟動程序的時(shí)候,還會彈出前后臺授權(quán)描述        // 2. requestAlwaysAuthorization在前,只會彈出前后臺授權(quán)描述,不會彈出前臺授權(quán)描述.    }    return _manager;}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{    [self.manager startUpdatingLocation];}#pragma mark - <CLLocationManagerDelegate>/** *  更新定位 * *  @param manager   位置管理器 *  @param locations 定位的位置數(shù)組 */- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{    NSLog(@"定位了");}

3. iOS9 的定位

  • 在iOS9中,如果使用requestWhenInUseAuthorization,跟iOS8一樣,不僅需要設(shè)置info.plist,如果想要在后臺定位,也需要勾選后臺模式,還需要設(shè)置allowsBackgroundLocationUpdates=Yes.同樣也會出現(xiàn)藍(lán)條
        _manager.allowsBackgroundLocationUpdates = YES;
  • iOS 9.0 可以單次請求用戶位置:-(void)requestLocation

    • 作用是按照定位的精確度從低到高進(jìn)行排序,逐個(gè)進(jìn)行定位.如果獲取到的位置不是精確度最高的那個(gè),也會在定位超時(shí)后,通過代理告訴外界(必須實(shí)現(xiàn)代理的-locationManager:didFailWithError:方法, 不能與startUpdatingLocation方法同時(shí)使用)
- (void)requestLocation-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations  // 成功調(diào)用-(void)locationManager:(nonnull CLLocationManager *)manager didFailWithError:(nonnull NSError *)error // 失敗調(diào)用

4. CLLocation

  • 以一個(gè)小的需求來學(xué)習(xí)CLLocation
  • 一個(gè)小需求:打印當(dāng)前用戶的行走方向,偏離角度以及對應(yīng)的行走距離, 例如:”北偏東30度方向,移動了8米”
/** *  代理方法: 更新定位 * *  @param manager   位置管理器 *  @param locations 定位的位置數(shù)組 */- (void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations{    // CLLocation常用屬性    // coordinate	(當(dāng)前位置所在的經(jīng)緯度)    // altitude	(海拔)    // speed	(當(dāng)前速度)    // course (航向)    // -distanceFromLocation (獲取兩個(gè)位置之間的直線物理距離)    CLLocation *location = [locations lastObject];    // 1. 獲取偏向角度    NSString *angleStr = nil;    switch ((int)location.course / 90) {        case 0:            angleStr = @"北偏東";            break;        case 1:            angleStr = @"東偏南";            break;        case 2:            angleStr = @"南偏西";            break;        case 3:            angleStr = @"西偏北";            break;        default:            angleStr = @"未知位置";            break;    }    // 2. 偏移角度    NSInteger angle = (int)location.course % 90;    if (angle == 0) { // 表示正方向        angleStr = [angleStr substringWithRange:NSMakeRange(0, 1)];    }    // 3. 移動了多少米    double distance = 0;    if (_oldLocation) {        distance = [location distanceFromLocation:_oldLocation];    }    _oldLocation = location;    // 4. 打印    NSString *locationStr = [NSString stringWithFormat:@"%@%zd度方向,移動了%.2fm", angleStr, angle, distance];    NSLog(@"%@", locationStr);}

5.定位的其他補(bǔ)充

  • 授權(quán)狀態(tài)
     kCLAuthorizationStatusNotDetermined = 0, // 用戶未決定     kCLAuthorizationStatusRestricted, // 受限制     kCLAuthorizationStatusDenied, // 拒絕     kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(NA, 8_0), // 永久授權(quán)     kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0), // APP使用的時(shí)候授權(quán)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 班玛县| 彰化市| 渝中区| 海淀区| 永登县| 武威市| 房山区| 饶平县| 大邑县| 民县| 唐海县| 通渭县| 普定县| 祁阳县| 荣昌县| 古浪县| 长海县| 中西区| 乌拉特前旗| 县级市| 唐海县| 新邵县| 建始县| 连云港市| 伽师县| 额济纳旗| 当涂县| 丹阳市| 泗洪县| 即墨市| 扬州市| 汉阴县| 盐亭县| 全椒县| 珠海市| 阳高县| 广安市| 印江| 新源县| 永吉县| 忻州市|