先说下网络开源的sip产品:

1)PJSIP   这是一个开源库,研究的不多,因为没有那个时间去重最基本的区开发,毕竟不是专门做这方面的,所以直接去找做好的开源产品。

2)linphone    这是我最开始找到的开源产品,网上推荐率很高,音质十分清晰,适合做点对点语音,但是开始着手的时候遇到两个问题,一 是国外资源封杀的厉害,资源十分难下载; 二 是其编译实在麻烦,下了一堆库和编译环境,完全按照官网的步骤,发现还是有些地方编译不过,在linphone上的编译上就耗了我一周时间,最主要的还是网络限制,大部分编译环境和工具都得在国外网站下载,耗了比较多时间,一周之后,我果断放弃linphone,继续找其他开源产品。

3)siphon       在陆续找到很多开源sip产品后,最后选择了siphon;两个原因, 一  比较好编译  二  音质还不错,这个软件基本的带电话和接电话功能,不过经过使用发现其没有后台接电话功能,最扯是我快弄完的时候才发现没有后台。后台部分下面后说到,这里只列举下我遇到的开源sip产品。

4)idoubs      这个就牛B了,这是在我发现siphon没有后台后,在经过网上各种说如何实现VIOP后台的帖子折磨后找到的一个开源软件,音质和linphone不相上下,且实现点对点视频功能,可以说满足了大部分人得需求了,编译也十分简单,按官网步骤走即可,两个文件夹,一个doubango库,这是基础库,很好的封装了sip电话的各种功能,比较大,大概850M;一个是idoubs,这个实现了sip电话的UI部分,这个才23M。这个最重要的是实现了后台运行和接电话功能,就是可以home键切出后可以有来电提醒,不过这个和网上说的利用  TCP+socket 来实现后台不同的是,这是利用后台播放静默音乐来实现,后台部分也有些bug,如 接真实电话、音乐播放软件后台播放和暂停、微信的语音播放都会打断这个静默音乐的播放,导致后台失败,破解方法后面会说到。

杂谈   一一   ios4之后 和  ios7新增 的后台部分知识:

前言:iOS不是真正的多任务系统,在用户按下Home按钮后,所有应用程序都会进入后台状态,并且大部分都会迅速进入暂停状态,应用程序的所有工作内存都在RAM中,在暂停时它完全不执行。因此,切换回这样的应用程序非常快。但是如果系统需要更多的内存给当前处于活动状态的应用程序,就有可能终结暂停状态的应用程序,它们的内存也将被释放。

一方面,应用程序在进入后台状态时,需要释放一些资源,使自身的暂停快照更小,从而减少从RAM中清除的风险,另一方面,为了避免被终结而丢失用户的数据,需要在用户离开时保存他们的进度信息,这些工作,需要在5秒钟内完成,不然会被系统认定有异常被强制退出。可能通过接收应用程序发送的通知

ios4及之后

1)请求后台任务 (600s 以内)beginBackgroundTaskWithExpirationHandler ^{}

作用 :  可以切后台后进行一些未完成的下载和比较重要的事情,如短时间的下载,消息的发送,未完成的上传,反正在600s内app可以做任何事情。

注意:按home键后,会运行一段时间来执行代码,如无代码,3分钟左右执行block。

按锁屏键后,ios6及之前会活跃来执行代码,但是在ios7中,后台任务处理方式发生改变,锁屏后后台任务暂时暂停已节省电力,之后在特定时间如检查邮件或接电话时,之前暂停的后台任务一起执行,就是说,系统不会专门为第三方应用保存设备处于活动状态。

用法:

