后台传输在iOS中是如何工作的



我一直在使用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. 假设第一个问题的答案是肯定的,我如何删除handleEventsForBackgroundURLSession中的httpBody?这是一个临时文件,一旦传输完成就不需要了
  3. 如果有人详细解释后台传输在iOS中的工作原理,我将不胜感激。也就是说,当创建内存时,在哪些状态下调用哪些回调,以及传输完成后如何唤醒应用程序。谢谢

当调用应用程序代理的handleEventsForBackgroundURLSession时,您应该:

  • 保存完成处理程序
  • 实例化您的背景NSURLSession
  • 让您的所有委托方法都被调用
  • 在您的URLSession:task:didCompleteWithError:中,您可以删除这些临时文件;以及
  • URLSessionDidFinishEventsForBackgroundURLSession:中,您可以调用保存的完成处理程序

一些附加注释:

  • 对于应用程序终止时会发生什么,似乎有些困惑。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新