转载请注明出处:hualei的博客www.hualeihl.com
最近公司业务需要,针对一款iOS软件,要求程序进入后台依然可以持续提交定位信息,所以研究了一下。
我们知道,iOS程序进入后台后正常进程只能保持3分钟,3分钟后就会被挂起,所以要想实现后台持续定位,就要防止进程被挂。
查阅苹果官方关于后台的文档发现,有3类APP具有后台运行不会被挂起,种类如下:
- Audio
- Location/GPS
- VoIP
这里我用到了第二种,即 Location/GPS。
具体实现步骤
1 . 首先info.plist文件里面配置如下:
info.plist文件里面配置 info.plist文件里面配置2 . 在工程的TARGETS中的capabilities里设置Background Modes如下:
capabilities设置3 . 然后创建一个继承自CLLocationManager的单例,创建单例对象,并注意要设置其两个熟悉值如下,如果不设置则无法实现后台持续定位
if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[_locationManager requestAlwaysAuthorization];
}
if ([_locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
之后,再设置CLLocationManager
实例的代理以及实现代理方法,运行程序并让程序进入后台运行,会发现程序一直在按设置的条件定位并回调代理方法而不会被挂起。
在查阅官方文档时,还看到一段话,截取如下
官方文档截取其中红框部分翻译过来就是:
当程序不在运行时,如果此时发生了一个监听范围的越界事件,系统会在后台自动唤醒应用(或重启动),以处理该事件。这种情况下,
launchOptions
字典会传递给application:didFinishLaunchingWithOptions:
方法,其中会包含UIApplicationLaunchOptionsLocationKey
键,用以标记APP因为一个位置相关的事件而启动。在这个重新启动的过程中,你必须重新创建位置管理器(location manager
对象),并指定代理以处理该位置事件。
这里我们可以看到,即使APP不在运行,我们也可以通过设置位置范围监听(CLRegion
)来实现唤醒APP并处理相关位置事件。
不过这里要强调的是,APP中使用这些API在提交APP Store时苹果会进行相关审核,看应用是否有必要使用这些API,如果没必要,苹果会拒绝,所以想使用这一方式实现除定位外的别的目的不是很容易。
网友评论