我一直在使用NSURLSession
向AWS S3进行后台上传。像这样:
NSURLSessionConfiguration* configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@“some.identifier"];
NSURLSession* session = [NSURLSession sessionWithConfiguration:configuration delegate:someDelegate delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionUploadTask* task = [session uploadTaskWithRequest:request fromFile:[NSURL fileURLWithPath:httpBody]];
[task resume];
在someDelegate
中,我实施了didSendBodyData
,didCompleteWithError
和handleEventsForBackgroundURLSession
。
我有三个问题:
handleEventsForBackgroundURLSession
? httpBody
中的handleEventsForBackgroundURLSession
?这是一个临时文件,传输完成后不需要。答案 0 :(得分:4)
当调用app delegate handleEventsForBackgroundURLSession
时,您应该:
NSURLSession
; URLSession:task:didCompleteWithError:
中,您可以删除这些临时文件;和URLSessionDidFinishEventsForBackgroundURLSession:
中,您可以调用已保存的完成处理程序。 一些补充说明:
关于应用程序终止时会发生什么似乎有些混乱。
如果应用程序在正常生命周期内终止,URLSession
守护程序将保留后台请求,完成上传,然后在应用完成后唤醒它。
但手动强制退出应用程序(例如,双击主页按钮,向上滑动应用程序以强制退出)是完全不同的事情(实际上,用户说"停止此应用程序和与它相关的一切")。这将停止后台会话。所以,是的,应用程序终止后,后台会话将继续,但是,不,如果用户强制退出应用程序,则不会。
您谈到在Xcode中设置断点并观察它。您应该知道,附加到Xcode的过程会干扰正常的应用程序生命周期(它会使其在后台运行,防止它被暂停,或者在正常的事件过程中终止)。
但在测试与后台会话相关的代码时,在应用程序终止时测试handleEventsForBackgroundURLSession
工作流程至关重要,因此为此,我建议在测试时不要使用Xcode调试器背景会话的这个维度。
我使用新的OSLog统一日志系统,因为macOS控制台可以观看应用程序记录的内容,而根本没有运行Xcode。然后我可以编写开始下载或上传的代码,终止应用程序,然后观察我插入的日志语句,以便通过macOS控制台观察后台重启应用程序。有关如何从macOS控制台观看iOS日志的教程,请参阅Unified Logging and Activity Tracing视频。