我在一个应用程序上工作,该应用程序使用HTTP post请求在我们的应用运行时将诊断数据发送到远程服务器。目前,我们将消息排队等待由我们应用程序中的另一个线程发送(使用我们自己的平台无关代码进行排队并curl
发送)。
我试图解决的问题是,如果应用程序崩溃(或以任何其他方式终止 - 虽然崩溃是我的主要关注点),在诊断帖子排队时和实际上是在另一个线程上发送时信息永远不会真正发送。应该注意的是,我们已经在使用crashlytics进行崩溃报告。此诊断信息是最重要的(主要是有关应用程序状态,检测到的可恢复错误等信息)。
我对处理此问题的方法有几点想法:
1 - 在其他平台上,我可能会启动一个处理发送这些请求的新进程,但是我发现在iOS上看起来不允许这样做的信息。
2 - 我也可以在磁盘上排队这些请求,以便我们可以在下次启动应用程序时发送它们,如果我们无法立即发送它们。但是,这需要等到用户再次(并且重要的是)用户再次启动我们的应用程序(我们使用此诊断信息的一部分是新用户的调试问题 - 如果新用户发生崩溃,他们很可能不会再打开它。)
iOS是否提供了可以实现这一目标的任何机制?
目前我们正在使用curl
发送这些请求,但如果提供此请求,我可以切换到iOS特定的API。我发现NSURLConnection::sendAsynchronousRequest
但似乎这仍然在我的应用程序中发生(意味着我有同样的问题)。
答案 0 :(得分:1)
如果应用程序“未运行”,意味着它已被用户杀死或从未启动过,则根本无法在后台执行任何操作。
如果您的应用处于“暂停”或“后台”状态,您可以请求后台安排时间,然后可以发送。我并不积极,但我认为崩溃并不能使你脱离这些状态。
您的后台功能在AppDelegate中执行。
支持此事:
setMinimumBackgroundFetchInterval(_:)
设置适合您应用的时间间隔。application(_:performFetchWithCompletionHandler:)
以处理后台抓取。如果可能的话,这将允许你在后台开火。
示例代码,因为这是Stack Overflow:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UIApplication.sharedApplication().setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
return true
}
func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
print ("Backgrounding happened")
completionHandler(.NewData)
}
请记住,获取时间间隔是您想要的,而不是您必须得到的。