CoreLocation框架

CoreLocation框架

一. iOS8.0之前的定位

1. 前臺定位

  1. 導(dǎo)入CoreLocation框架以及對應(yīng)的主頭文件

     #import <CoreLocation/CoreLocation.h>
    
  2. 創(chuàng)建CLLocationManager對象并設(shè)置代理

     self.locationM = [[CLLocationManager alloc] init];
     self.locationM.delegate = self;
    
  3. 調(diào)用方法,開始更新用戶位置信息

     [self.locationM startUpdatingLocation];
    
  4. 在對應(yīng)的代理方法中獲取位置信息

     -(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation > *)locations  
     {
         NSLog(@"每當(dāng)請求到位置信息時(shí), 都會調(diào)用此方法");  
     }
    

2. 后臺定位

  1. 在前臺定位基礎(chǔ)上, 勾選后臺模式Location updates
Snip20151031_3.png

3. 額外設(shè)置

  1. 每隔多少米定位一次

     代碼: self.locationM.distanceFilter = 100;
     功能: 只有當(dāng)最新的位置與上一次獲取的位置之間的距離, 大于這個(gè)值時(shí), 才會通過代理告訴外界
    
  2. 設(shè)置定位精確度

     代   碼: self.locationM.desiredAccuracy = kCLLocationAccuracyBest;
     功   能: 通過設(shè)置此屬性, 獲取不同精確度的位置信息
     注意事項(xiàng): 精確度越高,越耗電,定位所需時(shí)間越長
     枚舉注解:   
    
    枚舉值 含義
    kCLLocationAccuracyBestForNavigation 最適合導(dǎo)航
    kCLLocationAccuracyBest 精度最好的
    kCLLocationAccuracyNearestTenMeters 附近10米
    kCLLocationAccuracyHundredMeters 附近100米
    kCLLocationAccuracyKilometer 附近1000米
    kCLLocationAccuracyThreeKilometers 附近3000米

3. 知識補(bǔ)充

1. 定位常識
    1) 標(biāo)準(zhǔn)定位服務(wù)(基于gps/基站/wifi定位, 具體使用哪種,蘋果有自己規(guī)則) 
        > 程序關(guān)閉,就沒法獲取位置 
    2) 顯著的位置變化定位服務(wù)(使用基站進(jìn)行定位,所以必須要求設(shè)備有電話模塊) 
        > 當(dāng)app被完全關(guān)閉時(shí),也可以接收到位置通知,并讓app進(jìn)入到后臺處理 
        > 定位精度相比于上面,精度不大,所以耗電小,而且定位更新頻率依據(jù)基站密度而定 

2. 應(yīng)用場景
    1) 如果要求定位及時(shí),精度較高,并且運(yùn)行時(shí)間較短,可使用標(biāo)準(zhǔn)定位; 
    2) 如果長時(shí)間監(jiān)控用戶位置,用戶移動速度比較快(例如打車軟件),可使用后者 

4. 測試環(huán)境:

1. XCode7.0之前版本,例如XCode6.4版本
2. 模擬器選擇iOS8.0之前的版本
    * 原因 : XCode7.0(包含7.0)之后不支持iOS8.0之前的模擬器

5. 常見問題總結(jié)

1. 定位不到, 對應(yīng)的代理方法不執(zhí)行
    首先,檢查運(yùn)行的模擬器是否是iOS8.0之前的系統(tǒng)版本
    其次,檢查模擬器是否設(shè)置位置數(shù)據(jù)
    第三,確保代碼無問題(一般都是代理沒有設(shè)置,或者位置管理器對象是局部變量,亦或是位置管理器對象沒有被強(qiáng)引用)
    第四,絕逼是模擬器BUG, 請重置模擬器(是重置,不是重啟)

二. iOS8.0之后定位

1. 前臺定位

  1. 導(dǎo)入CoreLocation框架以及對應(yīng)的主頭文件

     #import <CoreLocation/CoreLocation.h>
    
  2. 創(chuàng)建CLLocationManager對象并設(shè)置代理

     self.locationM = [[CLLocationManager alloc] init];
     self.locationM.delegate = self;
    
  3. 請求前臺定位授權(quán), 并在Info.Plist文件中配置Key ( Nslocationwheninuseusagedescription )

     [self.locationM requestWhenInUseAuthorization];
    
  4. 調(diào)用方法,開始更新用戶位置信息

     [self.locationM startUpdatingLocation];
    
  5. 在對應(yīng)的代理方法中獲取位置信息

     -(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation > *)locations  
     {
         NSLog(@"每當(dāng)請求到位置信息時(shí), 都會調(diào)用此方法");  
     }
    

