【iOS】7.4 定位服務->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位

本文並不是最終版本,若是想要關注更新或更正的內容請關注文集,聯繫方式詳見文末,若有疏忽和遺漏,歡迎指正。ios


本文相關目錄:
================== 所屬文集:【iOS】07 設備工具 ==================
7.4 定位服務->1.0 簡介
7.4 定位服務->2.1.1 定位 - 官方框架CoreLocation: 請求用戶受權
7.4 定位服務->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager位置管理器
7.4 定位服務->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
7.4 定位服務->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理編碼和反地理編碼
7.4 定位服務->2.1.3.3 定位 - 官方框架CoreLocation 功能3:區域監聽
7.4 定位服務->2.1.4 定位 - 官方框架CoreLocation 案例:指南針效果
7.4 定位服務->2.2 定位 - locationManager框架
7.4 定位服務->3.1 地圖框架MapKit 功能1:地圖展現
7.4 定位服務->3.2 地圖框架MapKit 功能2:路線規劃(導航)
7.4 定位服務->3.3 地圖框架MapKit 功能3:3D視圖
7.4 定位服務->3.4 地圖框架MapKit 功能4:地圖截圖
7.4 定位服務->3.5 地圖框架MapKit 功能5:POI檢索
================== 所屬文集:【iOS】07 設備工具 ==================git


定位目錄:

官方框架CoreLocation目錄:

定位的功能實現:


地理定位的步驟:


詳細討論下步驟5

iOS 8.0- 的定位

勾選後臺模式,圖解:
github

代碼2:

編譯環境:Xcode 8.0
模擬器版本:iOS 10
Swift版本:3.0swift

info.plist 文件配置.png

【OC語言】
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>   // 代理
@property(nonatomic, strong) CLLocationManager *locationM; // 位置管理者
@end

@implementation ViewController

#pragma mark - 懶加載對象,並在懶加載方法中進行部分初始化操做
- (CLLocationManager *)locationM {
    if (!_locationM) {
        // 1. 建立位置管理者
        _locationM = [[CLLocationManager alloc] init];
        
        // 2. 設置代理, 接收位置數據(其餘方式:block、通知)
        _locationM.delegate = self;
        
        // 3.前臺定位,後臺定位(在info.plist文件中配置對應的key)
        
        // 4. 設置定位的過濾距離(單位:米), 表示用戶位置移動了x米時調用對應的代理方法
        _locationM.distanceFilter = 500; //在用戶位置改變500米時調用一次代理方法
        
        // 5. 設置定位的精確度 (單位:米),(定位精確度越高, 越耗電, 定位的速度越慢)
        _locationM.desiredAccuracy = kCLLocationAccuracyBest;
    }
    return _locationM;
}

#pragma mark - 點擊屏幕,開始更新用戶位置
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    // 判判定位服務是否開啓
    if ([CLLocationManager locationServicesEnabled]) {
        NSLog(@"已經開啓定位服務,即將開始定位...");
        
#pragma mark - 開始定位
        [self.locationM startUpdatingLocation];
    } else {
        NSLog(@"沒有開啓定位服務");
    }
}

#pragma mark - 代理方法:當位置管理器獲取到用戶位置後,就會調用此方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    
    NSLog(@"位置信息:%@", locations);
    
    // 中止定位(代理方法一直調用,會很是耗電,除非特殊需求,如導航)
    [manager stopUpdatingLocation];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
【Swift語言】
import UIKit
import CoreLocation

class ViewController: UIViewController {
    
    // 懶加載
    lazy var locationM : CLLocationManager = {
        
        // 1. 建立位置管理者
        let locationM : CLLocationManager = CLLocationManager()
        
        // 2. 設置代理, 接收位置數據(其餘方式:block、通知)
        locationM.delegate = self
        
        // 3.前臺定位,後臺定位(在info.plist文件中配置對應的key)
        
        // 4. 設置過濾距離
        // 若是當前位置, 距離上一次的位置之間的物理距離大於如下數值時, 就會經過代理, 將當前位置告訴外界
        locationM.distanceFilter = 100   // 每隔100 米定位一次
        
        // 5. 設置定位的精確度(定位精確度越高, 越耗電, 定位的速度越慢)
        locationM.desiredAccuracy = kCLLocationAccuracyBest
        
        return locationM
    }()
    
