1. 程式人生 > >快速利用第三方平臺SDK,實現點對點語音通話

快速利用第三方平臺SDK,實現點對點語音通話

    最近公司的一個APP專案需要一個加一個網際網路點對點語音功能,網上找了Linphone 研究了一個月發現這些開源庫很強大也很優秀,支援平臺廣泛 windows, mac,ios,android,linux,但是程式碼量和結構實在龐大,坑爹的專案經理要求一個月把這個功能做出來,所以我暫時放棄考慮Linphone。況且我只需要語音通話功能,改一個Linphone 代價太大了。。。。廢話少說入正題。
準備工作分為三步:
2.登入雲之訊官網後可以找到Account Sid AuthToken(在登入時使用)
3.註冊賬號成功後,雲之訊提供了6個子賬號用於體驗,登入雲之訊官網後,在應用管理—測試Demo—
Demo應用資訊下就找到了。

接下來我們看看如何呼叫雲之訊SDK

1.然後將官網下載的 SDK匯入剛才新建的工程(一個靜態庫,三個標頭檔案),如圖:

2.在專案工程中新增依賴的庫檔案,如圖:


程式碼實現步驟

關鍵程式碼一:初始化 SDK

Ps:首先要匯入sdk的標頭檔案

#import UCSService.h
#import UCSEvent.h
#import UCSCommonClass.h

Ps:初始化物件要儲存好,後續的呼叫功能都是使用該物件去呼叫,不用每次呼叫功能都要建立一個物件。

初始化SDK的程式碼

{
//初始化UCS SDK,並傳入代理實現的類例項
	UCSService* ucsService = [[UCSService alloc] initWithDelegate:self];

	//另一種初始化方式
UCSService* ucsService = [[UCSService alloc] init];
    [ucsService setDelegate:self];
}


關鍵程式碼二:賬號連線雲平臺

Ps:將準備工作中2、3獲取的賬號填充到下面這個介面中,呼叫介面的物件是咱們上面初始化獲得的物件,並且在初始化一段時間後呼叫,如果初始化就立即呼叫連結會導致崩潰,原因不明。

[ucsCallService connect:accountSid withAccountToken:accountToken withClientNumber:clientNumber withClientPwd:clientPwd]

關鍵程式碼三:發起語音通話

PS:發起通話一定要在雲平臺連線成功後。

callType: 0(代表語音通話)

calledNumber:7604100XXXXXXX(準備工作中4、獲取的免費體驗賬號)

-(void)startCall
{
//撥打語音通話(對方Client賬號) 
[ucsCallService dial:callType andCalled:calledNumber];
}

到這裡也許會有人問發起呼叫時我如何知道對方的呼叫狀態比如:對方來電、對方結束通話、呼叫對方失敗、對方振鈴 等狀態。別急,關鍵程式碼五就回答這個問題。

關鍵程式碼四:回撥處理

當我們初始化、連結雲平臺、發起呼叫成功後都會有回撥,回撥的儲存在UCSEvent.h檔案中,我們可以根據響應的情況實現回撥介面。

程式碼編寫完成後,編譯錯誤,執行崩潰,如圖:


我仔細查看了一遍程式碼,並沒有問題。這個問題我排查的好久。

最後我重新閱讀官方的開發指南並且仔細和官方下載的Demo工程比對了一下,發現我漏了兩個配置(都怪我一開始沒有仔細看官方開發指南。):

第一個是Required Background modes ,如圖:


這項配置的目的是蘋果從iOS4開始,蘋果增加了特性,很好的支援了語音通話功能,

如果不配置這個選項的話,應用進入後臺,就有可能接收不到來電了喲。

第二個是 Other Linker flags 中新增–ObjC,如圖:



這項配置作用是為了支援OC的類別特性。

加了這兩項配置後,XCode編譯,執行,登入無崩潰,點選語音通話呼叫按鈕,成功。如圖:


使用感受:
1、剛開始整合完sdk肯定是要測試一番的啦,在測試遠距離通話過程中,由於我們跑得比較遠,難免公司的wifi覆蓋不到,這個時候肯定是要切換到手機網路的,我們本以為通話會斷開,沒想到,通話還可以繼續,但是當我們把手機切換到飛航模式的時候,通話又立馬斷開了,我猜測,sdk內部應該是存在重連的,即使切換了網路,只要網路連線上了,通話還是可以繼續的。
2、在我們產品上線後,收到不少使用者反饋,當app被關閉了之後就會收不到電話了(有時候手機記憶體使用過多,會被系統回收app記憶體),當時還納悶,app都關了,收不到來電不很正常嘛,簡直就是無理取鬧,但是專案經理對這個功能催得又急,不得已,又是一輪查詢資料,發現,原來sdk還提供了一個推送續活的介面,完美解決了這個問題,就是通過推送訊息,將來電資訊推送過來,檢視推送訊息即可啟用app接聽電話。
3、由於本人工作的原因,偶爾會出差到外地,在撥打直撥或者語音通話的時候都是用自己的產品(賬號裡面都是免費分鐘數,嘻嘻),這樣可以節省不少話費。之前想自己搞一下語音通話這一塊,瞭解了不少知識,知道語音通話這個是需要伺服器中轉的,如果你所在地的網路基站離伺服器基站太遠的話,有可能會有雜音和丟包等問題,但是在使用雲之訊sdk,我發現,即使在不同的地方,語音質量依舊那麼好。針對這個問題,我還特地抓包研究了好久,結果發現,切換不同的網路後,sdk的通話udp發包都會發到不同的ip地址上,我想,估計雲之訊佈置了不止一個伺服器基站來做通話中轉,而且還可以根據網路情況提供最優的伺服器。那這樣的話,在不同地方,語音通話不受影響也就可以說得通了。