2. 后臺定位

方案一:
  1. 在前臺定位基礎(chǔ)上, 勾選后臺模式Location updates
注意:此時(shí)授權(quán)狀態(tài)如果是前臺定位, 那么當(dāng)APP退到后臺時(shí), 屏幕頂部會出現(xiàn)藍(lán)條
方案二:
  1. 請求前后臺定位授權(quán),并在info.plist文件中配置KEY ( NSLocationAlwaysUsageDescription )

     [self.locationM requestAlwaysAuthorization];
    

    注意:不需要勾選后臺模式, 也可以進(jìn)行后臺定位

    注意:此時(shí)授權(quán)狀態(tài)如果是前后臺定位, 那么即使APP退到后臺時(shí), 屏幕頂部會也不會出現(xiàn)藍(lán)條

3. 監(jiān)聽用戶授權(quán)狀態(tài)

  1. 實(shí)現(xiàn)以下代理方法即可

     // 當(dāng)用戶授權(quán)狀態(tài)發(fā)生變化時(shí)調(diào)用
     -(void)locationManager:(nonnull CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
     {
     switch (status) {
     // 用戶還未決定
     case kCLAuthorizationStatusNotDetermined:
     {
         NSLog(@"用戶還未決定");
         break;
     }
     // 訪問受限(蘋果預(yù)留選項(xiàng),暫時(shí)沒用)
     case kCLAuthorizationStatusRestricted:
     {
         NSLog(@"訪問受限");
         break;
     }
     // 定位關(guān)閉時(shí)和對此APP授權(quán)為never時(shí)調(diào)用
     case kCLAuthorizationStatusDenied:
     {
         // 定位是否可用(是否支持定位或者定位是否開啟)
         if([CLLocationManager locationServicesEnabled])
         {
             NSLog(@"定位開啟,但被拒");
             // 在此處, 應(yīng)該提醒用戶給此應(yīng)用授權(quán), 并跳轉(zhuǎn)到"設(shè)置"界面讓用戶進(jìn)行授權(quán)
             // 在iOS8.0之后跳轉(zhuǎn)到"設(shè)置"界面代碼
             NSURL *settingURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
             if([[UIApplication sharedApplication] canOpenURL:settingURL])
             {
                 [[UIApplication sharedApplication] openURL:settingURL];
             }
         }else
         {
             NSLog(@"定位關(guān)閉,不可用");
         }
         break;
     }
         // 獲取前后臺定位授權(quán)
     case kCLAuthorizationStatusAuthorizedAlways:
     //  case kCLAuthorizationStatusAuthorized: // 失效,不建議使用
     {
         NSLog(@"獲取前后臺定位授權(quán)");
         break;
     }
         // 獲得前臺定位授權(quán)
     case kCLAuthorizationStatusAuthorizedWhenInUse:
     {
         NSLog(@"獲得前臺定位授權(quán)");
         break;
     }
     default:
         break;
     }
     }
    

4. 測試環(huán)境:

1. XCode版本無要求
2. 模擬器選擇iOS8.0之后的版本

5. 常見問題總結(jié)

1. 定位不到, 對應(yīng)的代理方法不執(zhí)行
    首先,檢查是否請求授權(quán), 并設(shè)置了對應(yīng)的KEY
    其次,檢查模擬器是否設(shè)置位置數(shù)據(jù)
    第三,確保代碼無問題(一般都是代理沒有設(shè)置,或者位置管理器對象是局部變量,亦或是位置管理器對象沒有被強(qiáng)引用)
    第四,絕逼是模擬器BUG, 請重置模擬器(是重置,不是重啟)

三. iOS9.0 定位補(bǔ)充

1. 定位變化

* 前臺定位

    (同iOS8.0之后一致, 無任何變化, 都需要主動請求授權(quán))

* 后臺定位

方案一:
  1. 在前臺定位基礎(chǔ)上, 勾選后臺模式Location updates, 并且設(shè)置以下屬性為YES

     if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0)
      {
          self.locationM.allowsBackgroundLocationUpdates = YES;
      }
    
方案二:
  1. 請求前后臺定位授權(quán),并在info.plist文件中配置KEY ( NSLocationAlwaysUsageDescription )

     [self.locationM requestAlwaysAuthorization];
    

