关键词:ios 后台持续定位
iOS 后台的理解
// (0081)iOS开发之无限后台定位并上传数据到服务器
// (0081)iOS开发之无限后台定位并上传数据到服务器
需求场景:
每隔一段时间,反复执行同一个任务,去调服务端的接口。
成熟的第三方SDK: (介绍地址:(0081)iOS开发之无限后台定位并上传数据到服务器)
相似需求一:
由于公司一款产品的需求,最近一直在研究iOS设备的后台定位。主要的难点就是,当系统进入后台之后,程序会被挂起,届时定时器、以及代码都不会Run~ 所以一旦用户将我的App先换到了后台,我的定位功能将无法继续。
http://www.cnblogs.com/oshushu/articles/4569252.html
相似需求二:
最近做一个考勤APP,功能很简单,就是一直在后台运行,每隔固定时间向服务器上传一次位置信息。持续运行24小时测试,功能实现。(0081)iOS开发之无限后台定位并上传数据到服务器
相似需求三:
iOS开发:后台定位并上传数据到服务器 (0081)iOS开发之无限后台定位并上传数据到服务器
第一种方式:
当程序处于运行状态,每隔几秒给服务器发送一次请求。这时我们可以这样处理:
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
// 可以用该语句查看当前线程
NSLog(@"当前线程--%@", [NSThread currentThread]);
// 此处需要写一个异步任务,是因为需要开辟一个新的线程去反复执行你的代码块,否则会阻塞主线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
while (TRUE) {
// 每隔5秒执行一次(当前线程阻塞5秒)
[NSThread sleepForTimeInterval:5];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// 这里写你要反复处理的代码,如网络请求
NSLog(@"***每5秒输出一次这段文字***");
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
};
});
链接:https://www.jianshu.com/p/af0e87d63069
第二种方式:
也是今天想着重提到的,就是通过定位获取更多的后台使用的时间,这种适合于需要在后台收集用户的定位的场景,例如滴滴打车此类应用。重要的是这个思路很好!
1.需要在info.plist 设置
2.其实这种后台刷新是很暴力的,导航仪不断在定位,你才可以获取后台活跃的时间,去执行你的一些想要的操作,但是不断的定位会导致,电量消耗过快,我测试一个小时奖金跑去了10%的电量,那么有没有一些更优的方案,减少定位的次数,然后又能让后台活跃呢?下面来讲解下思路
这个优化面临的问题,就是当程序进入了后台,如果让定位停止了,那么程序就后台就无法活跃了,就是把程序进入后台的问题解决了,那就好办了,看了上图,也可以看出,思路主要是在当前正在定位的时候,10秒后关闭当前的定位,然后此时开启后台任务backgroundtask,那么只要就会有3分钟的活跃时间,那么在这个后台任务有效时间内再次开启定位的话,程序在后台便依旧可以活跃,那么只要开启和关闭循环进行,就可以实现常驻后台了,那么这个时间间隔可以自定义,在自己需要的范围内即可,但是不能超过3分钟,那么接下来在看看主要代码实现
//定位回调里执行重启定位和关闭定位
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
NSLog(@”定位收集”);//正在手机定位不执行任何操作
if (isCollect) {
return;
}
[self performSelector:@selector(restartLocation) withObject:nil afterDelay:120];
[self performSelector:@selector(stopLocation) withObject:nil afterDelay:10];
isCollect = YES;
}
-(void)restartLocation{ NSLog(@”重新启动定位”);
CLLocationManager *locationManager = [BGLogation shareBGLocation];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; // 不移动也可以后台刷新回调
if ([[UIDevice currentDevice].systemVersion floatValue]>= 8.0) {
[locationManager requestAlwaysAuthorization];
}
[locationManager startUpdatingLocation];
[self.bgTask beginNewBackgroundTask];
}//停止后台定位
-(void)stopLocation{
NSLog(@”停止定位”);
isCollect = NO;
CLLocationManager *locationManager = [BGLogation shareBGLocation];
[locationManager stopUpdatingLocation];
}
接下来是demo 的地址
https://github.com/heysunnyboy/locationdemo.git
可以看到下面的代码 ,在delegate 里设置的定时器一直都在跑没有停止就知道这个后台常驻是有效的
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch.
_task = [BGTask shareBGTask];
UIAlertView *alert;
//判断定位权限
if([UIApplication sharedApplication].backgroundRefreshStatus == UIBackgroundRefreshStatusDenied) {
alert = [[UIAlertView alloc]initWithTitle:@”提示” message:@”应用没有不可以定位,需要在在设置/通用/后台应用刷新开启” delegate:nil cancelButtonTitle:@”确定” otherButtonTitles:nil, nil];
;
}elseif([UIApplication sharedApplication].backgroundRefreshStatus == UIBackgroundRefreshStatusRestricted) {
alert = [[UIAlertView alloc]initWithTitle:@”提示” message:@”设备不可以定位” delegate:nil cancelButtonTitle:@”确定” otherButtonTitles:nil, nil];
;
} else {
self.bgLocation = [[BGLogation alloc]init];
[self.bgLocation startLocation];
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(log) userInfo:nil repeats:YES];
} return YES;
}
今天的文章iOS降级_ios13一键关闭所有程序分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/67476.html