在AppDelegate里面进行如下操作:
导入MapKit
#import <MapKit/MapKit.h>
构建对象和代理:
@interface AppDelegate ()<CLLocationManagerDelegate> @property (nonatomic, strong) CLLocationManager *manager; @end
实现函数:
/** 应用进入后台执行定位 保证进程不被系统kill */ -(void)rjxContinuedLocationManager { //1.创建定位管理对象 _manager = [[CLLocationManager alloc]init]; //2.设置属性 distanceFilter、desiredAccuracy [_manager setDistanceFilter:kCLDistanceFilterNone];//实时更新定位位置 [_manager setDesiredAccuracy:kCLLocationAccuracyBest];//定位精确度 if([_manager respondsToSelector:@selector(requestAlwaysAuthorization)]){ [_manager requestAlwaysAuthorization]; } //该模式是抵抗程序在后台被杀,申明不能够被暂停 _manager.pausesLocationUpdatesAutomatically = NO; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) { //在后台也可定位 [_manager requestAlwaysAuthorization]; } if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) { _manager.allowsBackgroundLocationUpdates = YES; } //3.设置代理 _manager.delegate = self; //4.开始定位 [_manager startUpdatingLocation]; //5.获取朝向 [_manager startUpdatingHeading]; } // 当你的程序将要被挂起,会调用改方法 - (void)applicationWillResignActive:(UIApplication *)application { /** 应用进入后台执行定位 保证进程不被系统kill */ [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self.manager startUpdatingLocation]; } /** 应用进入后台执行定位 保证进程不被系统kill */ - (void)applicationDidEnterBackground:(UIApplication *)application { UIApplication *app = [UIApplication sharedApplication]; __block UIBackgroundTaskIdentifier bgTask; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ dispatch_async(dispatch_get_main_queue(), ^{ if (bgTask != UIBackgroundTaskInvalid){ bgTask = UIBackgroundTaskInvalid; } }); }]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_main_queue(), ^{ if (bgTask != UIBackgroundTaskInvalid){ bgTask = UIBackgroundTaskInvalid; } }); }); [self.manager startUpdatingLocation]; }