<p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">- (<span style="color: #35568a">void</span>) doUpdate</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">{</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(88, 126, 168);"><span style="color: #000000">    [</span><span style="color: #35568a">self</span><span style="color: #000000"> </span>beginBackgroundUpdateTask<span style="color: #000000">];</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; min-height: 21px;">    </p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(207, 135, 36);"><span style="color: #000000">    </span>//<span style="font-family: 'Heiti SC Light';">重要任务 当然,这时app运行着,可以继续执行任何之前正在执行的代码  所有有时候重要任务只是sleep()<span style="white-space:pre"> </span>         <span style="color: rgb(207, 135, 36); font-family: Menlo; font-size: 18px; white-space: pre; background-color: rgb(240, 240, 240);">//</span>来请求时间运行app</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(195, 89, 0);"><span style="color: #000000">    </span>NSURLRequest<span style="color: #000000"> *request = [[</span>NSURLRequest<span style="color: #000000"> </span><span style="color: #587ea8">alloc</span><span style="color: #000000">]</span><span style="color: #587ea8">initWithURL</span><span style="color: #000000">:[</span>NSURL<span style="color: #000000"> </span><span style="color: #587ea8">URLWithString</span><span style="color: #000000">:</span><span style="color: #e82300">@"xxx"</span><span style="color: #000000">]];</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">    <span style="color: #c35900">NSURLResponse</span> * response = <span style="color: #35568a">nil</span>;</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">    <span style="color: #c35900">NSError</span>  * error = <span style="color: #35568a">nil</span>;</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">    <span style="color: #c35900">NSData</span> * responseData = [<span style="color: #c35900">NSURLConnection</span> <span style="color: #587ea8">sendSynchronousRequest</span>: request <span style="color: #587ea8">returningResponse</span>: &response <span style="color: #587ea8">error</span>: &error];</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; min-height: 21px;">    </p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(207, 135, 36);"><span style="color: #000000">    </span>// Do something with the result</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; min-height: 21px;">    <span style="color: rgb(207, 135, 36); font-family: Menlo; font-size: 18px; white-space: pre; background-color: rgb(240, 240, 240);">//如果没有这句,会</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(88, 126, 168);"><span style="color: #000000">    [</span><span style="color: #35568a">self</span><span style="color: #000000"> </span>endBackgroundUpdateTask<span style="color: #000000">];</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">}</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; min-height: 21px;">
</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">- (<span style="color: #35568a">void</span>) beginBackgroundUpdateTask</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">{</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(88, 126, 168);"><span style="color: #000000">    </span><span style="color: #35568a">self</span><span style="color: #000000">.</span>backgroundUpdateTask<span style="color: #000000"> = [[</span><span style="color: #c35900">UIApplication</span><span style="color: #000000"> </span>sharedApplication<span style="color: #000000">] </span>beginBackgroundTaskWithExpirationHandler<span style="color: #000000">:^{</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: 'Heiti SC Light'; color: rgb(207, 135, 36);"><span style="font-family: Menlo; color: rgb(0, 0, 0);">        </span><span style="font-family: Menlo;">//当系统后台时间即将结束的时候</span>,系统会运行这个代码结束,否则app不是缓存到内存,而是直接杀死app</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: 'Heiti SC Light'; color: rgb(207, 135, 36);"><span style="color: rgb(207, 135, 36); font-family: Menlo; font-size: 18px; white-space: pre; background-color: rgb(240, 240, 240);"><span style="white-space:pre">    </span>//当然,你可以继续backgroundTimeRemaining来获取剩余时间</span>
</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: 'Heiti SC Light'; color: rgb(207, 135, 36);"><span style="color: rgb(207, 135, 36); font-family: Menlo; font-size: 18px; white-space: pre; background-color: rgb(240, 240, 240);"><span style="white-space:pre">    <span style="color: rgb(207, 135, 36); font-family: Menlo; font-size: 18px; white-space: pre; background-color: rgb(240, 240, 240);">//就算被杀死,调用</span></span></span><span style="font-family: Menlo;">applicationWillTerminate继续执行 5s 来保存数据</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: 'Heiti SC Light'; color: rgb(207, 135, 36);"><span style="font-family: Menlo;"><span style="white-space:pre">    <span style="color: rgb(207, 135, 36); font-family: Menlo; font-size: 18px; white-space: pre; background-color: rgb(240, 240, 240);">//</span></span></span><span style="font-family: Menlo;">applicationDidEnterBackground 按home切后台执行,杀死并不执行</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(88, 126, 168);"><span style="color: rgb(0, 0, 0);">        [</span><span style="color: #35568a">self</span><span style="color: #000000"> </span>endBackgroundUpdateTask<span style="color: #000000">];</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">    }];</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">}</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; min-height: 21px;">
</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">- (<span style="color: #35568a">void</span>) endBackgroundUpdateTask</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">{</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(88, 126, 168);"><span style="color: #000000">    [[</span><span style="color: #c35900">UIApplication</span><span style="color: #000000"> </span>sharedApplication<span style="color: #000000">] </span>endBackgroundTask<span style="color: #000000">: </span><span style="color: #35568a">self</span><span style="color: #000000">.</span>backgroundUpdateTask<span style="color: #000000">];</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(88, 126, 168);"><span style="color: #000000">    </span><span style="color: #35568a">self</span><span style="color: #000000">.</span>backgroundUpdateTask<span style="color: #000000"> = </span>UIBackgroundTaskInvalid<span style="color: #000000">;</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo;">}</p><div>
</div>

2)iOS在后台每隔一段时间执行一下 (600s 以外)  setKeepAliveTimeout : time  handler : ^{}

