繼之前的后臺播放音頻,后臺下載,再來一發后臺持續定位的實現。流程差不多:
1.開去后臺模式:
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])
{
ViewControllervc=(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])
{
ViewControllervc=(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])
{
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>
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>