在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]; }