Bob*_*nch 13 video upload background ios swift
我目前正在开发一个iOS应用程序,它涉及录制和上传视频(从内置摄像头)到服务器.
这一切都工作得相当精细和花花公子,但对于新版本,客户已经请求了一个新功能:继续这个过程,而不需要应用程序在屏幕上,并激活.
目前,您录制视频,将其作为MP4存储在文件系统上,后台线程将文件上传到服务器.这一切都发生在应用程序打开时,最终在一个屏幕上,它基本上告诉您等到该过程完成.
如果您按下主页按钮以"最小化"应用程序(我不熟悉iOS术语,请原谅我),目前所有上传过程都已暂停.客户希望拥有它,以便您可以在此过程继续时最小化并执行完全不同的操作,并在上载完成后显示通知.
我的理解是iOS提供了一些特殊的下载,流媒体音乐和位置信息的案例.
据说曾经有一段时间你可以获得十分钟左右的背景时间,同时你的应用程序被最小化以完成任务 - 之后iOS会强制暂停一切,直到应用程序在前面并再次激活.这显然已经在iOS的新版本中发生了变化,这意味着您不能再依赖于特定的数字了 - 但无论如何,十分钟并不是很好.
我可以想到滥用上述功能的hacky方法,但是我很担心Apple可能会在iTunes提交过程中发现这一点.我真的在寻找一种更干净的方法 - 如何在应用程序最小化的同时继续上传视频?
我假设有一个解决方案 - Dropbox可以处理这种情况?
Bob*_*nch 13
令人惊讶的是,我得到了一些这方面,尽管有很多指南暗示它几乎是不可能的,甚至Dropbox承认它必须做一个hacky基于位置的事情.
代码使用NSURLSession类,并且为了上传,您使用其uploadTaskWithStreamedRequest()方法,传递HTTP请求并获得NSURLSessionUploadTask实例作为回报.
然而,我没有立即清楚的是,"恢复"该任务导致文件独立于应用程序的其余部分上传,即当应用程序最小化时,此任务将继续,直到它完成或iOS强制它暂停.
从某种意义上说,我已经实现了我的要求而没有意识到,但是这个任务仍然可以在几秒钟后被iOS中断.应用程序的其余部分也会暂停,因此通信会受到阻碍,直到应用程序再次返回到前端.
诀窍是这两种方法:
uploadTaskID = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({})
和
UIApplication().sharedApplication().endBackgroundTask(uploadTaskID)
有了这些,"begin"函数之后的任何代码都将运行,无论应用程序是否被最小化,并且将一直执行,直到调用"end"函数.通过一些调整,我已经能够顺序上传文件并在完成该过程后发布通知.
我没有看到这个解决方案被暗示,所以这可能是一个坏主意,但它似乎有效.