iOS核心筆記—CoreLocation架構-基礎

來源:互聯網
上載者:User

標籤:篩選   定位失敗   通過   nal   屬性   ack   邏輯操作   停止   開發   

1、CoreLocation架構簡介:

?瞭解:在iOS開發中,要想使用地圖和定位功能,必須基於2個架構進行開發。CoreLocation架構:主要用於地理定位;MapKit架構:主要用於地圖展示。

1-1、CoreLocation架構功能:
功能 作用
地理定位 定位使用者所在位置,擷取對應的經緯度、海拔等位置資訊
地區監聽 事先在APP內部通過代碼指定一個地區,當使用者進入、或離開該地區的時候,可以通過對應的代理方法監聽到使用者的位置
地理編碼 將詳細的位置資訊轉換為對應的經緯度,即:位置資訊 ——> 經緯度
反地理編碼 將經緯度轉換為詳細的位置,即:經緯度 ——> 位置資訊

?重要:CoreLocation架構著重於功能的實現,只有開發人員可以擷取到對應的資料,使用者是看不見、摸不著的;CoreLocation架構中所有的資料類型的首碼都是CL開頭。

1-2、兩個熱門術語:
名稱 含義
LBS Location Based Service,基於位置的服務
SoLoMo Social Local Mobile(索羅門),社交、本地、移動
社交化 在APP裡面假如一些社交元素
本地化 基於LBS的周邊搜尋,周邊簽到等服務
移動化 移動網:3G/4G網,相對於有線/無線電腦網路;移動APP:相對於PC端應用
1-3、CoreLocation架構使用主要步驟:
步驟 具體資訊
第一步 匯入CoreLocation架構,Xcode5.0之後該步驟可以省略
第二步 匯入主標頭檔,#import <CoreLocation/CoreLocation.h>
第三步 使用CLLocationManager對象調用相關方法(startUpdatingLocation —> 開啟定位、stopUpdatingLocation —> 停止定位),開啟定位功能,實現相關的位置服務
第四步 給CLLocationManager對象設定delegate
第五步 實現相應的代理方法,監聽相關位置資訊變化

?注意:只有使用了該架構裡的某個類建立了一個對象,才會隱式的將該架構匯入到項目中。

2、 iOS8.0之前 - - - 定位功能:

1、?重要iOS8.0之前,實現定位功能不需要向使用者請求授權。

2、?瞭解iOS8.0之前,版本即將被淘汰,不再做適配;而且iOS8.0以後的定位功能實現的代碼可以直接運行在iOS8.0之前的裝置上,不需要做任何修改;因為系統版本和Xcode版本問題,此處不再過於詳細介紹iOS8.0之前的定位功能;只是列舉大致實現步驟,詳細步驟可以參閱iOS8.0之後的定為實現。

3、?瞭解iOS8.0之前,當應用程式使用後台定位功能時,螢幕上方是否會出現藍色橫幅未做驗證

