在我的应用中,我需要在用户终止应用时向服务器发送一些说明。在applicationWillTerminate func中,我尝试发送它,但它从未到过服务器。我尝试使用Alamofire和原生URLSession,但它不起作用。有人知道我怎么发送它? 我用这个代码
let request = "\(requestPrefix)setDriverOrderStatus"
if let url = URL(string:request) {
var parameters : [String : String] = [:]
parameters["access_token"] = UserSession.accessToken
parameters["driver_id"] = UserSession.userID
parameters["status"] = status
var req = URLRequest(url: url)
req.httpMethod = HTTPMethod.put.rawValue
do {
req.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
} catch let error {
print(error.localizedDescription)
}
_ = URLSession.shared.dataTask(with: req, completionHandler: { data, response, error in
guard error == nil else {
print(error ?? "error")
return
}
guard let data = data else {
print("Data is empty")
return
}
let json = try! JSONSerialization.jsonObject(with: data, options: [])
print(json)
}).resume
}
答案 0 :(得分:5)
对我有用的一个解决方案是在applicationWillTerminate
函数的末尾添加睡眠,如下所示:
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
// Saves changes in the application's managed object context before the application terminates.
// HERE YOU will make you HTTP request asynchronously
self.postLogoutHistory()
// 3 is the number of seconds in which you estimate your request
// will be finished before system terminate the app process
sleep(3)
print("applicationWillTerminate")
// self.saveContext()
}
答案 1 :(得分:0)
将breakpoint
放入applicationWillTerminate
并检查是否正在调用函数,因为每次应用程序终止时都不会调用applicationWillTerminate
,尤其是当用户从多任务窗口手动退出应用程序时,applicationWillTerminate
不会被召唤!当系统终止应用程序时applicationWillTerminate
将被调用,您将有大约五秒钟完成任务!因此,在applicationWillTerminate
上执行网络相关任务并不是一个好主意!
参考Apple Documentation for applicationWillTerminate,明确指出,
此方法可让您的应用知道它即将被终止 完全从记忆中清除。您应该使用此方法执行任何操作 应用程序的最终清理任务,例如释放共享资源, 保存用户数据,并使计时器无效。你执行这个 方法有大约五秒钟来执行任何任务并返回。 如果方法在时间到期之前没有返回,则系统可能会终止 整个过程。
适用于不支持后台执行或已关联的应用 对于iOS 3.x或更早版本,此方法始终在用户时调用 退出应用程序。对于支持后台执行的应用程序,此方法 通常不会在用户退出应用程序时调用,因为该应用程序 在这种情况下简单地移动到背景。但是,这种方法可能 在应用程序在后台运行的情况下调用 (未暂停)系统需要因某种原因终止它。
调用此方法后,该应用程序也会发布一个 UIApplicationWillTerminate通知给感兴趣的对象a 有机会回应过渡。