2. 新的API

  1. 單次定位請求;

     代   碼: [self.locationM requestLocation];
     功   能: 獲取一次位置信息
     實(shí)現(xiàn)邏輯: 
         (1) 按照定位精確度從低到高進(jìn)行排序,逐個(gè)進(jìn)行定位.如果在有效時(shí)間內(nèi), 定位到了精確度最好的位置, 那么就把對應(yīng)的位置通過代理告知外界.
         (2) 如果獲取到的位置不是精確度最高的那個(gè),也會在定位超時(shí)后,通過代理告訴外界.
     注意事項(xiàng): 
         (1) 必須實(shí)現(xiàn)代理的-locationManager:didFailWithError:方法
         (2) 不能與startUpdatingLocation方法同時(shí)使用
    

3. 測試環(huán)境:

1. XCode版本要求7.0版本以上
2. 模擬器選擇iOS9.0之后的版本

4. 常見問題總結(jié)

1. 單次定位在模擬器上測試不出效果?
    答: 因?yàn)槟M器的位置是固定的, 所以無法測試出效果, 請使用真機(jī)進(jìn)行測試.

四. CLLocation對象詳解

1. 屬性解釋

    > coordinate    : 當(dāng)前位置所在的經(jīng)緯度數(shù)據(jù)
    > altitude      : 海拔
    > speed         : 當(dāng)前速度
    > course        : 航向(設(shè)備移動的方向, 值域范圍:0.0 ~ 259.9, 正北方向?yàn)?.0)

2. 重要方法

    代碼: - (CLLocationDistance)distanceFromLocation:(CLLocation *)location
    作用: 計(jì)算兩個(gè)位置對象之間的物理距離, 單位是(米)

3. 場景演練

1. 場景演示:打印當(dāng)前用戶的行走方向,偏離角度以及對應(yīng)的行走距離,
    例如:”北偏東30度方向,移動了8米”
2. 實(shí)現(xiàn)步驟: 
    1> 獲取對應(yīng)的方向偏向(例如”正東”,”東偏南”)
    2> 獲取對應(yīng)的偏離角度(并判斷是否是正方向)
    3> 計(jì)算行走距離
    4> 打印信息

4. 注意事項(xiàng)

  1. 使用位置前, 務(wù)必判斷當(dāng)前獲取的位置是否有效

     代碼: if (location.horizontalAccuracy < 0) return;
     功能: 如果水平精確度小于零, 代表雖然可以獲取位置對象, 但是數(shù)據(jù)錯誤, 不可用 
    

* 經(jīng)驗(yàn)小結(jié)


一. 定位的應(yīng)用場景

    1) 導(dǎo)航 
    2) 電商APP,獲取用戶所在城市(需要與(反)地理編碼聯(lián)合使用) 
    3) 數(shù)據(jù)采集用戶信息(例如,統(tǒng)計(jì)app使用分布)
    4) 查找周邊(周邊好友, 周邊商家等等)

二. 開發(fā)經(jīng)驗(yàn)

** 由于定位非常耗電; 所以為了給用戶省電, 你可以遵守以下小經(jīng)驗(yàn) **

    1)不需要獲取用戶位置時(shí),一定要關(guān)閉定位服務(wù):
    2)如果能滿足項(xiàng)目需求,盡可能的使用”監(jiān)聽顯著位置變化”的定位服務(wù)(打車app)
    3)如果可以,盡可能使用低精度的desiredAccuracy
    4)如果是數(shù)據(jù)采集,(一般都是周期性的去輪詢用戶位置),在輪詢期間一定要關(guān)閉定位

五. 指南針效果實(shí)現(xiàn)

1. 實(shí)現(xiàn)思路

  1. 利用"磁力計(jì)"傳感器,獲取設(shè)備朝向
  2. 根據(jù)設(shè)備朝向反向旋轉(zhuǎn)"指南針"圖片

