分类: Iphone2013-01-24 14:03 986人阅读 评论(0) 收藏 举报
我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在后台下载或者与服务器保持连接的App是如何突破600秒的限制的呢?像网易公开课就可以在后台持续下载,优酷也可以在后台持续缓存,这是怎么做到的呢?一般来说,要实现iOS长时间后台运行,需要声明VOIP、Audio或GPS。
Audiosession
实现方法很简单,就是在后台一直播放一个无声的音乐文件,这样就相当于声明了Audio,就可以轻松突破600秒的限制了。
通过播放“静默”音让程序在后台执行的做法(即在audiounit回调函数中使用kAudioUnitRenderAction_OutputIsSilence标志位),虽然确实可以实现后台执行,但实践中限制很多。最大的问题就在于程序的audiosession不能被打断。当程序执行在后台时,只要另一个程序使用kAudioSessionCategory_RecordAndPlay(比如Skype)或者kAudioSessionCategory_SoloAmbientSound(印象中使用这个session的不多),那么本程序就会被立即打断。
打断本身不是问题,但当播放程序被打断时,唯一能够获得的只有处理audiosessioninterruption的很短一段时间。我的实验测试大概是3到5秒,但因为程序随后立即暂停,无法挂调试器,所以很难准确估计,然后程序就会被立即转入休眠状态。这点时间和applicationDidEnterBackground回调函数所用的时间大体相当,但是因为这个打断中间还伴随一个播音的回调动作,程序结构不是很好组织,在很多情况下是不够做现场保存工作的。
不推荐播放“静默”音的另一个问题它的恢复播放需要的场景非常麻烦。比如当一个iOS程序在后台被VOIP唤醒时,它是不能直接获得audiounit重新开始播音的。如果此时调用AudioOutputUnitStart(),会返回一个错误码,哪怕前台没有任何一个程序在运行也是如此。此时你不可能让程序重新进入稳定运行状态。有些没经验的程序员喜欢利用audiosessioninterruptionhandler做所谓的自动播放恢复,但他们其实都没有注意到audiosessioninterruption的状态恢复回调并不会保证被调用。目前实测能自动恢复调用的,大概也就只有内建的电话拨号程序,以及一些非常特殊的场景(比如你用一个MP3播放器打断audiosession,然后杀掉MP3播放器进程,然后把被打断的程序重新置回前台)。这样经常导致的结果,就是你开心地发现程序没问题,然后在放进生产环境中发现各种时不时的崩溃或启动失败。
VOIPsocket
VOIPSocket可以在后台运行。当程序进入后台时,事实上整个程序被暂停运行,但VOIPsocket因为受系统控制而不在此列。我的观察是,每次有新的数据来临时,程序会被唤醒并执行大约几秒钟,然后再次进入休眠。Stackoverflow上的说法是10秒钟,但我不确定,可能是我的试验不够精确

转载于:https://www.cnblogs.com/lingzeng/p/3987651.html

