快速移植Linphone到自己的項目

Linphone

首先我們來看Linphone的簡單介紹:

Linphone for smartphones, tablets and mobile devices.
Make audio and video calls in HD.
Create audio conferences.
Record and store calls.
View real-time presence status.
Manage your address book.
Communicate securely.

而我們?nèi)绾慰焖賹⒆钚掳姹綥inphone SDK移植到我們的個人項目呢?我將其分為三個步驟:

一 . 首先我們需要自己編譯一份最新的Linphone SDK

在此非常感謝作者"whiteking"為我們整理的編譯流程,大致分為一下幾個步驟,最新版本的Linphone SDK也可以按照下面的步驟進行:

1.安裝 HomeBrew
2.下載linphone-iphone項目:
3.配置環(huán)境路徑
4.Build SDK

相關(guān)命令在編譯流程中提到, 在此不過多贅述. 需要提醒一點的就是, 下載過程異常得慢, 本人足足花了一個晚上才下載成功的, 可以睡覺前下載一份, 睡醒應(yīng)該就能編譯了git submodule sync && git submodule update --init --recursive ←這個是submodule即子模塊下載, 執(zhí)行這個命令比較久,睡一覺應(yīng)該就能下好了.
編譯成功后, 我們需要的SDK就在下面的這個文件里面:

linphone_sdk

而我們只需要apple-darwin這個文件就可以了.

二. 熟悉Linphone Demo項目, 熟悉SDK的接口調(diào)用

可以打開我們剛才編譯好的demo, 然后看一下Linphone的架構(gòu), 關(guān)于架構(gòu)分析的有作者"杭研融合通信iOS"分享的文章linphone-iphone的安裝與調(diào)試. 里面也有安裝和編譯的教程, 可以借鑒一下.
熟悉Linphone Demo項目, 需要花點時間去熟悉, 所有接口都是用C語言進行封裝的, 因此我們需要熟悉如何調(diào)用C語言, C語言沒有內(nèi)存管理的概念, 因此我們創(chuàng)建一個對象的同時, 記得用完要把它銷毀掉.
Linphone Demo使用的控制器跳轉(zhuǎn)用的是古老的跳轉(zhuǎn)方式, 還有xib用的是古老的Autoresizing, 有興趣的童鞋可以去了解一下, 不過這些古老的方式在今天的開發(fā)已經(jīng)被廢棄, 從側(cè)面可以看出Linphone這個開源庫的歷史悠久.
Linphone Demo核心業(yè)務(wù)層在于LinphoneManager, 所有核心的操作都在這里面, 因此我們關(guān)心的重點在這個文件里面.
對于呼出或者呼入, 都需要進行以下的步驟:

1. 初始化
2.用戶的注冊
3.呼入, 呼出

熟悉相關(guān)流程之后, 接下來我們就可以進行Linphone的移植了.

三. Linphone最新版SDK的移植

首先感謝作者"江湖度"的貢獻, 為我們貢獻了這篇Linphone-iOS-移植 移植教程. 這里本人在移植的過程與作者"江湖度"移植的前四步基本相同, 在第五步開始有些差異, 本人在第五步用到了Linphone Demo里的幾個類文件:

用到的類文件

如下:

ColorSpaceUtilities//顏色相關(guān)工具
Contact//聯(lián)系人
FastAddressBook//通訊錄
FileTransferDelegate//文件傳輸
LinphoneManager//核心業(yè)務(wù)管理
Log//Log
ProviderDelegate//適配iOS 10 Callkit
UILabel+Boldify//UILabel粗體
Utils//工具類

當(dāng)然上面的文件不可能一下子全部挪過來, 因為綁定了很多Linphone Demo本身很多的東西, 所以需要自己剔除掉沒用的東西, 一個一個文件地挪過來, 可以從Log開始, 然后Utils, 然后Contact.... 這部分工作量其實還是蠻大的, 也是需要耐心的工作.

對了, 記得還要把兩個配置文件拖入到我們的工程里面, 里面可以直接通過設(shè)置0,1修改配置, 還有一些聲音文件也拖入到我們自己的工程里面:

