在 iOS 应用程序处于后台时上传视频文件?

Posted

技术标签:

【中文标题】在 iOS 应用程序处于后台时上传视频文件?【英文标题】:Uploading video files while iOS app is in background? 【发布时间】:2016-08-13 10:34:41 【问题描述】:

我目前正在开发一个 ios 应用程序,该应用程序涉及录制视频并将视频(从内置摄像头)上传到服务器。

这一切都运行得相当好和花花公子,但对于一个新版本,客户要求一个新功能:继续这个过程,而不需要应用程序在屏幕上显示,并且处于活动状态。

目前,您录制视频,将其作为 MP4 存储在文件系统上,后台线程将文件上传到服务器。这一切都在应用程序打开时发生,最终出现一个屏幕,该屏幕基本上告诉您等待该过程完成。

如果您按下主页按钮以“最小化”应用程序(我不熟悉 iOS 术语,请原谅),目前所有上传过程都会暂停。客户希望拥有它,以便您可以最小化并在此过程继续进行时做一些完全不同的事情,并在上传完成后显示通知。

我的理解是,iOS 为下载、流媒体音乐和定位内容提供了一些特殊情况。

假设曾几何时,当您的应用程序被最小化以完成任务时,您可以获得十分钟左右的后台时间 - 之后 iOS 会强制暂停所有内容,直到应用程序再次处于前台并再次处于活动状态。这显然已经在较新版本的 iOS 中进行了更改,这意味着您不能再依赖特定的数字了 - 但无论如何,十分钟还不够好。

我可以想到滥用上述功能的骇人听闻的方式,但我有点担心 Apple 可能会在 iTunes 提交过程中发现这一点。我真的在寻找一种更简洁的方法 - 如何在应用最小化的同时继续上传视频?

我假设有一个解决方案 - Dropbox 可以处理这种情况?

【问题讨论】:

据我所知,你不能这样做,特别是如果 10 分钟还不够长的话。 iOS 根本不希望应用在后台运行。 【参考方案1】:

令人惊讶的是,尽管有不少指南认为这几乎是不可能的,甚至 Dropbox admitting it has to do a hacky location-based thing,但我还是得到了这个结果。

代码使用了 NSURLSession 类,对于上传,您使用它的 uploadTaskWithStreamedRequest() 方法,传递一个 HTTP 请求并获得一个 NSURLSessionUploadTask 实例作为回报。

然而,我并没有立即清楚的是,“恢复”该任务会导致文件独立于应用程序的其余部分上传,即当应用程序最小化时,此任务会一直持续到它完成或 iOS强制它暂停。

从某种意义上说,我已经在不知不觉中实现了我的要求,但是这个任务仍然可以在几秒钟后被 iOS 中断。应用程序的其余部分也会暂停,因此在应用程序再次回到前面之前,通信会受到阻碍。

诀窍是这两种方法:

uploadTaskID = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler()

UIApplication().sharedApplication().endBackgroundTask(uploadTaskID)

有了这些,“begin”函数之后的任何代码都将运行,无论应用程序是否被最小化,并且会一直运行到“end”函数被调用。通过一些调整,我已经能够让文件按顺序上传并在该过程完成时发布通知。

我还没有看到这个解决方案被暗示,所以这可能是个坏主意,但它似乎有效。

【讨论】:

这是钱。比我发现的其他“解决方案”效果更好。 这个答案是纯宝石,脱帽致敬:D 使用带有后台配置的 URLSession 上传任务似乎是可行的方法。但这并不适合你,对吗?相反,文档 (developer.apple.com/documentation/uikit/uiapplication/…) 表明使用您的方法只能为您的任务提供有限的时间,并且“如果您在时间到期之前不调用 endBackgroundTask:对于每个任务,系统会终止该应用程序。”你只是走运吗?还是您提到的“调整”用于绕过这个时间限制?你能详细说明一下吗? 我认为 begin 和 end 提供的时间应该足以处理后台进程,如果不是,则意味着需要一个块上传过程。 Twitter 在他们的 API 中使用这种块方法,例如,他们的 API 旨在进行块上传,每个块需要合理的秒数才能完成。他们还提供了一种检查上传进度的方法,但这也意味着缓存上传队列,然后在应用程序在前台处于活动状态时依次检查和释放。 必须注意 - If you do not call endBackgroundTask: for each task before time expires, the system kills the app. If you provide a block object in the handler parameter, the system calls your handler before time expires to give you a chance to end the task 根据 Apple 开发者文档。要检查的参数是backgroundTimeRemaining

以上是关于在 iOS 应用程序处于后台时上传视频文件?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms iOS - 当设备连接互联网时开始上传数据,即使应用程序当前未处于活动状态或处于后台也是如此

上传大型视频iOS时延长后台任务超时时间[关闭]

当我的 iOS 应用程序处于前台时,如何使本地通知静音?

在应用程序处于后台时访问 PHPhotoLibrary

在后台 iOS Xcode 中获取信标通知

当应用程序处于后台或设备锁定时,Airplay 停止播放视频流