如何在iPhone SDK 3.0中实现守护进程以进行后台任务?

5
像qik.com或ustream.com一样,当他们从iPhone上传内容到服务器时,它是通过守护进程工作的。因此,即使退出了应用程序,后台守护进程仍然在运行任务。是否有任何方法可以以相同的方式实现守护进程过程?谢谢!
7个回答

9

iPhone OS不允许您添加后台进程。

(意思是iPhone操作系统不支持添加后台进程)

3
这将在iPhone OS 4.0中发生变化。你现在可以请求操作系统为你的应用程序多运行几分钟,或者注册一些事件(如位置变化)来唤醒你的应用程序。 - Rudi

6
更有可能的情况是,在退出应用时,他们保存状态,然后在重新启动时恢复状态。

5

在applicationWillTerminate:中阻塞线程不会立即被终止,但将被App Store拒绝。对于非AppStore或个人应用程序,这里是代码:

@interface MyApplication : UIApplication
{
    BOOL _isApplicationSupposedToTerminate;
}
@property (assign) BOOL isApplicationSupposedToTerminate;
- (void)_terminateWithStatus:(int)status;
@end


@implementation MyApplication
@synthesize isApplicationSupposedToTerminate = _isApplicationSupposedToTerminate;
- (void)_terminateWithStatus:(int)status
{
    if (self.isApplicationSupposedToTerminate) {
        [super _terminateWithStatus:status];
    }
    else {
        return;
    }
}
@end

In main.m

    int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);

委托:


- (void)applicationWillTerminate:(UIApplication *)application
{
    [(MyApplication*)application setIsApplicationSupposedToTerminate:!kIsTransferDone];
}

这将防止应用程序在传输完成前终止。设置一个检查超时的定时器非常重要。在applicationDidReceiveMemoryWarning:中,通过以下方式退出应用程序:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { [(MyApplication*)application setIsApplicationSupposedToTerminate:YES]; [application terminateWithSuccess]; }

这应该能帮助您完成工作。仅适用于越狱设备。


1
不错的方法,但对我来说效果不太好。它只能让应用程序多活1到20秒,之后仍会在日志中出现警告而被终止:"<app>未能及时终止"。 - TinkerTank

2

很遗憾,使用iPhone SDK无法创建后台进程。只能在应用程序运行时上传数据。


1

1
从第一部分开始:“在我们开始之前,您需要进行以下几项操作。1)确保您的iPhone已越狱。” - 没有太多用处... - jww

1

0
如果需要发送数据,我会在applicationWillTerminate:中等待传输完成。据我所知,如果您在applicationWillTerminate:中阻塞线程,应用程序不会退出(如果我有错,请纠正我)。但是要小心,如果数据很大或用户的互联网速度很慢,您应该无论如何退出并在下次恢复传输。建议设置计时器以检查超时。
注意:这可能会被App Store拒绝。

如果线程在applicationWillTerminate:中阻塞的时间超过一定时间(通常约为五秒钟左右),苹果实际上保留终止应用程序的权利。此外,如果您阻塞的时间超过了这个时间并且应用程序确实被杀死了,它将失去应用程序正常退出时具有的漂亮淡出转换效果;相反,对于用户来说,它看起来像是一个崩溃(应用程序只是消失了,设备再次呈现SpringBoard)。 - Tim
在 applicationWillTerminate: 中执行任何可能需要很长时间的操作都是一个不好的主意。 - Mark Bessey

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