后台传输如何在 iOS 中实际工作?

sia*_*shk 2 networking cocoa-touch ios 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];
Run Code Online (Sandbox Code Playgroud)

在 中someDelegate,我已实施didSendBodyData,didCompleteWithErrorhandleEventsForBackgroundURLSession.

我有三个问题:

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

Rob*_*Rob 5

当应用程序委托handleEventsForBackgroundURLSession被调用时,您应该:


一些额外的注意事项:

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

    如果应用程序在其正常生命周期过程中终止,URLSession守护进程将保持后台请求继续进行,完成您的上传,然后在完成后唤醒您的应用程序。

    但是手动强制退出应用程序(例如,双击主页按钮,在应用程序上向上滑动以强制退出)是完全不同的事情(实际上,用户在说“停止此应用程序及其相关的所有内容”) . 这将停止后台会话。所以,是的,后台会话将在应用程序终止后继续,但是,不,如果用户强制退出应用程序,则不会。

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

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

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