linphone-iphone的安裝與調(diào)試

linphone是一款老牌的全平臺的多人語音視頻通話業(yè)務的軟件(始自2001年)背捌,不僅支持視頻和語音通話,還支持即時消息(可惜只支持文本和圖片)固蚤。
當然,重要的是:linphone是開源的烈钞,畢竟linphone的sip服務和媒體數(shù)據(jù)處理也大量使用開源框架泊碑;更重要的是,linphone官網(wǎng)提供免費的sip服務毯欣,這也意味著你不需要自己手動搭建sip服務即可享受voip業(yè)務蛾狗,這對于有voip需求的前端來說無疑是最佳的選擇。但是雖然開源仪媒,linphone的工程比較龐大,依賴項較多谢鹊,編譯的過程中容易出現(xiàn)問題算吩,那么下面,我將介紹自己linphone-iphone的安裝歷程佃扼。

linphone-iphone的下載

首先進入官網(wǎng)偎巢,可以看到linphone的多個產(chǎn)品線,最感興趣的肯定是liblinphon了兼耀,但是這是個坑压昼,一方面,開發(fā)文檔幾乎沒有瘤运,根本無從下手窍霞;另一方面,編譯的過程相當痛苦拯坟,成功率不高但金,就算編譯出來了也沒有成就感可言,不僅需要花費大量的時間寫Demo做測試郁季,你還要考慮如何搭建SIP服務器冷溃。
如果想體驗并快速學習相關(guān)的接口,我建議去linphone這一欄梦裂,在downloads目錄下似枕,你可以看到所有平臺的產(chǎn)品都是可以下載源碼的,這里選擇iphone版年柠。你有兩種選擇凿歼,要么選擇官網(wǎng)的git://git.linphone.org/linphone-iphone.git,要么選擇github上的git://git.linphone.org/linphone-iphone.git彪杉,其實效果差不多毅往,但是記住不要手動下載,而是使用git命令clone到本地派近,因為模塊中的很多依賴庫代碼都沒有放在項目中攀唯,需要通過git鏈接下載。

linphone官網(wǎng)
linphone官網(wǎng)

打開終端渴丸,有iTerm2更好侯嘀,cd到項目放置的目錄另凌,輸入git clone git://git.linphone.org/linphone-iphone.git命令開始下載,你會發(fā)現(xiàn)一切順利戒幔,很快便下載完成吠谢,你很高興的cd進linphone-iphone,輸入"./prepare.py"诗茎,以為腳本會為你解決剩下的一切工坊,然而出現(xiàn)了下面的提示:
補齊依賴項
補齊依賴項

這時打開submodules文件夾就會發(fā)現(xiàn)里面的模塊全部是空的,看工程所依賴的模塊都沒下載過來敢订,只是下載了前端的這個空殼王污。那就照著它說的做好了,輸入命令git submodule update --init --recursive楚午,嗯昭齐,下載進度又開始了,剛開始也許一切正常矾柜,但是過一段時間會發(fā)現(xiàn)大多卡在了libxml2這個xml解析模塊的下載上了阱驾,我用了比較笨的方法:請再來一次...,之前下載失敗的部分只需要再輸入一次git submodule update --init --recursive就可以繼續(xù)下載怪蔑,可惜不支持斷點續(xù)傳里覆,模塊需要重頭下載,TOT缆瓣。
但是有更好的解決辦法租谈,實際上github是有libxml2分支的,想辦法把git中的鏈接替換掉就行捆愁,下面我們通過git命令來修改git配置中的鏈接來實現(xiàn)下載:
首先在工程目錄下割去,終端中輸入git config -l,看到如下信息:
要修改的git倉庫地址
要修改的git倉庫地址

可以看到libxml2用的源是git://git.gnome.org/libxml2昼丑,我們需要換一個能下的呻逆,運行git config -e就可以用vim編輯git配置文件了,替換后的樣子如下所示:
修改后的效果
修改后的效果

修改后保存菩帝,運行git submodule update --init --recursive就可以繼續(xù)下載了咖城,最終所有源碼下載成功,可以開心的編譯了呼奢,是的宜雀,托腳本的福,編譯無壓力握础。

linphone-iphone的編譯

