iOS后台运行程序(一)——location
2016-01-08 18:42
591 查看
对于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后台可运行
如图:
![](http://img.blog.csdn.net/20160108183450601)
2、初始化定位管理器并且实现didUpdateLocations方法:
当程序进入后台(即点击Home键)时,程序会继续监听用户位置的改变,并且调用didUpdateLocations方法,可以在此方法中继续给服务器传递用户位置信息。
注:1)真机调试的时候要在完全真机条件下,不可以连接xcode,才能真正进入后台模式。
2)在初始化定位管理对象的时候,判断系统是iOS8以后的要写以下代码
[_locationManager requestAlwaysAuthorization];
3)判断系统是iOS9以后的要写以下代码使该控制器的定位管理对象一直可以在后台定位更新
具体代码如下:
3、上述操作之后,可以发现当程序在前台运行时,会提示当前用户的坐标;当点击Home键进入后台的时候就会调用后台的接口。
要查看是否真的在后台运行时仍然调用了didUpdateLocations方法,可以把log信息保存到本地,在iPhoneExplorer中查看,
我保存的打印信息如图所示,成功的在后台运行时调用了服务器的接口:
iOS真机调试打印并保存控制台输出日志请查看另一篇文章:
iOS真机调试打印并保存控制台输出日志
可以通过在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) { }]; }
3、上述操作之后,可以发现当程序在前台运行时,会提示当前用户的坐标;当点击Home键进入后台的时候就会调用后台的接口。
要查看是否真的在后台运行时仍然调用了didUpdateLocations方法,可以把log信息保存到本地,在iPhoneExplorer中查看,
我保存的打印信息如图所示,成功的在后台运行时调用了服务器的接口:
iOS真机调试打印并保存控制台输出日志请查看另一篇文章:
iOS真机调试打印并保存控制台输出日志
相关文章推荐
- iOS开发 获取当前正在显示的ViewController(包含Push的和presented的)
- 【转】 iOS学习之NSBundle介绍和使用
- iOS开发侧边栏
- iOS原生地图开发指南2
- IOS定位服务的应用 详解
- IOSMKMapView地图视图 详解
- iOS-获取手机健康步数,去除人为添加的数据
- 在iOS地图上绘制两点间路线
- iOS 实现渐变色
- 把删除数组里面字典文件,然后进行倒叙,删除指定的数组元素ios考核第四题
- ios 调用系统提示音教程
- 3种隐藏键盘的方法——iOS
- ios enum to string
- ios 获取文件夹大小
- 原创翻译:蓝牙(BLE)for iOS
- iOS-设置启动页面时间
- iOS 7
- iOS- 如何集成支付宝
- 【iOS】倒计时5分钟
- CLLocationManager Delegate methods are not getting called -- ios8 later