配置文件

工程里面打開Voip的開關(guān):

打開Voip

既然用到Voip, 我們還需要配置一個Voip的推送證書. 具體百度一下Voip證書配置.

萬事俱備, 接下來我們就可以調(diào)用LinphoneManager還有SDK里面的一些方法了.
初始化:

 [[LinphoneManager instance] startLinphoneCore];

注冊:

- (void)registeByUserName:(NSString *)userName pwd:(NSString *)pwd domain:(NSString *)domain tramsport:(NSString *)transport{
    
    //設(shè)置超時
    linphone_core_set_inc_timeout(LC, 60);
    
    //創(chuàng)建配置表
    LinphoneProxyConfig *proxyCfg = linphone_core_create_proxy_config(LC);
   
    //初始化電話號碼
    linphone_proxy_config_normalize_phone_number(proxyCfg,userName.UTF8String);
    
    //創(chuàng)建地址
    NSString *address = [NSString stringWithFormat:@"sip:%@@%@",userName,domain];//如:sip:123456@sip.com
    LinphoneAddress *identify = linphone_address_new(address.UTF8String);
   
    linphone_proxy_config_set_identity_address(proxyCfg, identify);
    
    linphone_proxy_config_set_route(
                                    proxyCfg,
                                    [NSString stringWithFormat:@"%s;transport=%s", domain.UTF8String, transport.lowercaseString.UTF8String]
                                    .UTF8String);
    linphone_proxy_config_set_server_addr(
                                          proxyCfg,
                                          [NSString stringWithFormat:@"%s;transport=%s", domain.UTF8String, transport.lowercaseString.UTF8String]
                                          .UTF8String);
    
    linphone_proxy_config_enable_register(proxyCfg, TRUE);
    
    
    //創(chuàng)建證書
    LinphoneAuthInfo *info = linphone_auth_info_new(userName.UTF8String, nil, pwd.UTF8String, nil, nil, linphone_address_get_domain(identify));
    
    //添加證書
    linphone_core_add_auth_info(LC, info);
    
    //銷毀地址
    linphone_address_unref(identify);
    
    //注冊
    linphone_proxy_config_enable_register(proxyCfg, 1);
        
    //添加到配置表,添加到linphone_core
    linphone_core_add_proxy_config(LC, proxyCfg);
    
    //設(shè)置成默認(rèn)配置表
    linphone_core_set_default_proxy_config(LC, proxyCfg);
    
    
    //設(shè)置音頻編碼格式
  [self synchronizeCodecs:linphone_core_get_audio_codecs(LC)];

    
}
#pragma mark - 設(shè)置音頻編碼格式
- (void)synchronizeCodecs:(const MSList *)codecs {
    PayloadType *pt;
    const MSList *elem;
    
    for (elem = codecs; elem != NULL; elem = elem->next) {
        
        pt = (PayloadType *)elem->data;
        
        NSString *sreung = [NSString stringWithFormat:@"%s", pt->mime_type];
        if ([sreung isEqualToString:@"G729"]) {
            
            linphone_core_enable_payload_type(LC, pt, 1);
            
        }else {
            
            linphone_core_enable_payload_type(LC, pt, 0);
        }
        
    }
}

獲取注冊的狀態(tài):

- (IBAction)getRegistState:(id)sender {
    
    LinphoneProxyConfig *cfg =  linphone_core_get_default_proxy_config(LC);
    LinphoneRegistrationState state =  linphone_proxy_config_get_state(cfg);
    switch (state) {
        case LinphoneRegistrationNone:{
            
            self.msgLabel.text = @"LinphoneRegistrationNone";
        }
            break;
        case LinphoneRegistrationOk:{
            
            self.msgLabel.text = @"LinphoneRegistrationOk";
        }
            break;
        case LinphoneRegistrationFailed:{
            
            self.msgLabel.text = @"LinphoneRegistrationFailed";
        }
            break;
        case LinphoneRegistrationCleared:{
            
            self.msgLabel.text = @"LinphoneRegistrationCleared";
        }
            break;
        case LinphoneRegistrationProgress:{
            
            self.msgLabel.text = @"LinphoneRegistrationProgress";
        }
        default:
            break;
    }

}