2. 代碼實(shí)現(xiàn)

  1. 獲取設(shè)備朝向

     1) 導(dǎo)入CoreLocation框架以及對應(yīng)的主頭文件
         #import <CoreLocation/CoreLocation.h>
         
     2) 創(chuàng)建CLLocationManager對象并設(shè)置代理
         self.locationM = [[CLLocationManager alloc] init];
         self.locationM.delegate = self;
         
     3) 調(diào)用方法, 開始獲取設(shè)備朝向
         [self.locationM startUpdatingHeading];
         
     4) 在對應(yīng)的代理方法中獲取設(shè)備朝向信息
         -(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
         {
             // 旋轉(zhuǎn)圖片代碼
         }
    
  2. 旋轉(zhuǎn)圖片

     // 1.判斷當(dāng)前的角度是否有效(如果此值小于0,代表角度無效)
     if(newHeading.headingAccuracy < 0)
     return;
    
     // 2.獲取當(dāng)前設(shè)備朝向(磁北方向)
     CGFloat angle = newHeading.magneticHeading;
    
     // 3.轉(zhuǎn)換成為弧度
     CGFloat radian = angle / 180.0 * M_PI;
    
     // 4.帶動畫反向旋轉(zhuǎn)指南針
     [UIView animateWithDuration:0.5 animations:^{
         self.compassView.transform = CGAffineTransformMakeRotation(-radian);
     }];
    

3. 概念補(bǔ)充

    磁北角度: newHeading.magneticHeading   ------- 相對于"磁北方向"產(chǎn)生的角度
    真北角度: newHeading.trueHeading           ------- 相對于"真北方向"產(chǎn)生的角度

4. 注意事項(xiàng)

    1. 獲取設(shè)備朝向前, 先判斷"磁力計(jì)"是否可用
        [CLLocationManager headingAvailable];
        
    2. 獲取朝向前, 判斷當(dāng)前朝向信息是否有效
        if(newHeading.headingAccuracy < 0) return;
        
    3. 注意與"航向"的區(qū)別
        設(shè)備朝向是指手機(jī)的朝向; "航向"可以理解為設(shè)備的移動方向
        
    4. 使用"磁力計(jì)"傳感器獲取設(shè)備朝向, 不需要請求用戶授權(quán)
        因?yàn)樵O(shè)備朝向不涉及用戶隱私

5.測試環(huán)境

    1. XCode版本無要求(建議:XCode7.0不需要開發(fā)者賬號也可以進(jìn)行真機(jī)調(diào)試)
    2. 必須要求真機(jī)設(shè)備(只有真機(jī)設(shè)備才有"磁力計(jì)"傳感器) 

六. 區(qū)域監(jiān)聽

1.概念解釋

    區(qū)   域 :  就是指劃定的一塊地域范圍(比如圓形區(qū)域, 則由區(qū)域中心, 和半徑組成)
    區(qū)域監(jiān)聽 : 是指,我們通過代碼指定一個(gè)區(qū)域, 然后當(dāng)用戶持握設(shè)備進(jìn)入或者離開指定區(qū)域, 我們都能監(jiān)聽到.

2. 監(jiān)聽指定區(qū)域

  1. 導(dǎo)入CoreLocation框架以及對應(yīng)的主頭文件

     #import <CoreLocation/CoreLocation.h>
    
  2. 創(chuàng)建CLLocationManager對象并設(shè)置代理

     self.locationM = [[CLLocationManager alloc] init];
     self.locationM.delegate = self;
    
  3. 請求前后臺定位, 或前臺定位授權(quán), 并在Info.Plist文件中配置相應(yīng)的Key

     [self.locationM requestAlwaysAuthorization];
     // [self.locationM requestWhenInUseAuthorization]; 
    
  4. 創(chuàng)建一個(gè)區(qū)域, 并開始監(jiān)聽

     // 1. 判斷區(qū)域監(jiān)聽服務(wù)是否可用(定位服務(wù)是否關(guān)閉, 定位是否授權(quán), 是否開啟飛行模式)
     if ([CLLocationManager isMonitoringAvailableForClass:[CLCircularRegion class]]) 
     {
    
         // 創(chuàng)建區(qū)域中心
         CLLocationCoordinate2D center = CLLocationCoordinate2DMake(29.12345, 131.23456);
    
         // 創(chuàng)建區(qū)域(指定區(qū)域中心,和區(qū)域半徑)
         CLLocationDistance radius = 1000;
    
         // 判斷區(qū)域半徑是否大于最大監(jiān)聽區(qū)域半徑,如果大于, 就沒法監(jiān)聽
         if (radius > self.locationM.maximumRegionMonitoringDistance) {
             radius = self.locationM.maximumRegionMonitoringDistance;
         }
         CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:radius identifier:@"小碼哥"];
    
         // 開始監(jiān)聽指定區(qū)域
         [self.locationM startMonitoringForRegion:region];
     }
     else
     {
         NSLog(@"區(qū)域監(jiān)聽不可用");
     }
    
  5. 在對應(yīng)的代理方法中監(jiān)聽區(qū)域狀態(tài)

     // 進(jìn)去監(jiān)聽區(qū)域后調(diào)用(調(diào)用一次)
     -(void)locationManager:(nonnull CLLocationManager *)manager didEnterRegion:(nonnull CLRegion *)region
     {
         NSLog(@"進(jìn)入?yún)^(qū)域---%@", region.identifier);
         [manager stopMonitoringForRegion:region];
     }
    
     // 離開監(jiān)聽區(qū)域后調(diào)用(調(diào)用一次)
     -(void)locationManager:(nonnull CLLocationManager *)manager didExitRegion:(nonnull CLRegion *)region
     {
         NSLog(@"離開區(qū)域---%@", region.identifier);
     }
    