下面的工作進行的比較順利辐董,無非照著readme一步一步來,缺哪個就去裝哪個禀综。

  1. 首先简烘,為了支撐腳本順利運行苔严,我們需要安裝[HomeBrew]((http://brew.sh),有了它編譯缺少依賴的日子一去不復返了孤澎。
  2. ./prepare.py
    這個時候可以運行該命令來安裝linphone-iphone的依賴項了届氢,提示我們需要使用brew安裝coreutils automake autoconf libtool intltool wget pkgconfig cmake yasm nasm doxygen ImageMagick optipng libantlr3c gettext,這時homebrew派上了用場覆旭,運行命令brew install coreutils automake autoconf libtool intltool wget pkgconfig cmake yasm nasm doxygen ImageMagick optipng libantlr3c gettext就可以自動安裝完成退子,不需要手動配置環(huán)境。
  3. 再次運行``./prepare.py`型将,嗯絮供,提示我們要安裝java JDK,那就去裝一下好了茶敏。這個更簡單,直接去網(wǎng)上下載java SE開發(fā)套裝的軟件安裝就可以了缚俏。
  4. 終于可以開始./prepare.py了,腳本做的比較智能,只要前面步驟都完成了屠升,這一步成功率較高蜻牢。
  5. 完成這些準備工作后,可以開始重頭戲亚茬,編譯了酪耳,運行./prepare.py -c && ./prepare.py && make,大概20分鐘左右就可以編譯好刹缝⊥氚担可以看到子目錄下多出了一個liblinphone-sdk文件夾,里面是編譯好的liblinphone在各個平臺下的靜態(tài)庫梢夯。
  6. 打開linphone.xcodepro言疗,工程文件夾中自帶了企業(yè)推送證書,可以實現(xiàn)推送,連接真機后颂砸,按?R就可以享受了噪奄。

linphone_iphone的調(diào)試

是的,其實到這里基本就結(jié)束了人乓。但是我們費這么大功夫不是為了裝個Voip玩一玩了事的勤篮,而是借鑒里面對接口的調(diào)用方式。這里主要了解通話業(yè)務相關(guān)的代碼色罚。

工程目錄結(jié)構(gòu)

可能是工程維護時間較長的原因碰缔,但說實話,現(xiàn)在還在用xib實在是...不過好處是UI結(jié)構(gòu)簡單一看就懂戳护。
與工程相關(guān)的類全部放在Classes中手负,子目錄有各頁面的ViewController以及l(fā)iblinphone的中間件涤垫,而LinphoneUI中存放自定義的各種控件,Utils中存放用到的工具類和第三方視圖類竟终,都不是什么著名的蝠猬,引起注意的一個是XMLRPC,遠程過程調(diào)用的一個ios框架统捶;另一個TPMultiLayoutViewController比較重要榆芦,工程中幾乎所有的UIViewController都繼承自它,嗯喘鸟,似乎它的目的是早年(5年前)用來解決一種布局方式的UIViewController可以同時適用橫向和豎向的問題匆绣,也是夠老了。

跟通話相關(guān)的類型主要有:

  1. CallIncomingView:電話打入的視圖什黑;
  2. CallOutgoingView:電話打出的視圖崎淳;
  3. CallView:電話接通后的視圖、包括語音聊天愕把、視頻聊天拣凹、會議電話的視圖;
  4. PhoneMainView: 電話視圖的容器恨豁,單例模式嚣镜;監(jiān)聽大部分的通話狀態(tài)變化,負責管理不同通話視圖間的跳轉(zhuǎn)和主要業(yè)務邏輯橘蜜;
  5. LinphoneManager:對liblinphone中各種狀態(tài)的封裝以及功能的補充(音頻播放菊匿、音頻設備設置,音頻設備占用處理计福,低電量跌捆,新消息處理,前后臺處理)象颖,中間件疹蛉。

運行與調(diào)試

  1. 注冊與使用
    我們來運行一下這個demo(完成度很高,已上架)力麸,終于看到了Xcode的"Build success"可款,程序進入后長這個樣子:
    Demo效果圖
    Demo效果圖

    選擇CREAT ACCOUNT進行帳號的注冊,注冊完成即可享受免費的sip服務克蚂,進入注冊頁面后闺鲸,建議用戶名最好填寫電話號碼或者純數(shù)字帳號,因為sip地址是根據(jù)用戶名來定義的埃叭,例如用戶名為username的用戶的sip地址為username@sip.linphone.org摸恍,而撥號盤只能輸入數(shù)字...這意味著如果你想直接通過撥號盤或者手機聯(lián)系人來撥打sip電話(這些sip帳號都是跟電話號碼綁定的),就必須是純數(shù)字帳號。雖然也可以通過添加聯(lián)系人的方式來添加帶字母的sip帳號立镶,但這并不方便壁袄。注冊后在郵箱收到郵件并點擊鏈接驗證后帳號注冊完成,可以向另一臺注冊了帳號的設備發(fā)送voip通話了媚媒。
  2. 代碼分析
  • UI
    與通話相關(guān)的頁面一共有3個:CallIncomingView嗜逻、CallOutgoingViewCallView缭召,分別為打入電話栈顷、呼出電話與通話期間的視圖。沒有特別難懂的地方嵌巷,用通知來進行UI更新萄凤。
    而"PhoneMainView"則比較特殊,該單例不僅起到業(yè)務層的作用搪哪,而且是上面3個頁面的容器靡努,通過它來進行通話頁面之間的切換和管理。
  • 業(yè)務晓折,位于linphoneManager
    • 基本業(yè)務:

      1. 撥號
      • 判斷網(wǎng)絡狀況
      • 檢查是否在GSM通話中
      • 檢測提供的addr是否合法
      • 2g網(wǎng)絡下是否使用low_bandwidth模式
      • linphone_core_invite_address_with_params
      1. 接聽
      • 2g網(wǎng)絡是否是同low_bandwidth模式
      • linphone_call_params_enable_video 是否允許視頻流
      • linphone_core_accept_call_with_params 接電話
    • 狀態(tài)監(jiān)聽:
      voip通話狀態(tài)改變的監(jiān)聽是通過通知kLinphoneCallUpdate下發(fā)的惑朦,注冊該通知后,就可以從userInfo中的keycallstate中分別拿到當前通話的實例以及通話狀態(tài)碼已维。
      那么,該通知又是怎么來的呢已日,看了voipManager.m便知垛耳,在linphonecore.h文件中有一個void (*LinphoneCoreCallStateChangedCb)(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *message)類型的blockcall_state_changed,該回調(diào)會在通話狀態(tài)改變時觸發(fā)飘千,所以將方法static void linphone_iphone_call_state(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState state, const char *message)賦值給了該blcok堂鲜,在該方法中會對各種state進行處理,最后將state护奈、call缔莲、message封裝到dict后發(fā)送通知。

    • 音頻設備相關(guān)
      需要處理兩個問題:

      1. 音頻設備占用霉旗,這里又分為GSM電話和普通音頻應用的占用痴奏;
      2. 音頻設備監(jiān)測,主要針對藍牙設備的接入厌秒。
    • 前臺與后臺
      為了保證應用進入后臺也能長時間通話读拆,做了如下處理:

      1. 觸發(fā)applicationDidEnterBackground時:enterBackgroundMode
      • refreshRegisters
      • 設置超時處理[[UIApplication sharedApplication] setKeepAliveTimeout: 600 handler:^{ linphone_core_iterate }
      • 有通話則延長后臺存活時間startCallPausedLongRunningTask
      • [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler
      • 停止視頻預覽 linphone_core_stop_dtmf_stream
      • 如果不進入后臺模式,destroy voip socket if any
      1. 觸發(fā)applicationDidBecomeActive時:調(diào)用becomeActive
      • refreshRegisters
      • 停止后臺任務pausedCallBgTaskincallBgTask
      • linphone_core_start_dtmf_stream

其他部分就不一一列舉了鸵闪,說的不夠清楚檐晕,建議如果感興趣的話自己實際編譯調(diào)試一遍,從而對linphone的ios端接口有更深的了解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辟灰,一起剝皮案震驚了整個濱河市个榕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芥喇,老刑警劉巖西采,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乃坤,居然都是意外死亡苛让,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門湿诊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狱杰,“玉大人,你說我怎么就攤上這事厅须》禄” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵朗和,是天一觀的道長错沽。 經(jīng)常有香客問我,道長眶拉,這世上最難降的妖魔是什么千埃? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮忆植,結(jié)果婚禮上放可,老公的妹妹穿的比我還像新娘。我一直安慰自己朝刊,他們只是感情好耀里,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拾氓,像睡著了一般冯挎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咙鞍,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天房官,我揣著相機與錄音,去河邊找鬼续滋。 笑死易阳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的吃粒。 我是一名探鬼主播潦俺,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了事示?” 一聲冷哼從身側(cè)響起早像,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肖爵,沒想到半個月后卢鹦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡劝堪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年冀自,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秒啦。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡熬粗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出余境,到底是詐尸還是另有隱情驻呐,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布芳来,位于F島的核電站含末,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏即舌。R本人自食惡果不足惜佣盒,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顽聂。 院中可真熱鬧肥惭,春花似錦、人聲如沸芜飘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗦明。三九已至,卻和暖如春蚪燕,著一層夾襖步出監(jiān)牢的瞬間娶牌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工馆纳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诗良,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓鲁驶,卻偏偏與公主長得像鉴裹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容