    // 點擊屏幕,開始更新用戶位置
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        locationM.startUpdatingLocation()
    }
}

// 類擴展(CLLocationManager的代理方法)
extension ViewController: CLLocationManagerDelegate {
        
    // 代理方法:當位置管理器,獲取到位置後,就會調用此方法
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print("獲取到位置")
        
        // 只想獲取一次用戶位置信息,那麼在獲取到位置信息以後,中止更新用戶的位置信息
        // 應用場景: 獲取用戶所在城市
        manager.stopUpdatingLocation()
    }
}

iOS 8.0+ 的定位

代碼3:

編譯環境:Xcode 8.0
模擬器版本:iOS 10
Swift版本:3.0微信

這裏只貼主要代碼,其他和代碼2相同,詳見文末 github 地址框架

info.plist 文件配置

【OC語言】
#pragma mark - 懶加載對象,並在懶加載方法中進行部分初始化操做
- (CLLocationManager *)locationM {
    if (!_locationM) {
        // 1. 建立位置管理者
        _locationM = [[CLLocationManager alloc] init];
        
        // 2. 設置代理, 接收位置數據(其餘方式:block、通知)
        _locationM.delegate = self;
        
        // 3.定位(在info.plist文件中配置對應的key)
        
        // 若是兩個受權都請求,那麼先執行前面那個請求彈框,後面那個請求受權 有可能 下次被調用時,纔會起做用
        // 若是,先請求的是「先後臺受權」,那「前臺受權」即便被調用,也不會有反應(由於「先後臺受權」權限大於「前臺受權」)
        // 反之,若是先請求的是「前臺受權」,並且用戶選中的是「容許」,那下次被調用時「先後臺受權」會作出請求,但只請求一次
        
        // 本質:1. 兩個受權同時請求,先執行前面那個受權請求
        //      2. 「先後臺請求受權」方法,在(當前的受權狀態 == 用戶未選擇狀態 or 前臺受權狀態) 纔會起做用
        //      3. 「前臺請求受權」方法,在(當前的受權狀態 == 用戶未選擇狀態) 纔會起做用
        
        // 判斷系統版本,作適配
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            // 前臺定位
            // 配合後臺模式,屏幕上方會出現一個藍色的橫幅, 不斷提醒用戶, 當前APP 正在使用你的位置
            [_locationM requestWhenInUseAuthorization];
            
            // 先後臺定位
            // 不管是否勾選後臺模式, 均可以獲取位置信息. 並且不管先後臺, 都不會出現藍條
            // [_locationM requestAlwaysAuthorization];
        }
        
        // 4. 設置定位的過濾距離(單位:米), 表示用戶位置移動了x米時調用對應的代理方法
        _locationM.distanceFilter = 500; //在用戶位置改變500米時調用一次代理方法
        
        // 5. 設置定位的精確度 (單位:米),(定位精確度越高, 越耗電, 定位的速度越慢)
        _locationM.desiredAccuracy = kCLLocationAccuracyBest;
    }
    return _locationM;
}
【Swift語言】
    // 懶加載
    lazy var locationM : CLLocationManager = {
        
        // 1. 建立位置管理者
        let locationM : CLLocationManager = CLLocationManager()
        
        // 2. 設置代理, 接收位置數據(其餘方式:block、通知)
        locationM.delegate = self
        
        // 3.定位(在info.plist文件中配置對應的key)
        
        // 若是兩個受權都請求,那麼先執行前面那個請求彈框,後面那個請求受權 有可能 下次被調用時,纔會起做用
        // 若是,先請求的是「先後臺受權」,那「前臺受權」即便被調用,也不會有反應(由於「先後臺受權」權限大於「前臺受權」)
        // 反之,若是先請求的是「前臺受權」,並且用戶選中的是「容許」,那下次被調用時「先後臺受權」會作出請求,但只請求一次
        
        // 本質:1. 兩個受權同時請求,先執行前面那個受權請求
        //      2. 「先後臺請求受權」方法,在(當前的受權狀態 == 用戶未選擇狀態 or 前臺受權狀態) 纔會起做用
        //      3. 「前臺請求受權」方法,在(當前的受權狀態 == 用戶未選擇狀態) 纔會起做用
        
        // 判斷系統版本,作適配
        if (Float(UIDevice.current.systemVersion)! >= 8.0){
            // 前臺定位
            // 配合後臺模式,屏幕上方會出現一個藍色的橫幅, 不斷提醒用戶, 當前APP 正在使用你的位置
            locationM.requestWhenInUseAuthorization()
            
            // 先後臺定位
            // 不管是否勾選後臺模式, 均可以獲取位置信息. 並且不管先後臺, 都不會出現藍條
            // locationM.requestAlwaysAuthorization()
        }
        
        // 4. 設置過濾距離
        // 若是當前位置, 距離上一次的位置之間的物理距離大於如下數值時, 就會經過代理, 將當前位置告訴外界
        locationM.distanceFilter = 100   // 每隔100 米定位一次
        
        // 5. 設置定位的精確度(定位精確度越高, 越耗電, 定位的速度越慢)
        locationM.desiredAccuracy = kCLLocationAccuracyBest
        
        return locationM
    }()

