后台传输如何在iOS中实际运行?

时间:2017-10-27 18:41:27

标签: ios cocoa-touch networking nsurlsession

我一直在使用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中,我实施了didSendBodyDatadidCompleteWithErrorhandleEventsForBackgroundURLSession

我有三个问题:

  1. 我注意到如果我在上传过程中关闭应用程序,转移将继续并成功完成。在应用程序关闭时传输完成后调用handleEventsForBackgroundURLSession
  2. 假设第一个问题的答案是肯定的,我如何删除httpBody中的handleEventsForBackgroundURLSession?这是一个临时文件,传输完成后不需要。
  3. 如果有人详细解释了背景转移在iOS中的运作方式,我将不胜感激。这就是创建内存的时间,在哪些状态下调用哪些回调以及在传输完成后如何唤醒应用程序。感谢。

1 个答案:

答案 0 :(得分:4)

当调用app delegate handleEventsForBackgroundURLSession时,您应该:

一些补充说明:

  • 关于应用程序终止时会发生什么似乎有些混乱。

    如果应用程序在正常生命周期内终止,URLSession守护程序将保留后台请求,完成上传,然后在应用完成后唤醒它。

    但手动强制退出应用程序(例如,双击主页按钮,向上滑动应用程序以强制退出)是完全不同的事情(实际上,用户说"停止此应用程序和与它相关的一切")。这将停止后台会话。所以,是的,应用程序终止后,后台会话将继续,但是,不,如果用户强制退出应用程序,则不会。

  • 您谈到在Xcode中设置断点并观察它。您应该知道,附加到Xcode的过程会干扰正常的应用程序生命周期(它会使其在后台运行,防止它被暂停,或者在正常的事件过程中终止)。

    但在测试与后台会话相关的代码时,在应用程序终止时测试handleEventsForBackgroundURLSession工作流程至关重要,因此为此,我建议在测试时不要使用Xcode调试器背景会话的这个维度。

    我使用新的OSLog统一日志系统,因为macOS控制台可以观看应用程序记录的内容,而根本没有运行Xcode。然后我可以编写开始下载或上传的代码,终止应用程序,然后观察我插入的日志语句,以便通过macOS控制台观察后台重启应用程序。有关如何从macOS控制台观看iOS日志的教程,请参阅Unified Logging and Activity Tracing视频。