beginBackgroundTaskWithExpirationHandler没有过期

时间:2013-03-17 14:35:05

标签: ios objective-c ipad ios5

在连接时,我在用户连接结束时添加了这段代码:

    UIBackgroundTaskIdentifier myLongTask;
    myLongTask = [[UIApplication sharedApplication]
                  beginBackgroundTaskWithExpirationHandler:^{
                      //   If you're worried about exceeding 10 minutes, handle it here
                  }];

    CFRunLoopRun();
    [[UIApplication sharedApplication] endBackgroundTask:myLongTask];  

我还设置了构建设置,应用程序需要wifi。这是一个使用套接字的基本客户端。

如果我锁定iPad,互联网就会死亡。现在我预计它会在iPad锁定后保持活动10分钟,但由于某种原因它到目前为止无限期地保持不动。在我锁定手机并回来解锁并且我的连接仍然是流式聊天之后,我已经测量了互联网正在运行超过30分钟。

我担心这可能不是合法的应用程序行为接受在应用程序商店虽然我没有设置任何特殊设置我正在阅读有关这是一个VOIP应用程序。我刚刚使用了beginBackgroundTaskWithExpirationHandler,应用程序需要上网。我也担心长期的电池影响,如果确实应用程序从未真正睡过,虽然我连接的服务器会在空闲60分钟时断开连接,因此它无法无限期保持连接但如果这个循环始终是一个问题仍然是一个问题即使断开连接也可以使用电池。例如,如果用户离开应用程序并且没有回来超过一周并且iPad只是坐了一个星期就会使用加速电池怎么办?我的测试还没有那么远,因为这是今天早上的一个新情况,我有互联网不会关闭,只要它在屏幕锁定时关闭连接。

有什么建议吗?任何人都知道为什么应用程序在屏幕锁定10分钟后不会睡觉?

麦克

2 个答案:

答案 0 :(得分:1)

操作系统可能会杀死你,也可能不会。 10分钟更像是一个“指南”,但是os可能会在早期或晚些时候杀死你。

但是CFRunloopRun几乎可以无条件地运行(只要连接任何源或它被停止)。确保它结束或你永远不会结束bg任务。

不是禁止但不是很酷!

答案 1 :(得分:0)

这是设置后台任务请求的一种非常奇怪的方法。以这种方式手动调用CFRunLoopRun()是不常见的。您在主循环上执行此操作的事实表明您没有使用标准UIApplicationMain()函数。如果没有,那么您可能无法正确设置应用程序,并且行为可能不稳定。您是否尝试过以正常方式使用后台任务:

  • beginBackgroundTaskWithExpirationHandler:
  • 即使程序进入后台,也要执行您想要运行的特定任务
  • 完成任务时
  • endBackgroundTask:

你这样做的方式,endBackgroundTask:可能永远不会被调用。


编辑:如果您的目标是在进入后台运行后,只要操作系统愿意让您运行(大约10分钟),那么请在beginBackgroundTaskWithExpirationHandler:中拨打applicationWillEnterBackground: 。您不需要特别使用runloop。你只需要告诉操作系统,你要继续操作直到它阻止你。