你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 講授iOS開辟中根本的定位功效完成

講授iOS開辟中根本的定位功效完成

編輯:IOS開發綜合

1、簡略解釋
 

1.CLLocationManager
 
CLLocationManager的經常使用操作和屬性
 
開端用戶定位- (void)startUpdatingLocation;
 
停滯用戶定位- (void) stopUpdatingLocation;
 
解釋:當挪用了startUpdatingLocation辦法後,就開端赓續地定位用戶的地位,半途會頻仍地挪用署理的上面辦法

  - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

每隔若干米定位一次

  @property(assign, nonatomic) CLLocationDistance distanceFilter;

定位准確度(越准確就越耗電)

  @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

 
 
2.CLLocation
 
CLLocation用來表現某個地位的地輿信息,好比經緯度、海拔等等
 
(1)經緯度

  @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

(2)海拔

  @property(readonly, nonatomic) CLLocationDistance altitude;

(3)道路,航向(取值規模是0.0° ~ 359.9°,0.0°代表真南方向)

  @property(readonly, nonatomic) CLLocationDirection course;

(4)行走速度(單元是m/s)

   @property(readonly, nonatomic) CLLocationSpeed speed;

(5)盤算2個地位之間的間隔

  - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location辦法

 
 
3.CLLocationCoordinate2D
 
CLLocationCoordinate2D是一個用來表現經緯度的構造體,界說以下

typedef struct {
 
        CLLocationDegrees latitude; // 緯度
 
        CLLocationDegrees longitude; // 經度
 
} CLLocationCoordinate2D;

普通用CLLocationCoordinate2DMake函數來創立CLLocationCoordinate2D
 
 
 
2、代碼示例

//
//  YYViewController.m
//  18-定位辦事
//
//  Created by apple on 14-8-9.
//  Copyright (c) 2014年 yangyong. All rights reserved.
//

#import "YYViewController.h"
#import <CoreLocation/CoreLocation.h>

//須要遵照CLLocationManagerDelegate協定
@interface YYViewController ()<CLLocationManagerDelegate>
@property(nonatomic,strong)CLLocationManager *locMgr;
@end

@implementation YYViewController
#pragma mark-懶加載
-(CLLocationManager *)locMgr
{
    if (_locMgr==nil) {
        //1.創立地位治理器(定位用戶的地位)
        self.locMgr=[[CLLocationManager alloc]init];
        //2.設置署理
        self.locMgr.delegate=self;
    }
    return _locMgr;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //斷定用戶定位辦事能否開啟
    if ([CLLocationManager locationServicesEnabled]) {
        //開端定位用戶的地位
        [self.locMgr startUpdatingLocation];
        //每隔若干米定位一次(這裡的設置為任何的挪動)
        self.locMgr.distanceFilter=kCLDistanceFilterNone;
        //設置定位的精准度,普通精准度越高,越耗電(這裡設置為精准度最高的,實用於導航運用)
        self.locMgr.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
    }else
    {//不克不及定位用戶的地位
        //1.提示用戶檢討以後的收集狀態
        //2.提示用戶翻開定位開關
    }
   
    //測試辦法,盤算兩個地位之間的間隔
    [self countDistance];
}

#pragma mark-CLLocationManagerDelegate
/**
 *  當定位到用戶的地位時,就會挪用(挪用的頻率比擬頻仍)
 */
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    //locations數組裡邊寄存的是CLLocation對象,一個CLLocation對象就代表著一個地位
   CLLocation *loc = [locations firstObject];
   
    //維度:loc.coordinate.latitude
    //經度:loc.coordinate.longitude
    NSLog(@"緯度=%f,經度=%f",loc.coordinate.latitude,loc.coordinate.longitude);
    NSLog(@"%d",locations.count);
   
    //停滯更新地位(假如定位辦事不須要及時更新的話,那末應當停滯地位的更新)
//    [self.locMgr stopUpdatingLocation];
 
}

//盤算兩個地位之間的間隔
-(void)countDistance
{
    //依據經緯度創立兩個地位對象
    CLLocation *loc1=[[CLLocation alloc]initWithLatitude:40 longitude:116];
    CLLocation *loc2=[[CLLocation alloc]initWithLatitude:41 longitude:116];
    //盤算兩個地位之間的間隔
    CLLocationDistance distance=[loc1 distanceFromLocation:loc2];
    NSLog(@"(%@)和(%@)的間隔=%fM",loc1,loc2,distance);
}

@end

打印檢查:

代碼解釋:
 
1.關於署理辦法
 
  須要設置署理,經由過程署理告知用戶以後的地位,有兩個署理辦法:
 
  locations參數外面裝著CLLocation對象

個中後者是一個過時的辦法,在新的辦法(第一個)中應用了一個數組來替換。
 
解釋:該辦法在當定位到用戶的地位時就會挪用,挪用比擬頻仍
 
留意:不要應用部分變量(創立地位治理器),由於部分變量的辦法停止它就被燒毀了。建議應用一個全局的變量,且只創立一次便可以了(應用懶加載)。
 
2.定位的精度

3.假如發明本身的定位辦事沒有翻開,那末應當提示用戶翻開定位辦事功效。
 
4.定位辦事是比擬耗電的,假如是做定位辦事(沒需要及時更新的話),那末定位了用戶地位後,應當停滯更新地位。
 
 
 
