应用程序不在后台运行,但在我的应用程序终止之前我还可以执行某些任务吗?

时间:2012-02-10 02:19:33

标签: iphone objective-c ios ipad multitasking

我有一个奇怪的情况,客户端不希望他们的应用程序支持多任务处理所以我在info.plist创建了一个标志,如

Application does not run in background = YES;

但是,在应用程序生命周期中,应用程序必须在终止之前将一些数据上载到服务器。如果没有那么服务器将有模糊数据,我的客户的公司(可能我也是......)将注定失败!

现在我的问题是,

  • 操作系统终止我的应用程序之前有多少时间?有时上传数据可能很大,如果互联网速度很慢,我可能需要更多时间。
  • 我看到这个方法beginBackgroundTaskWithExpirationHandler将在我的情况下工作。我怀疑,如果我支持后台执行,这可能会有效。我是对的吗?

最后的问题,

  • 我能想到的其他选择吗?
  • 我应该辞去iOS开发人员的职务吗?

由于

3 个答案:

答案 0 :(得分:2)

我的建议是尝试这样的事情:

[[NSNotificationCenter defaultCenter] 
 addObserver:self 
 selector:@selector(saveWhatever) 
 name:UIApplicationWillTerminateNotification
 object:nil];

只需将该代码放入您班级的init方法中即可。一定要在viewDidUnload中以观察者身份移除自己,如下所示:

[[NSNotificationCenter defaultCenter] removeObserver:self];

您可以在这里保存需要保存的内容,但我不确定上传数据。最好的办法是将数据保存到文件中,然后在下次打开应用程序时,将文件中的数据异步上传到服务器。您可以尝试使用此通知上传它,我只是不确定Springboard是否会等待这种情况发生。

答案 1 :(得分:2)

辞职?可能不是,但寻找具有现实期望的另一家公司的工作?肯定。根据我的经验,那些坚持一丝不苟的设计理念并且不会理解理性的客户更有可能在开发人员形成梨形时责备开发人员。

至于终止时尝试上传数据。不要这样做。看门狗计时器无法预测应用程序在计时器假定挂起并杀死它之前将花费多少时间。最近,当我开始研究应用随机无法启动的既定项目时,我遇到了类似的情况。问题是开发人员已将下载代码放入应用程序:didFinishLaunchingWithOptions:方法。由于互联网延迟和服务器延迟问题,该方法耗时太长,应该将其代码移至后台线程。

尝试在终止,睡眠等方面做同样的事情也会遇到同样的问题,并且没有任何已知方法可以阻止看门狗计时器查杀你的应用程序。

我遇到的另一个问题是客户为何能够抵抗多任务处理?他们为什么关心?他们实际上无法阻止它,因为它实际上是任何应用程序的一部分。我认为,如果他们不想要多任务,他们也不想要任何形式的互联网访问或动画。因为没有线程化这些东西,你的用户界面很可能无法使用,赢得了很多1星评级和投诉。

答案 2 :(得分:1)

将数据上传到服务器时是否重要?在申请终止之前是否必须正确?

如果没有,那么我有这个建议:

在App Delegate方法applicationWillTerminate中,将所有数据写入应用程序沙箱文件系统的文本文件(如mydata.txt)(即在Library / Cache目录中。不能将Document目录用于app生成的文件Apple现在使用Document目录进行iCloud同步,因此将文件放在那里会导致app被拒绝。还需要标记您的文件,不要同步到iCloud属性。

然后在下次启动应用程序时,您可以检查是否存在此“mydata.txt”文件。如果存在,请从中读取所有数据并上传到您的服务器。然后从Library / Cache文件夹中删除该文件,以便下次不上载相同的数据。您可以在App Delegate的applicationDidFinishLaunching方法中执行此操作。