我目前正在开发一个iOS应用,该应用涉及将视频(从内置摄像头)录制和上传到服务器。
一切正常,花花公子,但对于新版本,客户要求一个新功能:继续此过程而无需在屏幕上显示该应用程序并处于 Activity 状态。
目前,您录制视频,将其作为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)
有了这些功能,无论应用程序是否已最小化,“begin”函数之后的任何代码都将运行,直到调用“end”函数为止。稍作调整,我就可以使文件按顺序上载,并在处理完成后发布通知。
我还没有看到这种解决方案的暗示,所以这可能不是一个好主意,但似乎可行。