1

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

    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 分钟后不会休眠吗?

麦克风

4

2 回答 2

1

操作系统可能会杀死您,也可能不会。10 分钟更像是一个“指导方针”,但操作系统可能会提前或推迟杀死你。

但 CFRunloopRun 几乎会无限运行(只要任何源连接或停止)。确保它结束,否则你永远不会结束 bg 任务。

不禁止但不酷!

于 2013-03-17T14:37:41.093 回答
0

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

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

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


编辑:如果您的目标是在进入后台后允许您运行,只要操作系统愿意让您运行(大约 10 分钟),然后调用beginBackgroundTaskWithExpirationHandler:. applicationWillEnterBackground:您不需要对运行循环进行任何特殊使用。您只需要告诉操作系统您希望继续运行,直到它阻止您。

于 2013-03-17T18:05:27.580 回答