標籤:
#import "ViewController.h"
//匯入CoreLocation庫後匯入其標頭檔
#import <CoreLocation/CoreLocation.h>
//從iOS8開始,架構的匯入也可以使用這種方式
//@import CoreLocation;
@interface ViewController ()<CLLocationManagerDelegate>
@property (nonatomic, strong)CLLocationManager *lm;
@end
@implementation ViewController
//懶載入
- (CLLocationManager *)lm
{
if(!_lm)
{
//定位要使用的類
_lm = [[CLLocationManager alloc] init];
}
return _lm;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
self.lm.delegate = self;
//請求前台定位授權(當使用者在使用APP的時候才有許可權去使用定位許可權)
[self.lm requestWhenInUseAuthorization];
//請求前後台定位授權.
// [self.lm requestAlwaysAuthorization];
//版本適配
if ([[[UIDevice currentDevice] systemVersion] floatValue] >=9.0) {
//從iOS9開始如果要使用後台定位,必須實現這個屬性為YES
//如果請求的定位許可權是在前台定位,而需要在後台也是用定位時,可以勾選capabilities中的後台模式,但是此時會有藍條出現
self.lm.allowsBackgroundLocationUpdates = YES;
}
//版本適配方法2
// if ([self respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)])
// {
// [self.lm setAllowsBackgroundLocationUpdates:YES];
// }
/*
kCLLocationAccuracyBestForNavigation導航定位
CLLocationAccuracy kCLLocationAccuracyBest最精確定位
CLLocationAccuracy kCLLocationAccuracyNearestTenMeters 10米內
CLLocationAccuracy kCLLocationAccuracyHundredMeters 100米內
CLLocationAccuracy kCLLocationAccuracyKilometer 1公裡內
CLLocationAccuracy kCLLocationAccuracyThreeKilometers 3公裡內
*/
//定位精度.定位精度越精確,越耗電
self.lm.desiredAccuracy = kCLLocationAccuracyBest;
//位置過濾,當使用者位置移動超過10米時再次定位,若位置靜止或移動小於10米則不定位.
// self.lm.distanceFilter = 10;
//開始請求使用者位置,此方法會從定位精度最差一級開始定位,若在逾時時間內定位到,則返回定位資訊,若未定位到設定的定位精度就到達逾時時間,就返回當前定位到的精度位置資訊.若逾時後使用者還未決定是否允許定位或未定位到任何位置資訊就會調用locationManager:didFailWithError:
//但是此方法不能同時和startUpdatingLocation同時使用,並且必須實現協議方法locationManager:didFailWithError:
// [self.lm requestLocation];
//開始更新位置
[self.lm startUpdatingLocation];
//位置更新後,需要通過某種方式將更新後的位置語音總機到使用者,方法有:代理,block,通知.
}
//當位置更新後的回調方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
NSLog(@"位置已更新");
//停止定位
// [manager stopUpdatingLocation];
}
//定位失敗
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"定位失敗");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
以上是我實現許可權訪問的定位,下面說一下plist檔案
這是我最終的plist檔案,裡面的前後台,前台,使用定位請求是自己加進去的;至於使用定位請求的key是:
NSLocationUsageDescription(在CLLocationManager.h檔案的第187行),至於前面的那個Privacy是系統自己加進去的,不必糾結於此;
另外,要想實現前後台都可以使用定位,還必須去工程的TARGETS裡面,選擇(第二個)Capabilities,在Capabilities中再選擇Background Modes,將開關開啟,並在其中的第二項Location updates前面打對勾;
這樣你就要可以完美運行你的工程項目了.
CoreLocation架構之APP定位