3、用戶隱私的掩護
 

1.權限設置解釋
 
從IOS 6開端,蘋果在掩護用戶隱私方面做了很年夜的增強,以下操作都必需經由用戶同意受權
 
(1)要想取得用戶的地位
 
(2)想拜訪用戶的通信錄、日歷、相機、相冊等
 
當想拜訪用戶的隱私信息時,體系會主動彈出一個對話框讓用戶受權

留意:一旦用戶選擇了“Don't Allow”,意味著你的運用今後就沒法應用定位功效,且當用戶第一次選擇了以後,今後就不再會提示停止設置。
 
是以在法式中應當停止斷定,假如發明本身的定位辦事沒有翻開,那末應當提示用戶翻開定位辦事功效。
 
CLLocationManager有個類辦法可以斷定以後運用的定位功效能否可用+ (BOOL)locationServicesEnabled;
 
  經常使用的辦法:截圖告知用戶,應當怎樣翻開受權
 
  
 
2.開辟者可以在Info.plist中設置NSLocationUsageDescription解釋定位的目標(Privacy - Location Usage Description)

解釋:這裡的定位辦事是基於收集的。平日定位辦事可所以基於GPS、基站或許是收集的。


4、IOS8以來的改良
IOS 8 還供給了加倍人道化的定位辦事選項。App 的定位辦事不再僅僅是封閉或翻開,如今,定位辦事的啟用供給了三個選項,「永不」「應用運用法式時代」和「一直」。同時,斟酌到能耗成績,假如一款 App 請求一直能在後台開啟定位辦事,iOS 8 不只會在初次翻開 App 時自動向你訊問,還會在平常應用中彈窗提示你該 App 一向在後台應用定位辦事,並訊問你能否持續許可。在iOS7及之前的版本,假如在運用法式中應用定位辦事只需在法式中挪用startUpdatingLocation辦法運用就會訊問用戶能否許可此運用能否許可應用定位辦事,同時在提醒進程中可以經由過程在info.plist中設置裝備擺設經由過程設置裝備擺設Privacy - Location Usage Description告知用戶應用的目標,同時這個設置裝備擺設是可選的。
然則在iOS8中設置裝備擺設設置裝備擺設項產生了變更,可以經由過程設置裝備擺設NSLocationAlwaysUsageDescription或許NSLocationWhenInUseUsageDescription來告知用戶應用定位辦事的目標,而且留意這個設置裝備擺設是必需的,假如不停止設置裝備擺設則默許情形下運用沒法應用定位辦事,翻開運用不會給出翻開定位辦事的提醒,除非裝置後本身設置此運用的定位辦事。同時,在運用法式中須要依據設置裝備擺設對requestAlwaysAuthorization或locationServicesEnabled辦法停止要求。因為自己機械曾經更新到最新的iOS8.1上面的內容重要針對iOS8,應用iOS7的同伙須要稍作調劑。

//
//  KCMainViewController.m
//  CoreLocation
//
//  Created by Kenshin Cui on 14-03-27.
//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import "KCMainViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface KCMainViewController ()<CLLocationManagerDelegate>{

    CLLocationManager *_locationManager;
}

@end

@implementation KCMainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    //定位治理器
    _locationManager=[[CLLocationManager alloc]init];
   
    if (![CLLocationManager locationServicesEnabled]) {
        NSLog(@"定位辦事以後能夠還沒有翻開,請設置翻開!");
        return;
    }
   
    //假如沒有受權則要求用戶受權
    if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined){
        [_locationManager requestWhenInUseAuthorization];
    }else if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse){
        //設置署理
        _locationManager.delegate=self;
        //設置定位精度
        _locationManager.desiredAccuracy=kCLLocationAccuracyBest;
        //定位頻率,每隔若干米定位一次
        CLLocationDistance distance=10.0;//十米定位一次
        _locationManager.distanceFilter=distance;
        //啟動跟蹤定位
        [_locationManager startUpdatingLocation];
    }
}

#pragma mark - CoreLocation 署理
#pragma mark 跟蹤定位署理辦法,每次地位產生變更即會履行(只需定位到響應地位)
//可以經由過程模仿器設置一個虛擬地位,不然在模仿器中沒法挪用此辦法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    CLLocation *location=[locations firstObject];//掏出第一個地位
    CLLocationCoordinate2D coordinate=location.coordinate;//地位坐標
    NSLog(@"經度:%f,緯度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);
    //假如不須要及時定位,應用完即便封閉定位辦事
    [_locationManager stopUpdatingLocation];
}

@end

留意:
 
1.定位頻率和定位精度其實不應該越准確越好,須要視現實情形而定,由於越准確越耗機能,也就越費電。
 
2.定位勝利後會依據設置情形頻仍挪用-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations辦法,這個辦法前往一組地輿地位對象數組,每一個元素一個CLLocation代表地輿地位信息(包括經度、緯度、海報、行走速度等信息),之所以前往數組是由於有些時刻一個地位點能夠包括多個地位。
 
3.應用完定位辦事後假如不須要及時監控應當立刻封閉定位辦事以節儉資本。
 
4.除供給定位功效,CLLocationManager還可以挪用startMonitoringForRegion:辦法對指定區域停止監控。

【講授iOS開辟中根本的定位功效完成】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved