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

标签 ios swift video background upload

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

一切都运行得相当不错,但对于新版本,客户请求了一个新功能:继续这个过程,而不需要应用程序在屏幕上启动并处于事件状态。

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

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

我的理解是 iOS 为下载、流媒体音乐和位置信息提供了一些特殊情况。

据说曾几何时,当您的应用程序最小化以完成任务时,您可以获得十分钟左右的后台时间 - 之后 iOS 将强行暂停所有内容,直到该应用程序重新出现并再次激活。这显然已在较新版本的 iOS 中发生了变化,这意味着您不能再依赖特定的数字 - 但十分钟无论如何都不够好。

我能想到滥用上述功能的怪异方法,但我有点担心 Apple 可能会在 iTunes 提交过程中发现这一点。我真的在寻找一种更简洁的方法 - 如何在应用程序最小化的情况下继续上传视频?

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

最佳答案

令人惊讶的是,尽管有相当多的指南表明这实际上是不可能的,甚至是 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)

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

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

关于ios - 在 iOS 应用程序处于后台时上传视频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36749034/

相关文章:

javascript - Kinetic Js Canvas 视频与 JavaScript

ios - 如何设置Parse登录查询的超时时间?

android - 在 `adb forward` 和 `usbmuxd` 的情况下,谁应该是 socket 服务器,谁应该是客户端

ios - replaceItemAtURL : method fails to remove original moved files in some cases

java - FFMPEG 创建用于将原始帧添加到 AVI 文件(无输入文件)的内部管道

ios - UIWebView 嵌入式 YouTube 视频播放的状态栏问题

objective-c - 通过 iOS SDK 跟踪对 Open Graph 的单个请求

ios - URLRequest 编码未捕获特殊字符

ios - 在 Swift 中使用 FMDB 回滚事务

ios - 为什么我不能将收到的(通过 alamofire 调用) token 放入我的 swift 应用程序的钥匙串(keychain)中?