这是一个两方面的问题
第 1 阶段:确保 API 调用在每次用户终止应用程序时/在应用程序变为活动状态之前启动
你可以随时利用expiration handler
背景模式iOS application
在你的应用程序委托中
declare
var bgTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 0);
并在你的应用程序委托中
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
// Do something to stop our background task or the app will be killed
application.endBackgroundTask(self.bgTask)
self.bgTask = UIBackgroundTaskIdentifier.invalid
})
DispatchQueue.global(qos: .background).async {
//make your API call here
}
// Perform your background task here
print("The task has started")
}
后台过期处理程序将确保您每次将应用程序置于非活动状态或终止时都有足够的时间来启动 API 调用
第 2 阶段:确保 API 调用启动成功完成
尽管过期处理程序可能会确保您有足够的时间来启动 API 调用,但它无法确保 API 调用成功完成。如果 API 调用需要更长的时间并且请求正在执行且时间耗尽怎么办?
确保 API 调用在启动后成功的唯一方法是确保使用正确的配置URLSession
根据文档
后台会话允许您执行内容的上传和下载
当您的应用程序未运行时在后台运行。
link: https://developer.apple.com/documentation/foundation/nsurlsession?language=objc
因此,请利用后台会话并使用上传任务。不要使用简单的 get/post API(您将使用某些参数来访问),而是要求您的后端开发人员接受一个文件并将所有参数数据放入该文件中(如果有的话),然后使用后台会话启动上传任务。
一旦上传任务从后台会话开始,即使您的应用程序被终止,iOS也会完成它(除非您显然遇到身份验证挑战)。
我相信这是确保启动 API 调用并确保应用程序不活动/终止后完成的最接近的方法。我与一位苹果开发人员就此进行了讨论,他们同意这可能是一个可能的解决方案:)
希望能帮助到你