实现iOS长时间后台的两种方法:Audiosession和VOIP(转)相关推荐

  1. oppo手机android系统进程,OPPO手机应用软件怎么在后台运行?OPPO软件后台运行两种方法...

    明明按了Home键让APP在后台运行,结果再进来时,却回不了原先的界面,相当于重新启动了APP!相信不少小伙伴都遇到过这种情况,对于杀怪杀到一半的孩纸,更是痛彻心扉-- 要解决问题很简单,这里有两种方 ...

  2. 求最长XX序列的两种方法

    此类问题一般常用的有两种算法,时间复杂度分别是O(n^2)和O(nlogn) 第一种,普通算法,用一个标记数组标记包括当前数的最长序列的长度,然后往前递归寻找,此类方法这里不多说了 文章的dp问题里已 ...

  3. mysql 把时间戳转时间格式_mysql时间戳转成常用可读时间格式的两种方法

    使用EXECL转换时间戳的公式为: 代码:=(xxxxxxxxxx+8*3600)/86400+70*365+19 使用MYSQL语句解释时间戳语法举例: 代码: SELECT FROM_UNIXTI ...

  4. 请用两种java方式显示今天的日期_日期时间显示格式的两种设置方法

    在国内行业的各类报表中日期和时间可以算是最长见的一个数据单位了,几乎所有的报表都可以和时间拉上关系,而且报表浏览者也大都要求报表中有时间日期,这样才能让报表信息更清晰明了.但是时间和日期在数据库中的存 ...

  5. IOS开发中发送Email的两种方法

    IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController.借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能. ...

  6. iOS: JS和Native交互的两种方法,iosjsnative交互

    iOS: JS和Native交互的两种方法,iosjsnative交互 背景: UIWebView: iOS 用来展示 web 端内容的控件. 1. 核心方法: - (NSString*)string ...

  7. python制作系统程序与html交互_python+html语音人物交互_flask后台与前端(html)交互的两种方法...

    基于python flask框架搭建web flask后台与前端(html)交互的两种方法: 方法1 使用flask-wtf 提供的表单 用常见的登录为例: // An highlighted blo ...

  8. Django 后台admin管理页面添加简易导出/下载数据功能的两种方法

    在Django中有时候需要在后台界面需要用到导出数据的功能,对于功能要求比较高的可以直接使用Import_Export库来完成.但是对于一些简单的数据导出,可以直接自定义一些简单的函数来实现导出数据. ...

  9. android 获取当前时间精确到毫秒的两种方法

    1.概述 在android app开发中,在项目中有些功能需求要求要获取当前时间精确到毫秒,已便于完成功能开发的需要,而在android 的系统api中提供了SimpleDateFormat和Cale ...

最新文章

  1. 获得html元素自身的宽度
  2. 皮一皮:浓浓的父爱...
  3. ajax查询返回字符串,从CFC返回结果之前,对AJAX查询执行字符串函数
  4. 线段树什么的最讨厌了
  5. 花开的声音 - 张靓颖
  6. PHP学习笔记(六)
  7. 软硬件负载均衡器:F5、Array、Nginx、LVS、HAProxy
  8. STM32:win10装CH340驱动、获取删除权限
  9. 15.Object Manager
  10. 安装这5个插件后,PyCharm好用到起飞
  11. HackTheBox You know racecar 格式化字符串漏洞pwn题目
  12. 【Linux】Linux系统编程入门
  13. 论文:Linguistic Structure Guided Context Modeling for Referring Image Segmentation
  14. 全硬件TCP/IP协议栈学习笔记(第十一天:FPGA+W5500 PING通)
  15. visio中将图片改为平行四边形_如何用Photoshop将一张长方形的照片变成平行四边形?...
  16. 历数OpenMobile开发的一些坑
  17. qgraphicsitem 复制副本,QGraphicsItem:调用paint函数时
  18. AES解密失败 WxMaCryptUtils.decrypt(sessionKey,encryptedData, iv)
  19. TensorFlow实践(15)——使用tf.device方法指定节点执行设备
  20. Ubuntu Windows双系统切换最简方法!!!

热门文章

  1. springMVC中获取request 对象
  2. cmd合并多个ts文件,ffmpeg快速转ts为mp4文件,通过m3u8合并文件
  3. 快速掌握 深度学习(Deep Learning) 常用概念术语,常用模型
  4. Codeforces Round #716 (Div. 2) C. Product 1 Modulo N
  5. 【NOIP2007】【Luogu1093】奖学金
  6. android 腾讯 gt,源码解读腾讯 GT 的性能测试方案
  7. Python入门--元组的创建,(),tuple()
  8. Python入门--列表元素的删除,remove(),pop(),切片,clear(),del
  9. Python源码深度解析—float类型对象
  10. 试题5 算法训练 猴子吃包子