我目前正在开发一款iOS应用,包括录制和上传视频(从内置摄像头)到服务器。
这一切都工作得相当精细和花花公子,但对于新版本,客户已经请求了一个新功能:继续此过程,而无需在屏幕上显示应用程序,并激活。
目前,您录制了一个视频,它作为MP4存储在文件系统上,后台线程将该文件上传到服务器。这一切都发生在应用程序打开时,最终在一个屏幕上,它基本上告诉您等到该过程完成。
如果您按下主页按钮以"最小化"应用程序(我不熟悉iOS术语,原谅我),目前所有上传过程都暂停了。客户希望拥有它,以便您可以在此过程继续时最小化并执行完全不同的操作,并在上载完成后显示通知。
我的理解是iOS为下载,流媒体音乐和位置信息提供了一些特殊情况。
据说曾经有一段时间你可以获得十分钟左右的背景时间,同时你的应用程序被最小化以完成任务 - 之后iOS会强制暂停一切,直到应用程序在前面并再次激活。这显然已经在iOS的新版本中发生了变化,这意味着您不再依赖于特定的数字了 - 但无论如何,十分钟并不是非常好。
我可以想到滥用上述功能的hacky方式,但我半信半疑的Apple可能会在iTunes提交过程中发现这一点。我真的想找一个更干净的方法 - 如何在应用程序最小化的同时继续上传视频?
我假设有一个解决方案 - Dropbox可以处理这种情况吗?
答案 0 :(得分:13)
令人惊讶的是,我找到了这方面的内容,尽管有很多指南表明这几乎是不可能的,甚至是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”函数。通过一些调整,我已经能够顺序上传文件并在完成该过程后发布通知。
我没有看到这个解决方案被暗示,所以这可能是一个坏主意,但它似乎有效。