iOS 9.0+ 的定位

代碼4:

編譯環境:Xcode 8.0
模擬器版本:iOS 10
Swift版本:3.0ide

這裏只貼主要代碼,其他和代碼2相同,詳見文末 github 地址工具

info.plist 文件配置

【OC語言】
#pragma mark - 懶加載對象,並在懶加載方法中進行部分初始化操做
- (CLLocationManager *)locationM {
    if (!_locationM) {
        // 1. 建立位置管理者
        _locationM = [[CLLocationManager alloc] init];
        
        // 2. 設置代理, 接收位置數據(其餘方式:block、通知)
        _locationM.delegate = self;
        
        // 3.定位(在info.plist文件中配置對應的key)
        
        // 若是兩個受權都請求,那麼先執行前面那個請求彈框,後面那個請求受權 有可能 下次被調用時,纔會起做用
        // 若是,先請求的是「先後臺受權」,那「前臺受權」即便被調用,也不會有反應(由於「先後臺受權」權限大於「前臺受權」)
        // 反之,若是先請求的是「前臺受權」,並且用戶選中的是「容許」,那下次被調用時「先後臺受權」會作出請求,但只請求一次
        
        // 本質:1. 兩個受權同時請求,先執行前面那個受權請求
        //      2. 「先後臺請求受權」方法,在(當前的受權狀態 == 用戶未選擇狀態 or 前臺受權狀態) 纔會起做用
        //      3. 「前臺請求受權」方法,在(當前的受權狀態 == 用戶未選擇狀態) 纔會起做用
        
        // 判斷系統版本,作適配
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            // 前臺定位
            // 配合後臺模式,屏幕上方會出現一個藍色的橫幅, 不斷提醒用戶, 當前APP 正在使用你的位置
            [_locationM requestWhenInUseAuthorization];
            
            // 先後臺定位
            // 不管是否勾選後臺模式, 均可以獲取位置信息. 並且不管先後臺, 都不會出現藍條
            // [_locationM requestAlwaysAuthorization];
            
            // 若是是iOS9.0以後, 當前受權狀態是前臺定位受權狀態, 也想在後臺獲取用戶的位置信息,那麼須要知足如下條件
            // 1. 勾選後臺模式   2. 設置如下屬性爲YES(Swift, 裏面是true)
            if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
                _locationM.allowsBackgroundLocationUpdates = YES;
            }
        }
        
        // 4. 設置定位的過濾距離(單位:米), 表示用戶位置移動了x米時調用對應的代理方法
        _locationM.distanceFilter = 500; //在用戶位置改變500米時調用一次代理方法
        
        // 5. 設置定位的精確度 (單位:米),(定位精確度越高, 越耗電, 定位的速度越慢)
        _locationM.desiredAccuracy = kCLLocationAccuracyBest;
    }
    return _locationM;
}
【Swift語言】
    // 懶加載
    lazy var locationM : CLLocationManager = {
        
        // 1. 建立位置管理者
        let locationM : CLLocationManager = CLLocationManager()
        
        // 2. 設置代理, 接收位置數據(其餘方式:block、通知)
        locationM.delegate = self
        
        // 3.定位(在info.plist文件中配置對應的key)
        
        // 若是兩個受權都請求,那麼先執行前面那個請求彈框,後面那個請求受權 有可能 下次被調用時,纔會起做用
        // 若是,先請求的是「先後臺受權」,那「前臺受權」即便被調用,也不會有反應(由於「先後臺受權」權限大於「前臺受權」)
        // 反之,若是先請求的是「前臺受權」,並且用戶選中的是「容許」,那下次被調用時「先後臺受權」會作出請求,但只請求一次
        
        // 本質:1. 兩個受權同時請求,先執行前面那個受權請求
        //      2. 「先後臺請求受權」方法,在(當前的受權狀態 == 用戶未選擇狀態 or 前臺受權狀態) 纔會起做用
        //      3. 「前臺請求受權」方法,在(當前的受權狀態 == 用戶未選擇狀態) 纔會起做用
        
        // 判斷系統版本,作適配
        if (Float(UIDevice.current.systemVersion)! >= 8.0){
        
            // 前臺定位
            // 配合後臺模式,屏幕上方會出現一個藍色的橫幅, 不斷提醒用戶, 當前APP 正在使用你的位置
            locationM.requestWhenInUseAuthorization()
            
            // 先後臺定位
            // 不管是否勾選後臺模式, 均可以獲取位置信息. 並且不管先後臺, 都不會出現藍條
            // locationM.requestAlwaysAuthorization()
            
            // 若是是iOS9.0以後, 當前受權狀態是前臺定位受權狀態, 也想在後臺獲取用戶的位置信息,那麼須要知足如下條件
            // 1. 勾選後臺模式   2. 設置如下屬性爲true(OC, 裏面是YES)
            if (Float(UIDevice.current.systemVersion)! >= 9.0){
                locationM.allowsBackgroundLocationUpdates = true
            }
        }
        
        // 4. 設置過濾距離
        // 若是當前位置, 距離上一次的位置之間的物理距離大於如下數值時, 就會經過代理, 將當前位置告訴外界
        locationM.distanceFilter = 100   // 每隔100 米定位一次
        
        // 5. 設置定位的精確度(定位精確度越高, 越耗電, 定位的速度越慢)
        locationM.desiredAccuracy = kCLLocationAccuracyBest
        
        return locationM
    }()

【區別】前臺定位 &先後臺定位



本文源碼 Demo 詳見 Github
https://github.com/shorfng/iOS_7.0_Device-Tools網站


做者:藍田(Loto)
【做品發佈平臺】

簡書
博客園
Gitbook(若是以爲文章太長,請閱讀此平臺發佈的文章)編碼

【代碼託管平臺】

Github

【若有疑問,請經過如下方式交流】

評論區回覆
發送郵件shorfng@126.com


本文版權歸做者和本網站共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,謝謝合做。


若是以爲個人文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創做!
  • 支付寶掃一掃 向我打賞

  • 你也能夠微信 向我打賞

相關文章
相關標籤/搜索