ios定位功能的實現

學習定位,首先要了解它的含義,了解它的具體實現方法:下面介紹具體介紹它。
一:介紹
1、定位要使用CoreLocation框架
2、功能
(1)基礎定位
(2)地理編碼(文字轉換成地理位置) 反編碼(把經緯度轉換成地名)
3、iOS8 iOS9之后的改變
iOS8 的改變
(1)(添加了)定位服務的目的(在Info.plist中填寫)
《1》NSLocationAlwaysUsageDescription
《2》NSLocationWhenInUseUsageDescription
《3》如果忘記寫就不能使用 定位功能 沒有提示信息

(2)請求用戶授權
<1> requestAlwaysAuthorization
<2> requestWhenInUseAuthorization
<3> 如果和描述的目的不匹配 也不能使用定位功能

iOS9的改變
iOS9 按Home鍵 進入后臺 如果需要繼續定位
<1> 在info.plist 添加 Required background modes->App registers for location updates 如果不添加這對鍵值 卻使用后臺定位功能 系統會直接崩潰
<2> allowsBackgroundLocationUpdates 需要同時設置成YES

二:使用
1、使用定位服務所需的相關類和其他數據類型
(1)CLLocationManager
定位的管理者 可以通過這個類創建定位服務的功能
(2)CLLocation:地理位置信息相關的類

(3)CLLocationCoordinate2D:經緯度(坐標)信息的一個數據類型(是一個結構體)
(4)CLRegion:表示范圍的一個類
(5)CLGeocoder:地理編碼 反地理編碼的類
(6)CLPlacemark:表示地標的類 用文字表示位置信息的類(里面同時包含了location)
(7)CLHeading:表示導航方向的類 航向
(8)CLCircularRegion 圓形區域
(9)CLLocationDistance:距離
2、具體使用
(1)定位
<0> 檢查用戶是否在設置中 打開了定位服務
<1> 初始化定位對象
<2> info中添加描述使用定位的目的 并向用戶申請授權
<3> 掛上代理 并實現代理方法
<4> 如果需要使用后臺定位服務需要在 info中添加Required background modes 這個KEY以及它里面的元素App registers for location updates
<5> 開始定位

下面具體代碼實現定位:

//  ViewController.m
//  3.7 定位
//
//  Created by 記憶 on 16/3/7.
//  Copyright ? 2016年 Remeber. All rights reserved.
//

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
{
    CLLocationManager *locationManager;
    UILabel *speedLabel;
    UILabel *distanceLabel;
    UILabel *timeLabel;
    UILabel *avgSpeedLabel;
    
    CLLocation *lastLoc;//上一次更新的位置
    BOOL isFirst;//標記 是否是第一次 定位
    CLLocationDistance allDistance;//總距離
    NSTimeInterval allTime;//總時間
    
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    isFirst = YES;
    
    for (int i = 10; i<14; i++) {
        UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 100+45*(i-10), CGRectGetWidth(self.view.frame)-20, 40)];
        label.tag = i;
        label.backgroundColor = [UIColor lightGrayColor];
        label.textAlignment = NSTextAlignmentCenter;
        [self.view addSubview:label];
    }
    speedLabel = [self.view viewWithTag:10];
    distanceLabel = [self.view viewWithTag:11];
    timeLabel = [self.view viewWithTag:12];
    avgSpeedLabel = [self.view viewWithTag:13];
    
    
    
    
//    0、判斷 用戶是否 在《設置》里面 打開了 位置服務功能
    if (![CLLocationManager locationServicesEnabled]) {
        NSLog(@"用戶打開了 位置服務功能");
        /*
//        1、跳彈出框 提示用戶打開步驟
//        2、通過代碼 跳出設置頁面
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"溫馨提示" message:@"請在設置中打開定位功能" preferredStyle:UIAlertControllerStyleAlert];
        [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            
        }]];
        [self presentViewController:alertController animated:YES completion:nil];
        */
        
//        openURL:用于跳轉app 跳到iOS允許跳到的頁面
//        [[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
        
        
//        判斷是否可以打開 能打開就跳到設置頁面
        if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]) {
            
//            跳轉到 設置頁面
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
        };
    
        return;
    }
    
//    1、創建定位管理者的對象
    locationManager = [[CLLocationManager alloc]init];
//    多少米 去更新一次位置信息
    locationManager.distanceFilter = 10;