作用:如app每隔一小时去刷新登录的key值,避免key值失效。

注意:1)要成功调用该函数,就必须在Info.plist里设UIBackgroundModes键的array值之一voip字符串;

2)timeout必须>=600;

3)唤醒app的时间间隔是不精准的;

4)唤醒后只有10秒执行时间。即handler里的代码要在10秒类执行完。10秒后app再次被阻塞。(可以         用-backgroundTimeRemaining属性来查看返回剩余时间);

5)该函数成功调用后,在程序生命周期内有效,该函数的效果在回到前台的状况下,依然有效。(因此可以         把它当timer使.) ;

6)clearKeepAliveTimeout函数用来清除handler;

用法:1)在info.plist里加入UIBackgroundModes键,其值为数组,数组之一为voip字符串;

2)如下;

<p style="font-family: Menlo; margin-top: 0px; margin-bottom: 0px; font-size: 18px;">- (<span style="color: #35568a">void</span>) viewDidLoad</p><p style="font-family: Menlo; margin-top: 0px; margin-bottom: 0px; font-size: 18px;">{</p><p style="font-family: Menlo; margin-top: 0px; margin-bottom: 0px; font-size: 18px; color: rgb(88, 126, 168);"><span style="color: #000000">    [</span><span style="color: #35568a">super</span><span style="color: #000000"> </span>viewDidLoad<span style="color: #000000">];</span></p><p style="font-family: Menlo; margin-top: 0px; margin-bottom: 0px; font-size: 18px; color: rgb(207, 135, 36);">
</p><p style="font-family: Menlo; margin-top: 0px; margin-bottom: 0px; font-size: 18px; color: rgb(207, 135, 36);"><span style="color: #000000">    </span>//<span style="font-family: 'Heiti SC Light';">刷新</span>KEY</p><p style="font-family: Menlo; margin-top: 0px; margin-bottom: 0px; font-size: 18px; color: rgb(88, 126, 168);"><span style="color: #000000">    [[</span><span style="color: #c35900">UIApplication</span><span style="color: #000000"> </span>sharedApplication<span style="color: #000000">] </span>setKeepAliveTimeout<span style="color: #000000">:</span><span style="color: #35568a">1</span><span style="color: #000000">*</span><span style="color: #35568a">60</span><span style="color: #000000">*</span><span style="color: #35568a">60</span><span style="color: #000000"> </span>handler<span style="color: #000000">: ^{</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; min-height: 21px;"><span style="font-family:Menlo;">        </span><span style="font-family: Menlo; color: rgb(207, 135, 36); font-size: 18px; line-height: 24px; white-space: pre; background-color: rgb(240, 240, 240);">//</span><span style="color: rgb(207, 135, 36); font-size: 18px; line-height: 24px; white-space: pre; background-color: rgb(240, 240, 240);"><span style="font-family:Heiti SC Light;">做一些你希望做的事情</span></span></p><p style="font-family: Menlo; margin-top: 0px; margin-bottom: 0px; font-size: 18px;">    }];</p><div style="font-family: Verdana, Arial, Helvetica, sans-serif;">}</div>

IOS7 新增的后台功能

前言:

在iOS7之前,系统所接受的应用多任务可以大致分为几种:

  • 后台完成某些花费时间的特定任务
  • 后台播放音乐等
  • 位置服务
  • IP电话(VoIP)
  • Newsstand

iOS7后台的变化在于以下四点:

  • 改变了后台任务的运行方式
  • 增加了后台获取(Background Fetch)
  • 增加了推送唤醒(静默推送,Silent Remote Notifications)
  • 增加了后台传输(Background Transfer Service)
1) 改变了后台任务的运行方式 : 这个在上面有提到,ios7 锁屏后 申请后台任务后不是立马运行

