关闭

What Dose the Linphone Do When Starting?

标签: linphonesdk详解
437人阅读 评论(0) 收藏 举报
分类:

1.写在前

1.1.Linphone

Linphone,开源项⺫⽬目,集成了 SIP协议和 MediaStream2库,SIP协议的实现使⽤用的是Belle-SIP(⼀个开源的SIP实现),带有⾳音视频回话和短消息的聊天功能。

1.2.Liblinphone
Linphone
应⽤用程序使⽤用的SDK 。通过该SDK ,完成SIP 的交互。

2. Linphone的启动过程都做了什么?

使⽤用Linphone ⼀一年以来,其启动的过程中,都做了些什么,分为哪⼏几个步骤,⼀一直不太清楚。所以想着能有⼀一些关于源码的解释,虽不能说是详解,但是对于了解⼀一些APP 运⾏行机制的⼈人来说,说到这个地步做够了,你继续做的就是对Linphone API 的了解和掌握。

代码解释是基于iOS 版本的Linphone .

1.程序启动
2. didFinishLaunchWithOptions:

2.1.注册远程推送通知
2.2.创建 LinphoneManager实例,该实例是⼀一个单例对象

2.2.1.监听 AudioSessionAudioRouteChange属性,设置 callback,其⺫⽬目的是监听⾳音轨的改变,如外放,耳⻨等。

2.2.2.设置短消息的声⾳音播放器( AVAudioPlayer)2.2.3.设置震动提⽰示

2.2.4.设置 logdatabasespeakerEnableBluetoothEnabletunnelModependingCallIDFromRemoteNotifphotoLibrary

2.2.5. copy 所有的默认设置。把程序包中的所有资源copyApp的沙盒中。

2.2.6.使⽤用默认的配置⽂文件初始化LPConfig,这个对象(结构体)是LinphoneCore所使⽤用的配置对象。

2.2.7.根据 LPConfig对象中的 debug_preference设置lp中的debug 特性。若,配置⽂文件中未声明启⽤用debug模式,就开启。除⾮非,声明禁⽤用 debug 模式,才会禁⽤用,该模式,会设置log 的输出。

2.2.8.NSUserDefaults中的配置选项迁移到 lpconfig中,主要的配置有background_mode,debug_enable, start_at_boot (开机启动)这三个配置属性。PS:之所以有这个合并的操作,是为了合并Linphone的⽼老版本,估计之前所有的配置选项都放到了 NSUserDefaults 中。

2.3.如果程序启动之后是在后台运⾏行的,并且,⾃自启动被禁掉了,或者是不允许后台运⾏行,就不再加载LibLinphone 了。

2.4.设置⼀一个后台⻓长任务运⾏行的标记,如果不设置,程序在执⾏行后台⻓长任务的时候,会被系统挂起。

2.5.通过2.3对配置⽂文件的检查,程序可以启动LibLinphone

2.5.1.检查 LibLinphone是否已经启动,如果启动,什么也不做,否则,继续。

2.5.2.使⽤用 Signal(SIGPIPE,SIP_IGN),忽略TCP异常关闭。如果不对这个SIGPIPE 信号忽略,对⼀一个对方已经关闭的socket ,发送write 命令,系统会告知该信号,对于Linux 来说,程序对这个信号的默认操作是关闭应⽤程序。

2.5.3.创建 Linphone Core

2.5.3.1.校验 theLinphoneCore是否存在,若存在,则返回。否则,继续。

2.5.3.2.初始化各种依赖库,主要是⾳音视频的插件。如 mediastream2 及各个插件 ilibc, silk,amr, x264, openh264, bcg729等。

2.5.3.3.查看 lpconfig中的 debug配置。若允许,开启 debug模式,为 Linphone Core设置⼀一个log的回调。并且此时ORTP 依然开启,使⽤用ORTP 记录log,设置log 的级别。

2.5.3.4.设置 log的存放的位置,放在 App沙盒的 cache⺫⽬目录,并根据 lpconfig中的enable_debug属性,设置是否开启 log

2.5.3.5.使⽤用 lpconfig对象和⼀一个存放所有回调的结构体,创建 linphoneCore.

2.5.3.6.设置 LinphoneCoreCA(证书)。LinphoneCore使⽤用这些证书数据去认证TLS连接,只有设置使⽤用SIP transport TLS的时候,才会使⽤用这些CA 数据。

2.5.3.7.设置⼏几个全局的观察者。AudioSessionInterruptLinphoneGlobalStateChangedLinphoneConfiguringStateChanged

2.5.3.8.⽴立即调⽤用一个 Core的迭代⽅方法,⺫⽬目的是为了让 App ⽴立即连接SIP Server 或者是远端的 provisioning信息。

2.5.3.9.开启一个定时器,0.02秒调⽤用⼀次迭代函数。

2.5.4.迁移 Multi-Transport Core

2.5.5.把其他的 AppAudioSession设置为⾮非激活状态,如,有别的应⽤用程序在播放声⾳音,或者在录⾳音,需要先将其处于⾮非活跃状态。

2.5.6.如果⾳音频输⼊入设备不可⽤用,给⽤用户提⽰示,让其插⼊入⽿耳机。

2.5.7.如果程序在后台运⾏行,直接进⼊入后台模式

2.5.7.1.获取 proxyConfig,只因为 lpconfigproxy存在才能取 lpconfig中的值。

2.5.7.2.在存在proxy的情况下,查看lpconfig 否⽀支持background mode push

notification ,若⽀支持其中的任何⼀个,就需要刷新注册器(SIP 的注册机制使⽤用的注册器)。

2.5.7.3.如⽀支持 background mode,需要开启以keep alive,在600秒之后,若Core还存在,做最后一次的刷新。

2.5.7.4.挂起所有的电话,并创建⼀个长任务中。

2.5.7.5.关掉 VideoPreview(预览)

2.5.7.6.发送⼀个 stop dtmf的信号

2.5.7.7.如果是一个简单的后台模式,直接把network reachable置为 NO

2.6.初始化UI
2.6.1. DialerViewController
,所有的账号信息已经填充好,可以启动。

2.6.2. FirstLoginViewController,未填充⽤用户名和密码信息,需要⽤用户⾃自⼰己填写。

2.6.3. WizardViewController,未填充⽤用户名和密码,有四种⽅方式向导完成配置。

2.6.3.1.linphone.org上创建账号
2.6.3.2.已有 linphone.org账号,使⽤用该账号登录

2.6.3.3.一个私有 SIP服务器上的账号,使⽤用该账号登录

2.6.3.4. 使⽤用远端的 provisioning 登录

2.7. ⽤用户信息配置完成,程序启动成功。

3.总结

通过Linphone 的启动过程可以看出,对于这种复制应⽤用的设计,一定要做好详细的设计,层次⼀一定要分明,尽量不要跨层访问对象。做到底层库和上次UI的分离。 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12113次
    • 积分:323
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类