1.开去后台模式:
![image](https://img.haomeiwen.com/i937405/f6389f976cba668e.png?imageMogr2/auto-orient/strip|imageView2/2/w/543/format/webp)
2.在plist中加入NSLocationAlwaysUsageDescription这个键,对应的值为Boolean型,YES (总是使用定位)。
并在程序中加入如下代码,获取持续定位的许可。
<pre>if([_manager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
[_manager requestAlwaysAuthorization];
}</pre>
其中的manager是CLLocationManager对象。
3.在applicationDidEnterBackground:方法中,加入如下代码:
<pre>- (void)applicationDidEnterBackground:(UIApplication *)application {
if([CLLocationManager significantLocationChangeMonitoringAvailable])
{
ViewController*vc=(ViewController *)self.window.rootViewController;
[vc.manager stopUpdatingLocation];
[vc.manager startMonitoringSignificantLocationChanges];
}
else
{
NSLog(@"significant Location Change not Available");
}
}</pre>
4.在applicationDidBecomeActive:方法中,加入如下代码:
<pre>
* (void)applicationDidBecomeActive:(UIApplication *)application {
if([CLLocationManager significantLocationChangeMonitoringAvailable])
{
ViewController*vc=(ViewController *)self.window.rootViewController;
```
[vc.manager stopMonitoringSignificantLocationChanges];
[vc.manager startUpdatingLocation];
```
}
else
{
NSLog(@"significant Location Change not Available");
}
}</pre>
5.至此,后台持续定位功能成功实现。最后附上部分代码,供参考:
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])
{
ViewController*vc=(ViewController *)self.window.rootViewController;
[vc.manager stopUpdatingLocation];
[vc.manager startMonitoringSignificantLocationChanges];
}
else
{
NSLog(@"significant Location Change not Available");
}
}
* (void)applicationDidBecomeActive:(UIApplication *)application {
if([CLLocationManager significantLocationChangeMonitoringAvailable])
{
ViewController*vc=(ViewController *)self.window.rootViewController;
```
[vc.manager stopMonitoringSignificantLocationChanges];
[vc.manager startUpdatingLocation];
```
}
else
{
NSLog(@"significant Location Change not Available");
}
}
@end
</pre>
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"
# import <Photos/Photos.h>
# import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
{
// 定位管理对象
CLLocationManager *_manager;
CLGeocoder *_coder;
// 存储上一次的位置
}
@end
@implementation ViewController
* (void)viewDidLoad
{
[super viewDidLoad];
PHFetchResult *result=[PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for(PHAssetCollection *collection in result)
{
if ([collection.localizedTitle isEqualToString:@"FGG"]) {
NSLog(@"%@",collection);
}
}
//1.创建定位管理对象
_manager=[[CLLocationManager alloc]init];
_coder=[[CLGeocoder alloc]init];
//2.设置属性 distanceFilter、desiredAccuracy
_manager.distanceFilter=kCLDistanceFilterNone;//实时更新定位位置
_manager.desiredAccuracy=kCLLocationAccuracyBest;//定位精确度
//iOS8之后需要设置Info.plist,NSLocationAlwaysUsageDescription=YES以开启总是使用定位
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];
//海拔
CGFloat altitute=loc.altitude;
CGFloat altituteAcuracy=loc.verticalAccuracy;
```
NSLog(@"海拔高度:%.0fm 精度:%.0fm",altitute,altituteAcuracy);
//获取经纬度的结构体
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);
}];
}
```
}
//返回定位的朝向
-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
// 相对地理北极的方向
// newHeading.trueHeading;
// 相对地磁北极的方向
// newHeading.magneticHeading;
}
@end
</pre>
作者:CGPointZero
链接:https://www.jianshu.com/p/4e30b0af8f51
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论