iOS后台运行程序——location
Posted zzz098zzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS后台运行程序——location相关的知识,希望对你有一定的参考价值。
对于ios应用,苹果公司是不允许其在后台(即按下Home键)运行的,如果在后台那么app在5s之内就会被kill掉,不能在运行网络也会断开。
可以通过在applicationDidEnterBackground方法中写代码来申请延长后台运行时间,不过也是最多600s,十分钟过后app仍然会被kill。
但是一些特殊的应用除外。苹果公司允许在后台运行的应用包括以下几种:
1、location定位服务:app依然可以获取设备位置更新的回调。
2、audio音频服务:在后台app依然可以播放/录制音频。
3、VoIP网络电话服务:允许app在后台运行任意作用的代码。当然前提是你的app必须提供了VoIP服务。
4、杂志下载:允许app在后台下载更新内容。
一、实现后台定位功能
1、先要在plist中增加三个配置,分别是
NSLocationAlwaysUsageDescription://意思是允许一直都进行定位
Required background modes :App registers for location updates //允许app进行后台定位
Application does not run in background :NO//允许app后台可运行
如图:
2、初始化定位管理器并且实现didUpdateLocations方法:
当程序进入后台(即点击Home键)时,程序会继续监听用户位置的改变,并且调用didUpdateLocations方法,可以在此方法中继续给服务器传递用户位置信息。
注:1)真机调试的时候要在完全真机条件下,不可以连接xcode,才能真正进入后台模式。
2)在初始化定位管理对象的时候,判断系统是iOS8以后的要写以下代码
[_locationManager requestAlwaysAuthorization];
3)判断系统是iOS9以后的要写以下代码使该控制器的定位管理对象一直可以在后台定位更新
<span style="font-size:14px;"> [_locationManager setAllowsBackgroundLocationUpdates:YES];</span>
具体代码如下:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationItem.title = @"后台定位";
self.view.backgroundColor = [UIColor whiteColor];
_switchView = [[UISwitch alloc]initWithFrame:CGRectMake(mywidth - 80, 10, 60, 30)];
[_switchView setOn:NO];
[_switchView addTarget:self action:@selector(switchBtnTouched) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_switchView];
//把log信息存储到手机本地
[self redirectNSLogToDocumentFolder];
//定位
[self locationStart];
- (void)switchBtnTouched
if (_switchView.on)
[_locationManager startUpdatingLocation];
else
[_locationManager stopUpdatingLocation];
//定位
-(void)locationStart
//定位管理器
if (_locationManager == nil)
_locationManager=[[CLLocationManager alloc]init];
if([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied)
_locationManager.delegate=self;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
_locationManager.distanceFilter = 5;
if (IOS8_OR_LATER)
[_locationManager requestAlwaysAuthorization];
if (IOS9_OR_LATER)
/** iOS9新特性:将允许出现这种场景:同一app中多个location manager:一些只能在前台定位,另一些可在后台定位(并可随时禁止其后台定位)。 */
[_locationManager setAllowsBackgroundLocationUpdates:YES];
else
// 需要开启定位服务,请到设置->隐私,打开定位服务
UIAlertView *alvertView=[[UIAlertView alloc]initWithTitle:@"" message:@"需要开启定位服务,请到设置->隐私,打开定位服务" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil];
[alvertView show];
#pragma mark - CoreLocation 代理
#pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定位到相应位置)
//可以通过模拟器设置一个虚拟位置,否则在模拟器中无法调用此方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
CLLocation *location=[locations firstObject];//取出第一个位置
CLLocationCoordinate2D coordinate=location.coordinate;//位置坐标
NSString *longitude = [NSString stringWithFormat:@"%f",coordinate.longitude];
NSString *latitude = [NSString stringWithFormat:@"%f",coordinate.latitude];
if (UIApplication.sharedApplication.applicationState == UIApplicationStateActive)
//前台
NSLog(@"在前台~");
[self presentSheet:[NSString stringWithFormat:@"%@,%@",longitude,latitude]];
else
//后台
NSLog(@"在后台~");
[self getHttpData];
// //如果不需要实时定位,使用完即使关闭定位服务
// [_locationManager stopUpdatingLocation];
//定位失败会调用该函数
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
// 定位失败
-(void)getHttpData
// 1.创建请求管理对象
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.封装请求参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"name"] = @"background_Location";
NSString *url = @"";<span style="white-space:pre"> </span>//服务器地址
// 3.发送请求
[mgr GET:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject)
failure:^(AFHTTPRequestOperation *operation, NSError *error)
];
要查看是否真的在后台运行时仍然调用了didUpdateLocations方法,可以把log信息保存到本地,在iPhoneExplorer中查看,
我保存的打印信息如图所示,成功的在后台运行时调用了服务器的接口:
iOS真机调试打印并保存控制台输出日志请查看另一篇文章:
以上是关于iOS后台运行程序——location的主要内容,如果未能解决你的问题,请参考以下文章