3. 獲取某個(gè)區(qū)域的當(dāng)前狀態(tài)

監(jiān)聽某個(gè)區(qū)域時(shí), 只有進(jìn)入或者離開這個(gè)區(qū)域時(shí), 才能回調(diào)對應(yīng)的方法, 是一個(gè)進(jìn)入或者離開的動作
如果想知道某一個(gè)區(qū)域的當(dāng)前狀態(tài)(識別用戶是在區(qū)域內(nèi)部, 還是區(qū)域外部), 則需要使用以下方法

代   碼:
    [self.locationM requestStateForRegion:region];
回調(diào)代理: 
    // 請求某個(gè)區(qū)域狀態(tài)時(shí), 回調(diào)的代理方法
    -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
    switch (state) {
        case CLRegionStateUnknown:
            NSLog(@"未知狀態(tài)");
            break;
        case CLRegionStateInside:
            NSLog(@"在區(qū)域內(nèi)部");
            break;
        case CLRegionStateOutside:
            NSLog(@"在區(qū)域外部");
            break;
        default:
         break;
    }
}

4. 測試環(huán)境

XCode版本無要求
iOS模擬器版本無要求

5. 注意事項(xiàng)

1. 想要做區(qū)域監(jiān)聽, 在iOS8.0之后, 必須請求位置授權(quán)
   代碼: [self.locationM requestAlwaysAuthorization];
   原因: 區(qū)域監(jiān)聽的原理就是獲取用戶的位置, 然后在判斷該位置是否在制定區(qū)域內(nèi), 所以會涉及到用戶隱私(位置), 而在iOS8.0之后, 想要訪問用戶位置信息, 就需要主動請求授權(quán);
  
2. 使用前, 先判斷區(qū)域監(jiān)聽是否可用
   代碼:  [CLLocationManager isMonitoringAvailableForClass:[CLCircularRegion class]]

3. 注意區(qū)域半徑是否大于最大區(qū)域監(jiān)聽半徑(如果大于, 則無法監(jiān)聽成功)
   代碼: radius > self.locationM.maximumRegionMonitoringDistance

6. 常見問題

1. 區(qū)域監(jiān)聽, 測試沒有效果?
   首先, 確定代碼沒有問題, 是否有請求授權(quán);
   其次, 嘗試修改模擬器位置信息, 觸發(fā)進(jìn)入?yún)^(qū)域或離開區(qū)域的動作
   第三, 如果模擬器出現(xiàn)BUG, 定位不到, 也會無法判定當(dāng)前區(qū)域狀態(tài); 所以, 最后可以嘗試重置模擬器.

七. (反)地理編碼

1. 概念解釋

地理編碼:   是指根據(jù)地址關(guān)鍵字, 將其轉(zhuǎn)換成為對應(yīng)的經(jīng)緯度等信息;
發(fā)地理編碼:  是指根據(jù)經(jīng)緯度信息, 將其轉(zhuǎn)換成為對應(yīng)的省市區(qū)街道等信息;

2. 地理編碼

  1. 導(dǎo)入CoreLocation框架以及對應(yīng)的主頭文件

     #import <CoreLocation/CoreLocation.h>
    
  2. 創(chuàng)建CLGeocoder對象

     self.geoC = [[CLGeocoder alloc] init];
    
  3. 根據(jù)地址關(guān)鍵字, 進(jìn)行地理編碼

     // 直接根據(jù)地址進(jìn)行地理編碼(返回結(jié)果可能有多個(gè),因?yàn)橐粋€(gè)地點(diǎn)有重名)
     [self.geoC geocodeAddressString:@"廣州" completionHandler:^(NSArray<CLPlacemark *> * __nullable placemarks, NSError * __nullable error) 
     {
         // 包含區(qū),街道等信息的地標(biāo)對象
         CLPlacemark *placemark = [placemarks firstObject];
         // 城市名稱
         NSString *city = placemark.locality;
         // 街道名稱
         NSString *street = placemark.thoroughfare;
         // 全稱
         NSString *name = placemark.name;
     }]; 
    