2-1、 iOS8.0之前 - - - 前台定位:2-1-1、 詳細步驟
步驟 詳情
第一步 info.plist檔案中配置Privacy - Location Usage Description來說明定位目的
第二步 匯入CoreLocation架構及對應的主標頭檔
第三步 建立CLLocationManager對象並設定代理(delegate
第四步 調用startUpdatingLocation方法,開始更新使用者的位置資訊
第五步 在對應的代理方法中擷取位置資訊,locationManager:didUpdateLocations:代理方法一旦開始定位之後,將會每隔一秒鐘自動調用;調用十分頻繁,非常耗電
2-1-2、細節補充:1、匯入CoreLocation架構以及對應的主標頭檔。
1.  #import <CoreLocation/CoreLocation.h>
2、代理方法中無法定位原因:

?重要:①、CLLocationManager對象為局部變數;②、沒有調用相應的方法開啟定位功能;③、模擬器出現問題;④、其它未知原因導致。

2-2、 iOS8.0之前 - - - 後台定位:2-1、詳細步驟:
步驟 詳情
第一步 info.plist檔案中配置Privacy - Location Usage Description來說明定位目的
第二步 開啟後台模式: ①、選中工程-> 前往target -> capabilities -> Background Modes -> 勾選location updates;②、直接在info.plist檔案中增加Required background modes的key,該key為一個數組,在該數組中增加App registers for location updates的值
第三步 匯入CoreLocation架構及對應的主標頭檔
第四步 建立CLLocationManager對象並設定代理(delegate
第五步 調用startUpdatingLocation方法,開始更新使用者的位置資訊
第六步 在對應的代理方法中擷取位置資訊,locationManager:didUpdateLocations:代理方法一旦開始定位之後,將會每隔一秒鐘自動調用;調用十分頻繁,非常耗電
2-2、開啟後台模式兩種方式:

?重要:其實,兩種開啟後台模式的方式,本質都是操作info.plist檔案。

  • ①、選中工程-> 前往target -> capabilities -> Background Modes -> 勾選location updates
  • ②、配置info.plist檔案:
    ?瞭解:其實,兩種開啟後台模式的方式,本質都是操作info.plist檔案。
2-3、細節補充:

?瞭解:①、需要使用Xcode7.0之前的版本,模擬器應選擇iOS8.0之前的版本;②、iOS8.0之前後台定位,當應用退出到後台時,在螢幕上方應該會出現藍色橫幅(未驗證,不過查閱大量資糧都未說明會有藍色橫幅)。

2-4、常見問題:

?注意:如果定位不到,對應的代理方法不執行;4中解決方案:①、檢查模擬器是否為iOS8.0之前的系統版本,一定要使用iOS8.0之前的模擬器;②、檢查模擬器是否有設定資料;③、檢查代碼是否存在邏輯錯誤、是否有設定代理、位置管理對象是否為局部變數;④、模擬器問題,請先將模擬器位置設為None,然後再次設定資料;或者,重設模擬器。

2-5、範例程式碼:
1.#import "ViewController.h"
2.#import <CoreLocation/CoreLocation.h>
3.
[email protected] ViewController ()<CLLocationManagerDelegate>
5.
6./** 位置管理者 */
[email protected] (nonatomic, strong) CLLocationManager *lM;
8.
[email protected]
10.
[email protected] ViewController
12.
13.#pragma mark - 懶載入
14.- (CLLocationManager *)lM
15.{
16. if (!_lM) {
17. // 1. 建立位置管理者
18. _lM = [[CLLocationManager alloc] init];
19. // 1.1 代理, 通知, block
20. _lM.delegate = self;
21.
22. // 距離篩選器: 每隔多米定位一次
23. _lM.distanceFilter = 100;
24.
25. // 精確度越高, 越耗電, 定位時間越長
26. _lM.desiredAccuracy = kCLLocationAccuracyBest;
27. }
28. return _lM;
29.}
30.
31.- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
32.{
33. // 2. 使用位置管理者,開始更新使用者位置
34. // 預設只能在前台擷取使用者位置,
35. // 勾選後台模式 location updates
36. [self.lM startUpdatingLocation];
37.}
38.
39.#pragma mark - CLLocationManagerDelegate
40./**
41. * 更新到位置之後調用
42. *
43. * @param manager 位置管理者
44. * @param locations 位置數組
45. */
46.-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
47.{
48. NSLog(@"定位到了");
49.
50. // 拿到位置,做一些商務邏輯操作
51.
52. // 停止更新
53. [manager stopUpdatingLocation];
54.}
[email protected]
3、 iOS8.0 ~ iOS9.0 - - - 定位功能:3-1、 iOS8.0 ~ iOS9.0 - - - 前台定位:1、 詳細步驟
步驟 詳情
第一步 info.plist檔案中配置key為NSLocationWhenInUseUsageDescription的索引值對、並調用CLLocationManager對象的requestWhenInUseAuthorization方法請求使用者授權
第二步 匯入CoreLocation架構及對應的主標頭檔
第三步 建立CLLocationManager對象並設定代理(delegate
第四步 調用startUpdatingLocation方法,開始更新使用者的位置資訊
第五步 在對應的代理方法中擷取位置資訊,locationManager:didUpdateLocations:代理方法一旦開始定位之後,將會每隔一秒鐘自動調用;調用十分頻繁,非常耗電,在該代理方法中執行相應的邏輯操作
2、細節補充:

?重要:①、從iOS8.0開始,應用開啟定位功能需要主動請求前台定位授權;除了使用CLLocationManager對象調用requestWhenInUseAuthorization方法之外,還需要在info.plist檔案中配置NSLocationWhenInUseUsageDescription的key(注意:千萬不要出現空格),其value用以向使用者說明應用程式使用定位功能主要用途(注意:value可以為空白);如果沒有配置該索引值對,將不會彈框擷取使用者授權。②、需要注意版本適配問題,模擬器運行環境應當為iOS8.0之後,包括iOS8.0

3、範例程式碼:
1.#import "ViewController.h"
2.#import <CoreLocation/CoreLocation.h>
3.
[email protected] ViewController () <CLLocationManagerDelegate>
5./** 定位管理者 */
[email protected] (strong, nonatomic) CLLocationManager *mgr;
7.
[email protected]
9.
[email protected] ViewController
11.
12.- (void)viewDidLoad {
13. [super viewDidLoad];
14.
15. // 1. 建立定位管理者對象, 建立對象調用init方法初始化時, 如無特殊操作; 可以使用new方法代替
16. self.mgr = [CLLocationManager new];
17.
18. // 2. 請求使用者授權, 必須在info.plist檔案配置索引值對
19. // NSLocationWhenInUseUsageDescription : 前台定位授權
20. // requestWhenInUseAuthorization : 前台授權 ,使用應用時授權擷取位置資訊
21. // NSLocationAlwaysUsageDescription : 前後台授權
22. // requestAlwaysAuthorization : 前後台授權, 總是授權擷取位置資訊
23. if ([self.mgr respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
24. [self.mgr requestWhenInUseAuthorization];
25. }
26.
27. // 3. 設定代理對象
28. self.mgr.delegate = self;
29.
30. // 4. 開啟定位功能
31. [self.mgr startUpdatingLocation];
32.}
33.
34.#pragma mark - <CLLocationManagerDelegate>
35./**
36. 第一次成功擷取使用者位置時便會來到此代理方法, 之後每隔一秒鐘調用一次; 調用十分頻繁
37.
38. @param manager 定位管理者對象
39. @param locations 使用者所有位置對象(數組中每一個元素代表一個位置)
40. */
41.- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
42.{
43. NSLog(@"%@", locations);
44.
45. // 1. 停止定位
46. [self.mgr stopUpdatingLocation];
47.}
[email protected]
3-2、 iOS8.0 ~ iOS9.0 - - - 後台定位:3-2-1、前台授權 + 開啟後台模式:

?重要:①、一定要記得開啟後台模式,否則,當應用程式退到後台模式時將不能進行定位操作;②、當APP退到後台,在螢幕上方會出現藍色橫幅,已提醒使用者應用程式正在使用定位功能。

1、 詳細步驟
步驟 詳情
第一步 info.plist檔案中配置key為NSLocationWhenInUseUsageDescription的索引值對、並調用CLLocationManager對象的requestWhenInUseAuthorization方法請求使用者授權
第二步 開啟後台模式: ①、選中工程-> 前往target -> capabilities -> Background Modes -> 勾選location updates;②、直接在info.plist檔案中增加Required background modes的key,該key為一個數組,在該數組中增加App registers for location updates的值
第三步 匯入CoreLocation架構及對應的主標頭檔
第四步 建立CLLocationManager對象並設定代理(delegate
第五步 調用startUpdatingLocation方法,開始更新使用者的位置資訊
第六步 在對應的代理方法中擷取位置資訊,locationManager:didUpdateLocations:代理方法一旦開始定位之後,將會每隔一秒鐘自動調用;調用十分頻繁,非常耗電,在該代理方法中執行相應的邏輯操作
2、開啟後台模式兩種方式:

?重要:其實,兩種開啟後台模式的方式,本質都是操作info.plist檔案。

    • ①、選中工程-> 前往target -> capabilities -> Background Modes -> 勾選location updates
 
  • ②、配置info.plist檔案:
3、範例程式碼:

?重要:與前台定位的範例程式碼一致,只是,應用程式開啟後台模式,能夠在後台擷取使用者的位置資訊;並在代理方法中執行相應的邏輯操作。

3-2-2、前後台授權:

?重要:①、iOS8.0之後應用程式使用後台定位功能,前後台授權層級高於前台授權層級;當同時使用兩種授權方式時會有兩次彈框提醒。②、使用前後台授權,無論應用程式是否開啟後台模式;應用程式退到後台都能擷取位置資訊。③、使用前後台授權,當應用退到後台,在螢幕上方不會出現藍色橫幅

1、 詳細步驟
步驟 詳情
第一步 info.plist檔案中配置key為NSLocationAlwaysUsageDescription的索引值對、並調用CLLocationManager對象的requestAlwaysAuthorization方法請求使用者授權
第二步 匯入CoreLocation架構及對應的主標頭檔
第三步 建立CLLocationManager對象並設定代理(delegate
第四步 調用startUpdatingLocation方法,開始更新使用者的位置資訊
第五步 在對應的代理方法中擷取位置資訊,locationManager:didUpdateLocations:代理方法一旦開始定位之後,將會每隔一秒鐘自動調用;調用十分頻繁,非常耗電,在該代理方法中執行相應的邏輯操作
2、細節補充:

?重要:①、注意,在實際應用開發中可能需要版本適配;②、不要忘記配置info.plist檔案,否則,將不會出現彈框擷取使用者授權。

4、 iOS9.0之後 - - - 定位功能:

?瞭解iOS9.0使用前台授權 + 開啟後台模式實現後台定位功能有所改變,增加了新的步驟;需要設定CLLocationManager對象的allowsBackgroundLocationUpdates屬性,代理對象還必須實現locationManager:didFailWithError:代理方法,以達到監聽定位失敗的錯誤資訊。

4-1、 iOS9.0之後 - - - 前台定位:

?瞭解:與iOS8.0 ~ iOS9.0前台定位實現步驟一致,並無任何新增變化;一定要注意使用前台定位功能需要擷取使用者授權,注意:需要配置info.plist檔案,否則,將不會出現彈框提醒使用者、擷取使用者授權。

4-2、 iOS9.0之後 - - - 後台定位:4-2-1、 前台授權 + 開啟後台模式:1、 前台授權 + 開啟後台模式

?重要:在前台定位授權的基礎上,如果勾選了後台模式location updates之後,還需要額外設定屬性allowsBackgroundLocationUpdates = YES;代理對象還必須實現locationManager:didFailWithError:代理方法,以達到監聽定位失敗的錯誤資訊。使用allowsBackgroundLocationUpdates屬性注意需要做版本適配,該屬性為iOS9.0 ~

2、範例程式碼:
1.// 5. 擷取後台臨時定位授權, 記得開啟後台定位元模式, 否則, 程式將會崩潰
2.if ([UIDevice currentDevice].systemVersion.doubleValue >= 9.0) {
3. self.mgr.allowsBackgroundLocationUpdates = YES;
4.}
3、必須實現的代理方法:
1./**
2. 定位失敗調用該代理方法
3.
4. @param manager 定位管理者對象
5. @param error 錯誤對象
6. */
7.- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
8. if (error != nil) {
9. NSLog(@"%@", error);
10. }
11.}

?重要:沒有實現該代理方法,程式將會崩潰。

4-2-2、 前後台授權

?重要:直接請求前後台定位授權,和iOS8.0 ~ iOS9.0之後一致;沒有任何變化。注意:只能運行在iOS9.0之後的裝置上,一定要注意版本適配。

iOS核心筆記—CoreLocation架構-基礎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.