//    設置位置的精準度
    locationManager.desiredAccuracy = 10;
    
    
//    2、info中添加描述使用定位的目的 并向用戶申請授權
    [locationManager requestWhenInUseAuthorization];
    
    
//    3、掛上代理 并實現代理方法
    locationManager.delegate = self;
    
//    4、是否使用后臺定位的功能
    locationManager.allowsBackgroundLocationUpdates = YES;
    
//    5、開始定位
    [locationManager startUpdatingLocation];
    
}
//兩個代理方法
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray<CLLocation *> *)locations{
//    bug -> 第一次 得到的距離 是負數 錯誤
//    錯誤原因:第一次的時候 lastLoc 是空的
//    定位代理方法的觸發:
//    第一次 定位當前位置
//    第二次定位 走了100之后 再次定位
    
//    真正有效的距離是
//    1-2 2-3 ...
    
    
    
    
//    位置信息
    CLLocation *curLoc = locations.firstObject;
    
    //    解決辦法
    //    跳過第一次更新 直接把第一次更新的loc賦給lastLoc

    if (isFirst == YES) {
        isFirst =NO;
        lastLoc = curLoc;
        return;
    }
    
//    坐標:經緯度 -> struct 結構體
//    latitude:緯度
//    longitude:經度
    
    CLLocationCoordinate2D coordinate = curLoc.coordinate;
    NSLog(@"經度:%f 緯度:%f",coordinate.longitude,coordinate.latitude);
    
//    cllocationDistance -> double
    NSLog(@"高度:%f",curLoc.altitude);
    
//    可以通過水平精準度 來判斷是否定位成功
//    如果是負數 表示 定位錯誤
    NSLog(@"水平精準度%f",curLoc.altitude);
    NSLog(@"垂直精準度:%f",curLoc.verticalAccuracy);
    
    /*
     course當前設備前進的方向
     0°表示向北
     90°表示向東
     180°表示向南
     270°表示向西
     */
    NSLog(@"航向:%f",curLoc.course);
//    當前行駛速度
    NSLog(@"速度:%f",curLoc.speed);
    
//    floor 樓層的高度 -> level 幾層
    NSLog(@"%ld",curLoc.floor.level);
    
//    當前定位的日期NSData
    NSLog(@"當前的定位日期:%@",curLoc.timestamp);
    
    
//    1、是否超速
//    speed > 要求的速度
    speedLabel.text = curLoc.speed>=30 ? [NSString stringWithFormat:@"您已超速 當前速度%0.1f",curLoc.speed]:@"您在安全駕駛";
    

    
    
//    3、行駛距離
//    總距離 = 每一次更新位置得到的距離累加
//     更新位置得到的距離=上一次的loc 和當期的loc
//     CLLocationDistance ->double
//     得到兩次loc之間的距離方法:
//    - (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
    
    //得到兩次更新 位置信息 之間的距離
    CLLocationDistance distance = [curLoc distanceFromLocation:lastLoc];
    NSLog(@"兩次之間的距離:%f",distance);
    
    allDistance += distance;
    distanceLabel.text = [NSString stringWithFormat:@"您總共行駛了%0.1f米",allDistance];
    
//
//    4、行駛時間
//     總時間 = 每一次更新 得到的時間間隔的累加
//     可以得到當期的時間戳
//     日期有一個方法 計算兩個日期之間的時間間隔
//     
//    - (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate
//    ?上一次時間 -> 通過記錄 上一次更新的location來得到
    
     allTime += [curLoc.timestamp timeIntervalSinceDate:lastLoc.timestamp];
    int hours = allTime/3600;
    int min = (int)allTime%3600/60;
    int sec = (int)allTime%3600%60;
    
    timeLabel.text = [NSString stringWithFormat:@"您行駛了%d時%d分%d秒",hours,min,sec];
    
    //    2、平均速度
    //    總距離/總時間
    avgSpeedLabel.text = [NSString stringWithFormat:@"平均速度每秒%0.1f",allDistance/allTime];
    
    // 將要出 定位的代理方法的時候 curLoc沒有用了
    // 把curLoc 變成了 上一次的 位置信息
    // 賦給 lastLoc
    lastLoc = curLoc;
    
}
- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error{
    NSLog(@"error:%@",error);
    
}
22.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,957評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,248評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,081評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,485評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,720評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,263評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,025評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,204評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,461評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,945評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,205評論 2 375

推薦閱讀更多精彩內容