在applicationWillTerminate

时间:2016-12-30 09:42:47

标签: ios swift url request xcode8

在我的应用中,我需要在用户终止应用时向服务器发送一些说明。在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
    }

2 个答案:

答案 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   有机会回应过渡。