应用程序关闭时的 iOS 任务
Posted
技术标签:
【中文标题】应用程序关闭时的 iOS 任务【英文标题】:iOS task when application is closed 【发布时间】:2016-02-07 13:05:44 【问题描述】:我正在构建一个通过 ajax 将文件上传到服务器的应用程序。 问题是用户很可能有时没有互联网连接,并且客户端希望将 ajax 调用安排在用户恢复连接的时间。用户可能会在离线时安排文件上传并关闭应用程序。应用程序关闭时(不在后台)是否可以进行 ajax 调用? 当应用程序在后台时,我们可以使用 background-fetch 但我从来没有遇到过在应用程序关闭时做某事的问题。
【问题讨论】:
使用后台进程进行下载然后... @FahimParkar - 你的意思是,当应用程序在后台或任何或任何其他类型的后台进程中打开时? 调查 NSURLSession,因为这允许操作系统将处理的后台传输并在传输完成时通知您,包括在后台重新启动您的应用程序以通知您传输已完成。它可能能够完成您需要的一切。 (我才刚刚开始调查这个设施,所以我不是专家。) 【参考方案1】:简短的回答是否定的,您的应用程序在被终止后无法运行代码。
您可以在AppDelegate
的applicationWillTerminate
中运行代码,但该方法主要用于保存用户数据和其他类似任务。
另见this answer。
【讨论】:
【参考方案2】:是的,您可以在后台执行操作。您仅限于几种不同的后台执行模式。服务器通信是允许的模式之一(后台获取)。确保按照指南在 Xcode 中正确设置属性(即,在进行数据传输时不要说您是音频应用程序)。在此处查看详细信息:
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
我找到了您的问题,因为它具有与之关联的 Cordova 标记。如果你使用 Cordova,你可以在这里使用这个插件来管理后台的东西:
https://github.com/katzer/cordova-plugin-background-mode
编辑:如果用户强制关闭/终止应用程序,那么您无能为力。如果他们只是将应用程序退出到主屏幕并使用其他应用程序,那么您可以在后台运行。
您可以执行的另一个选项是安排本地通知以上传文件。如果您的应用因为文件已打开/有连接/在后台执行而成功上传文件,则您取消本地通知。
如果本地通知没有被取消,它会提醒用户文件没有上传,当他们打开通知时,你的应用会从上次中断的地方重新开始。
【讨论】:
【参考方案3】:- (void)applicationWillTerminate:(UIApplication *)application
if (application)
__block UIBackgroundTaskIdentifier backgroundTask = UIBackgroundTaskInvalid;
backgroundTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^
backgroundTask = UIBackgroundTaskInvalid;
];
[self doSomething];
[application endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
【讨论】:
【参考方案4】:我已经回答了一个类似的问题: https://***.com/a/57245917/6157415
您可以实现通知,当用户收到通知时,您的代码部分可以执行。
特别是有静默推送通知可以做到这一点:
有时,您可能希望使用静默推送通知来更新 后台应用程序中的内容。静默推送通知 被定义为没有警报、标记或声音的推送,并且 只是有键值数据。
发件人:https://docs.mobile.sailthru.com/docs/silent-push-notifications
【讨论】:
以上是关于应用程序关闭时的 iOS 任务的主要内容,如果未能解决你的问题,请参考以下文章