iOS后台持续定位实现方法
1.选中target-->Gapability,打开Background Modes模式,并勾选Location updates
设置2.代码如下:
ViewController.h
<pre>#import <UIKit/UIKit.h>
import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController<CLLocationManagerDelegate>
//定位管理对象
@property(nonatomic,strong)CLLocationManager *manager;
@end</pre>
ViewController.m
<pre>#import "ViewController.h"
@interface ViewController ()
{
CLGeocoder *_coder;
//存储上一次的位置
}
@end
@implementation ViewController
-
(void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor=[UIColor whiteColor];
//1.创建定位管理对象
_manager=[[CLLocationManager alloc]init];
_coder=[[CLGeocoder alloc]init];
//2.设置属性 distanceFilter、desiredAccuracy
_manager.distanceFilter=kCLDistanceFilterNone;//实时更新定位位置
_manager.desiredAccuracy=kCLLocationAccuracyBest;//定位精确度if([_manager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
[_manager requestAlwaysAuthorization];
}
//该模式是抵抗程序在后台被杀,申明不能够被暂停
_manager.pausesLocationUpdatesAutomatically=NO;
//3.设置代理
_manager.delegate=self;
//4.开始定位
[_manager startUpdatingLocation];
//5.获取朝向
[_manager startUpdatingHeading];
}
pragma mark-CLLocationManager代理方法
//定位失败时调用的方法
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"%@",error);
}
//定位成功调用的的方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
if(locations.count>0)
{
// 获取位置信息
CLLocation *loc=[locations lastObject];
// 获取经纬度的结构体
CLLocationCoordinate2D coor=loc.coordinate;
CLLocation *location=[[CLLocation alloc]initWithLatitude:coor.latitude longitude:coor.longitude];
[_coder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *pmark=[placemarks firstObject];
NSLog(@"%@",pmark.addressDictionary);
NSString *city=pmark.addressDictionary[@"City"];
if([city hasSuffix:@"市辖区"])
city=[city substringToIndex:city.length-3];
if([city hasSuffix:@"市"])
city=[city substringToIndex:city.length-1];
NSLog(@"%@",city);
}];
}
}
@end</pre>
Appdelegate.m
<pre>#import "AppDelegate.h"
import <CoreLocation/CoreLocation.h>
import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
-
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window.rootViewController=[ViewController new];
return YES;
} -
(void)applicationDidEnterBackground:(UIApplication )application {
if([CLLocationManager significantLocationChangeMonitoringAvailable])
{
ViewControllervc=(ViewController *)self.window.rootViewController;
[vc.manager stopUpdatingLocation];
[vc.manager startMonitoringSignificantLocationChanges];
}
else
{
NSLog(@"significant Location Change not Available");
}
} -
(void)applicationDidBecomeActive:(UIApplication )application {
if([CLLocationManager significantLocationChangeMonitoringAvailable])
{
ViewControllervc=(ViewController *)self.window.rootViewController;
[vc.manager stopMonitoringSignificantLocationChanges];
[vc.manager startUpdatingLocation];
}
else
{
NSLog(@"significant Location Change not Available");
}
}
@end</pre>