iOS全时后台服务-基于位置追踪

标签 ios cocoa-touch networking background

我目前正在编写一个应用程序,该应用程序依赖于位置跟踪并将有关位置的数据发送到服务器。然而,问题在于它必须全天候 24/7 运行,目前我正在经历每 2-3 天发生一次的随机崩溃。为了使应用程序在后台不断运行,我所做的是将 NSTimer 放在 beginBackgroundTaskWithExpirationHandler 方法中,就在 applicationDidEnterBackground 方法旁边。计时器每分钟执行一次并停止/启动定位服务。

Here is a sample crash log

代码基本上是这样的:

UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTaskId = 0;

bgTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
    NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1 * 60.0 target: self selector: @selector(onTick) userInfo: nil repeats: YES];
    [t fire];

    if (bgTaskId != UIBackgroundTaskInvalid){
        [app endBackgroundTask: bgTaskId];

        bgTaskId = UIBackgroundTaskInvalid;
    }
}];

我正在使用 GCDAsyncSockets 进行连接,每次调用都有大约 30 秒的超时。

我真的不知道,崩溃发生的原因可能是什么?

最佳答案

您的计时器可能在任务无效后触发(在 [UIApplication sharedApplication].backgroundTimeRemaining 变为 0 后。

问题是您不能让应用程序一直在后台运行。如果你想每隔一段时间执行一次代码,你唯一的选择就是使用后台位置 API,设置你的应用程序在其 plist 中使用 location 后台模式。 您将获得 CLLocationManagerDelegate 回调,并且在调用这些方法时您有一些时间做一些工作。

请参阅有关背景模式的 Apple 文档:http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

位置感知手册:http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009497

关于iOS全时后台服务-基于位置追踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10706265/

相关文章:

cocoa-touch - UIButton 触摸和按住

objective-c - 比较 objective-c 中的有符号和无符号值

c++ - 读句柄错误

java - 在Netty中实现消息依赖

c++ - boost::asio - 知道什么时候必须关闭/关闭连接

ios - JSON 查询不起作用

ios - 当前道路的限速

ios - 将对象数组转换为数组对象

ios - 调整 MoPub iOS 横幅广告的大小?

cocoa-touch - 添加一个 UINavigationController 作为 UIView 的 subview