我一直在使用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
- 假设第一个问题的答案是肯定的,我如何删除
handleEventsForBackgroundURLSession
中的httpBody
?这是一个临时文件,一旦传输完成就不需要了 - 如果有人详细解释后台传输在iOS中的工作原理,我将不胜感激。也就是说,当创建内存时,在哪些状态下调用哪些回调,以及传输完成后如何唤醒应用程序。谢谢
当调用应用程序代理的handleEventsForBackgroundURLSession
时,您应该:
- 保存完成处理程序
- 实例化您的背景
NSURLSession
- 让您的所有委托方法都被调用
- 在您的
URLSession:task:didCompleteWithError:
中,您可以删除这些临时文件;以及 - 在
URLSessionDidFinishEventsForBackgroundURLSession:
中,您可以调用保存的完成处理程序
一些附加注释:
-
对于应用程序终止时会发生什么,似乎有些困惑。
如果应用程序在其正常生命周期中终止,
URLSession
守护进程将继续后台请求,完成上传,然后在完成后唤醒应用程序。但手动强制退出应用程序(例如,双击主页按钮,向上滑动应用程序以强制退出)是完全不同的事情(实际上,用户是在说"停止这个应用程序及其相关的一切")。这将停止后台会话。因此,是的,后台会话将在应用程序终止后继续,但如果用户强制退出应用程序,则不会。
-
您将讨论设置断点并在Xcode中观察这一点。你应该意识到,附加到Xcode的过程会干扰正常的应用程序生命周期(它会让它在后台运行,防止它被挂起,或者在正常的事件过程中终止)。
但是,在测试后台会话相关代码时,在应用程序终止时测试
handleEventsForBackgroundURLSession
工作流是至关重要的,因此,我建议在测试此维度的后台会话时不要使用Xcode调试器。我使用新的OSLog统一日志记录系统,因为macOS控制台可以查看应用程序记录的内容,而根本没有运行Xcode。然后,我可以编写代码,开始下载或上传,终止应用程序,然后观看我插入的日志记录语句,以便通过macOS控制台在后台观察应用程序的重新启动。有关如何从macOS控制台观看iOS日志的教程,请参阅统一日志记录和活动跟踪视频。