iOS 後臺持續定位詳解(支持ISO9.0以上)
#import <CoreLocation/CoreLocation.h>並實現CLLocationManagerDelegate 代理,.h文件完整代碼以下:git
- #import <UIKit/UIKit.h>
- #import <CoreLocation/CoreLocation.h>
-
- @interface ViewController : UIViewController<CLLocationManagerDelegate>
-
- @end
2.info.list文件:
右鍵,Add Row,添加的Key爲NSLocationAlwaysUsageDescription,其它值默認,示例以下:xcode
![](http://static.javashuo.com/static/loading.gif)
3.添加後臺定位權限
![](http://static.javashuo.com/static/loading.gif)
4.ViewController.m 文件:
(1)定義一個私有CLLocationManager對象app
(2)初始化並設置參數(initLocation方法),其中oop
locationManager.desiredAccuracy設置定位精度,有六個值可選,精度依次遞減spa
kCLLocationAccuracyBestForNavigation .net
kCLLocationAccuracyBest代理
kCLLocationAccuracyNearestTenMetersrest
kCLLocationAccuracyHundredMeterscode
kCLLocationAccuracyKilometer對象
kCLLocationAccuracyThreeKilometers
locationManager.pausesLocationUpdatesAutomatically 設置是否容許系統自動暫停定位,這裏要設置爲NO,剛開始我沒有設置,後臺定位持續20分鐘左右就中止了!
(3)實現CLLocationManagerDelegate的代理方法,此方法在每次定位成功後調用:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray*)locations;
*也能夠經過實現如下方法:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
(4)實現CLLocationManagerDelegate的代理方法,此方法在定位出錯後調用:
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
.m文件完整代碼以下:
- #import "ViewController.h"
-
- @interface ViewController (){
- CLLocationManager *locationManager;
- CLLocation *newLocation;
- CLLocationCoordinate2D coordinate;
- }
-
- @end
-
- @implementation ViewController
-
- - (void)viewDidLoad {
- [super viewDidLoad];
- [self initLocation];
- }
-
- #pragma mark 初始化定位
- -(void)initLocation {
- locationManager=[[CLLocationManager alloc] init];
- locationManager.delegate = self;
- locationManager.desiredAccuracy = kCLLocationAccuracyBest;
- if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
- [locationManager requestAlwaysAuthorization];
- }
-
// 9.0之後這個必需要加不加是不能實現後臺持續定位的的
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {
locationManager.allowsBackgroundLocationUpdates = YES;
}
- if(![CLLocationManager locationServicesEnabled]){
- NSLog(@"請開啓定位:設置 > 隱私 > 位置 > 定位服務");
- }
- locationManager.pausesLocationUpdatesAutomatically = NO;
- [locationManager startUpdatingLocation];
-
- }
-
- #pragma mark 定位成功
- -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
- newLocation = [locations lastObject];
- double lat = newLocation.coordinate.latitude;
- double lon = newLocation.coordinate.longitude;
- NSLog(@"lat:%f,lon:%f",lat,lon);
- }
-
- #pragma mark 定位失敗
- -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
- NSLog(@"error:%@",error);
- }
-
-
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
-
- }
-
- @end