iOS:如何让我的应用程序在后台永久运行?

3
我的应用程序正在托管一个文件共享Web服务器。我希望该应用程序在后台运行时仍然可以运行。我已经知道,通过设置beginBackgroundTaskWithExpirationHandler,可以在后台运行我的应用程序3分钟,但这不够长。是否有一种方法可以使应用程序永久运行,或者至少运行更长时间?
谢谢!
编辑
我最终找到了一个可行的方法,有点奇怪,但是它有效。我有一个过程。
-(void)bgTask {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"ApplicationURLScheme"]];
}

applicationDidEnterBackground中调用了它。
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
            [application beginBackgroundTaskWithExpirationHandler:^{
                [self bgTask];
            }];

就是这样,不需要更多的代码,我的Web服务器已经在后台运行了一小时以上!并且该应用程序没有使我的iDevice卡顿或崩溃!


你有查看苹果文档吗?https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html - Srinivasan N
1个回答

2

当我需要我的应用程序在后台运行以永久扫描iBeacons时,这是我为我的应用程序所做的:

- (void) backgroundForever {
        backgroundTaskID = [application beginBackgroundTaskWithExpirationHandler:^{
             [self backgroundForever]; 
        }];
}

- (void) stopBackgroundTask {
       UIApplication *application = [UIApplication sharedApplication];
       if(backgroundTaskID != -1)
            [application endBackgroundTask:backgroundTaskID];
}

所以,当当前的后台任务结束时,我们就会启动一个新的后台任务。你可以在applicationDidEnterForeground中调用stopBackgroundTask来停止后台任务。这取决于你的应用逻辑,例如你可以在此处调用。

这个方法是有效的,但我不确定你的应用是否能通过苹果审核。


好的,3分钟后我会执行[self backgroundForever];(我添加了一个NSLog)。问题是我的应用程序在3分钟之后会冻结。所以当我再次打开应用程序时,它不会对任何操作做出响应。如果我长时间在后台运行应用程序,我会得到一个蓝屏,这相当有趣 :) - David Gölzhäuser
你如何知道你的应用程序正在冻结?你能否暂停执行(从XCode)并查看主线程中发生了什么? - namanhams
我知道这是因为我打开它后什么也做不了。 - David Gölzhäuser
@namanhas 我刚刚注意到,当我在3分钟后启动应用程序时,任务不会停止。它一直在运行。并且applicationWillEnterForeground或applicationDidBecomeActive没有被调用。你知道为什么吗? - David Gölzhäuser
@DavidG:我已经更新了我的答案。你弄清楚你的应用程序为什么会冻结了吗? - namanhams
仍然有同样的错误,如果我打开这个应用程序并将它留在后台,我的设备会崩溃。在控制台上,我会看到很多类似 "clock_get_time() failed: (ipc/rcv) invalid name" 的错误提示信息。我猜测这是因为应用程序从未退出后台任务所致。我会在问题中展示我的代码。 - David Gölzhäuser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接