撥打電話:

#pragma mark - 撥打電話
- (void)callPhoneWithPhoneNumber:(NSString *)phone{

    LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:phone];
    
    [LinphoneManager.instance call:addr];
    if (addr) {
        linphone_address_unref(addr);
    }
  
}

接聽電話:

    LinphoneCall *call = linphone_core_get_current_call(LC);
    if (call) {
         [[LinphoneManager instance] acceptCall:call evenWithVideo:NO];
    }

掛斷電話

    LinphoneCall *call = linphone_core_get_current_call(LC);
    if (call) {
        linphone_call_terminate(call);
    }

清除配置表

#pragma mark - 清除配置表, 切換賬號時會用到
- (void)clearProxyConfig {
    
    linphone_core_clear_proxy_config([LinphoneManager getLc]);
    linphone_core_clear_all_auth_info([LinphoneManager getLc]);
}

前前后后搗鼓Linphone也有一段時間, 苦于Linphone官網(wǎng)沒有標(biāo)準(zhǔn)的文檔, 也沒有最新的SDK說明, 只能網(wǎng)上大量查閱資料, 還有研究Linphone Demo, 才最終調(diào)通. 因此, 本人建了個QQ群, 群號: 578410849. 如有什么問題, 歡迎加群咨詢.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末检痰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铅歼,更是在濱河造成了極大的恐慌公壤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厦幅,死亡現(xiàn)場離奇詭異锦担,居然都是意外死亡慨削,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門缚态,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磁椒,“玉大人玫芦,你說我怎么就攤上這事∏欧” “怎么了医增?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵老虫,是天一觀的道長。 經(jīng)常有香客問我祈匙,道長忽刽,這世上最難降的妖魔是什么夺欲? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮些阅,結(jié)果婚禮上伞剑,老公的妹妹穿的比我還像新娘市埋。我一直安慰自己黎泣,他們只是感情好腰素,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弓千,像睡著了一般衡便。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镣陕,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音呆抑,去河邊找鬼岂嗓。 笑死鹊碍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侈咕。 我是一名探鬼主播公罕,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耀销,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熊尉?” 一聲冷哼從身側(cè)響起罐柳,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狰住,失蹤者是張志新(化名)和其女友劉穎张吉,沒想到半個月后转晰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡查邢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扰藕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡芳撒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笔刹,到底是詐尸還是另有隱情芥备,我是刑警寧澤舌菜,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布萌壳,位于F島的核電站,受9級特大地震影響袱瓮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尺借,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一绊起、第九天 我趴在偏房一處隱蔽的房頂上張望燎斩。 院中可真熱鬧,春花似錦栅表、人聲如沸实蔽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳殖。三九已至,卻和暖如春哆姻,著一層夾襖步出監(jiān)牢的瞬間宣增,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工爹脾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箕昭。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像落竹,于是被迫代替她去往敵國和親泌霍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評論 25 707
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,375評論 7 249
  • 一個安心的人在哪都可以過自得其樂的生活夺刑,抱著振奮樂觀的思想缅疟,如同居住在皇宮一般×裕——《瓦爾登湖》 1 單位有4個小...
    瑩光灼華閱讀 532評論 3 6
  • 白說:學(xué)習(xí)茎杂,相當(dāng)重要一點是去喜歡你不喜歡的纫雁,適應(yīng)你不適應(yīng)的煌往。打開自己轧邪,試著體會和接納那些不同的聲音刽脖。如同讀書忌愚,不要...
    Sinead閱讀 160評論 0 0
  • 堅持每天寫字,堅持每天早晨起床后要做的第一大事——寫字硕糊。那么院水,寫字有什么好處呢?寫字能訓(xùn)練大腦的思維能力,通過寫字...
    一片祥和閱讀 402評論 0 0