3. 反地理編碼

  1. 導(dǎo)入CoreLocation框架以及對應(yīng)的主頭文件

     #import <CoreLocation/CoreLocation.h>
    
  2. 創(chuàng)建CLGeocoder對象

     self.geoC = [[CLGeocoder alloc] init];
    
  3. 根據(jù)經(jīng)緯度信息, 進(jìn)行反地理編碼

     // 根據(jù)經(jīng)緯度信息進(jìn)行反地理編碼
     [self.geoC reverseGeocodeLocation:[[CLLocation alloc] initWithLatitude:21.123 longitude:123.345] completionHandler:^(NSArray<CLPlacemark *> * __nullable placemarks, NSError * __nullable error) 
     {
         // 包含區(qū),街道等信息的地標(biāo)對象
         CLPlacemark *placemark = [placemarks firstObject];
         // 城市名稱
         NSString *city = placemark.locality;
         // 街道名稱
         NSString *street = placemark.thoroughfare;
         // 全稱
         NSString *name = placemark.name;
     }]; 
    

4. CLPlacemark 地標(biāo)對象詳解

    location            : CLLocation 類型, 位置對象信息, 里面包含經(jīng)緯度, 海拔等等
    region              : CLRegion 類型, 地標(biāo)對象對應(yīng)的區(qū)域
    addressDictionary  : NSDictionary 類型, 存放街道,省市等信息
    name                : NSString 類型, 地址全稱
    thoroughfare        : NSString 類型, 街道名稱
    locality            : NSString 類型, 城市名稱
    administrativeArea : NSString 類型, 省名稱
    country             : NSString 類型, 國家名稱

5. 測試環(huán)境

*   必須聯(lián)網(wǎng)
    XCode版本不限
    iOS模擬器系統(tǒng)版本不限

6. 常見問題

1. 測試無數(shù)據(jù)?
   首先, 檢查是否有聯(lián)網(wǎng);
   其次, 如果是反地理編碼,可嘗試更換經(jīng)緯度再次嘗試, 有的經(jīng)緯度沒有對應(yīng)信息

7. 應(yīng)用場景

1. 一般與定位結(jié)合使用, 確定當(dāng)前位置的具體地理信息

八. 使用第三方框架進(jìn)行定位(??)

1. 主要原因

    因?yàn)槭褂肅oreLocation框架進(jìn)行獲取用戶位置信息, 是通過代理進(jìn)行回調(diào); 而第三方框架將"代理模擬"轉(zhuǎn)換成為"block模式"; 使用起來比較方便, 而且額外增加了超時(shí)時(shí)間等功能.

2. 框架信息

    名稱: locationManager
    地址: [link](https://github.com/intuit/LocationManager)

3. 使用方法

    參照該框架對應(yīng)的 readME

4. 注意事項(xiàng)

    一般集成第三方框架到項(xiàng)目中, 請先確保該框架沒有問題, 然后再向項(xiàng)目中集成

九. 補(bǔ)充

  1. 代理模式到block模式的轉(zhuǎn)換

     主要思想就是,先記錄下外界傳遞過來的block, 然后在對應(yīng)的代理方法里面執(zhí)行這個(gè)block;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,720評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內(nèi)容

  • CoreLocation框架 一. iOS8.0之前的定位(?????) 1. 前臺定位 導(dǎo)入CoreLocati...
    Jack__yang閱讀 223評論 0 4
  • CoreLocation框架 一. iOS8.0之前的定位(?????) 1. 前臺定位 導(dǎo)入CoreLocati...
    0271fb6f797c閱讀 533評論 0 1
  • 一. iOS8.0之前的定位(?????) 1. 前臺定位 導(dǎo)入CoreLocation框架以及對應(yīng)的主頭文件 #...
    走道牙的人閱讀 238評論 0 0
  • 還是因?yàn)槁眯械腖V后感: 旅途上的行走本身可能并沒有特別大的意義,而是在旅行過程中,身體里被激發(fā)出來的對于這個(gè)世界...
    miyocat閱讀 180評論 0 0
  • ?我喜歡成熟的男生 ,大概是因?yàn)楦忻八軒胰メt(yī)院照顧我 ,肚子餓他能二話不說帶我去吃飯 。他能給我十足的安全感 ...
    姜牧之5373閱讀 196評論 0 0