我的IOS端SIP电话开发历程相关推荐

  1. 微信小程序ios端唤醒不了拨打电话或者部分电话拨打不了解决方案

    目录 简介 技术 问题 解决方案 简介 主要解决微信小程序ios端唤醒不了拨打电话或者部分电话拨打不了问题,使用安卓手机就可以轻松的唤醒拨打电话. 技术 uni-app前端小程序框架 问题 在调试微信 ...

  2. linux命令行sip电话,基于Linux和MiniGUI的SIP电话终端设计

    0 引言 随着VoIP的迅猛发展,越来越多的个人用户正在使用软件电话.IP电话通过VoIP系统拨打国内和国际长途,IP电话的需求量越来越大,同时,人们对IP电话的要求也越来越高,例如要求IP电话体积小 ...

  3. 【网络通信 -- SIP 电话】项目实战记录 -- SIP 服务器 OPENSIPS 搭建测试与 SIP 客户端 PJSIP 编译安装测试

    [网络通信 -- SIP 电话]项目实战记录 -- SIP 服务器 OPENSIPS 搭建测试与 SIP 客户端 PJSIP 编译安装测试 [1]SIP 服务器 OPENSIPS 搭建 1.1 安装环 ...

  4. web端拨打电话、发送短信

    ** web端拨打电话.发送短信 ** 在做一个微信的微网站中的一个便民服务电话功能的应用,用到移动web页面中列出的电话号码,点击需要实现调用通讯录,网页一键拨号的拨打电话功能. 如果需要在移动浏览 ...

  5. armbian设置_基于Armbian大变身!仅需10分钟 Phicomm N1 变身千元SIP电话呼叫中心!...

    在armbian中安装Asterisk实现作为小型SIP电话呼叫中心功能,可以为100个终端以下的小型企业提供数字电话交换机功能,在某宝没有搜索到低于1000元的小型SIP呼叫中心交换机,安装完Ast ...

  6. 使用SIP 电话软件Express Talk,测试CISCO SPA系列IP电话

    想到自己的毕设,要使用一个PC软件端来检测,所以得提前做好准备,那么赶紧找一下SIP电话PC客户端 在试了3CX后,发现始终不发包,后来换了Express Talk,设置了代理,一下就拨通了SPA50 ...

  7. iOS端APP提交审核被拒绝包含用户生成内容必须有举报和拉黑功能

    最近iOS端APP更新提交App Store Connect审核时却多次被拒绝,因为我之前已经加举报功能, 最近iOS端APP更新提交App Store Connect审核时却多次被拒绝,因为我之前已 ...

  8. macw小教程:教你在Mac上登录iOS端游戏,原神ios电脑版教程

    iOS端的小伙伴们不可错的技能,现在有很多小伙伴都在玩原神手游,不过这是一个手游,那么可以在电脑上玩吗?下面小编就给亲们介绍下原神ios电脑版教程哈! playcover使用教程 以原神游戏为例(关闭 ...

  9. iOS端Socket连接、发送数据(一)

    一.Socket的应用 IM即时通讯是通过Socket的方式实现长连接,可运用于 (1)直播聊天室.礼物 (2)微信.QQ等即时聊天 (3)游戏对话.技能等 二.SOCKET原理 套接字(socket ...

  10. 在iOS端如何使用Charles用作http调试

    转:http://blog.csdn.net/messageloop3/article/details/9966727 在iOS端如何使用Charles用作http调试 After noticing ...

最新文章

  1. 4D毫米波雷达Radar
  2. helm部署仓库中没有的包_Kubernetes的Helm软件包管理器简介
  3. 红帽发布第四季度和2019财年报告,多项指标维持两位数增速
  4. 1049. Counting Ones (30)
  5. Oracle递归查询
  6. Boost Part III. 函数对象与高级编程 Library 10. Lambda 用法 switch_statement
  7. 深度学习篇| keras入门(一)
  8. Linux挂载windows中的共享目录步骤及问题解决方案(步骤清晰)
  9. c语言字符比较思路,C语言讲解思路资料
  10. 让lubuntu13.10中的virtualbox使用u盘
  11. “sudo: apt-get:找不到命令”的解决方法
  12. java outputstrea_java的InputStream和OutputStream的理解【转】
  13. HDU 4915 Parenthese sequence
  14. ionic—alert弹出框
  15. 服务器硬盘坏道修复教程视频,坏道和坏块什么区别?硬盘高级修复教程来了
  16. ajax获取qq音乐源码,jsonp的运用(获取qq音乐首页数据)以及用Promise的封装
  17. 吃鸡一直显示服务器,吃鸡一直显示服务器未连接 | 手游网游页游攻略大全
  18. C# 读取Excel表格内图片
  19. AI化身心脏病“专家” 为心脏健康保驾护航
  20. JavaSE练习题之不死神兔

热门文章

  1. vue获取tr内td里面所有内容_点击td获取tr的所有值
  2. linux chsh命令参数及用法详解(linux设置系统shell命令) 详细出处参考:http://www.jb51.net/LINUXjishu/57945.html
  3. minio error occured
  4. ts 正负条形图 组件_手把手教你使用ggplot2绘制条形图
  5. 【LeetCode刷题-中等】2. 两数相加(python c++)
  6. java中判断指定日期是星期几
  7. javascript 忽略 报错_JavaScript数据类型中易被忽略的点
  8. SqlServer与MySql的一些常用用法的差别
  9. C# 使用NPIO在excel指定单元格写内容,合并单元格
  10. 折弯机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告