iOS VOIP PushKit 開發(fā)相關(guān)

前言

面對通話的通知需求,對方呼入,響起鈴聲和震動,提醒用戶,對方掛斷之后,鈴聲震動停止,普通的APNS通知,已經(jīng)不能達(dá)到我們想要的效果,所以需要一種可以用通知就喚醒我們APP的技術(shù),然后使用我們自己的代碼進行本地通知,控制通知的出現(xiàn)和消失,蘋果的解決方案就是VOIP,PushKit推送。

VOIP使用PushKit

PushKit是蘋果在iOS8之后推出的新框架,iOS10之后,蘋果更是禁止VOIP應(yīng)用在后臺使用socket長鏈接,PushKit可以說是為了VOIP而生,滿足實時性的同時,還能達(dá)到省電的效果,搭配蘋果自己的CallKit,可以呈現(xiàn)出類似原生電話通話的效果。
PushKit區(qū)別與普通APNs的地方是,它不會彈出通知,而是直接喚醒你的APP,進入回調(diào),也就是說,可以在沒點擊APP啟動的情況下,就運行我們自己寫的代碼,當(dāng)然,推送證書和注冊、回調(diào)的方法也和APNs不同,具體操作如下

1.注冊推送證書

image.png

和注冊普通的證書方法相同,我們只要類型選擇VoIP Services Certificate注冊就好,VoIP的證書只用一個生產(chǎn)環(huán)境(Production)的,開發(fā)環(huán)境(Development)也可以使用,不必糾結(jié)。

2.項目配置

image.png

和APNs一樣,需要在Project-> Capabilities里打開推送開關(guān)和設(shè)置后臺,需要注意的是,我這里使用的是XCode9,Background Modes的設(shè)置里沒有VoIP的選項,XCode8會有專門的VoIP選項也需要打開
image.png

3.代碼配置

工程和證書得設(shè)置好之后,就是我們代碼的編寫了:

 import PushKit

在AppDelege里倒入PushKit框架

let pushRegistry = PKPushRegistry.init(queue: DispatchQueue.main)
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [PKPushType.voIP]

在didFinishLaunchingWithOptions使用代碼注冊,然后我們就要實現(xiàn)這個PKPushRegistryDelegate的回調(diào)方法

extension AppDelegate: PKPushRegistryDelegate {
    
    func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
        
        let device = NSData(data: credentials.token)
        let deviceId = device.description.replacingOccurrences(of:"<", with:"").replacingOccurrences(of:">", with:"").replacingOccurrences(of:" ", with:"")
        print_debug("pushkit設(shè)備token:" + deviceId)
        
    }
    
    func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
        
        print_debug("收到pushkit推送!")
        print_debug(payload.dictionaryPayload)
        
    }
    
}

(PS:print_debug是我寫的一個只在開發(fā)環(huán)境打印的函數(shù))
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType)方法里,我們可以拿到PushKit的推送token,然后上傳給我們自己的服務(wù)器使用;
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType)方法是收到推送的回調(diào),我們可以在這里做一個本地通知來通知用戶來電,也可以通過PushKit推送掛斷信息來消除通知。
當(dāng)然,我們的代碼完全可以不放在回調(diào)里做,因為有PushKit推送消息進來的時候,APP已經(jīng)在后臺啟動了,就是說我們寫在didFinishLaunchingWithOptions里面的代碼已經(jīng)全部執(zhí)行了,所以我們的APP的正常生命周期已經(jīng)開始了,這樣我們的可操作性就大了很多,(某種意義上,我們可以使用PushKit在用戶不知道的情況下喚醒APP,有點作弊的感覺),就寫到這里,PushKit的使用就是這么簡單。

更新?。。?/h2>

最近用Xcode9開啟新的工程,繼續(xù)使用PushKit,遇到極其坑爹的問題,因為Xcode9的Background Modes里面取消了勾選voip的選項,結(jié)果導(dǎo)致pushkit注冊不成功,無法獲取到pushkit的token,爬了坑之后才發(fā)現(xiàn)這個問題,解決方法是在info.plist文件里手動添加App provides Voice over IP services

image.png

歡迎更正錯誤和交流,回復(fù)評論和私信皆可 ??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,115評論 25 709
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,884評論 10 16
  • 此樹愛肥臀,干枝塑美人。 日日勤倒立,舞美不留痕。 友情鏈接:
    簡村小吹閱讀 211評論 22 24
  • 其實,我們每個人、每個組織還有一個損友,那就是一種我們看不見的消音機制——對真實信息和狀況自動屏蔽、自動粉飾的這樣...
    gyl58365閱讀 470評論 0 0
  • 【認(rèn)識自己】 人有兩個眼睛,可以看世間、看萬物、看他人,就是看不到自己;能看得到別人的過失,卻看不到自己的缺點;能...
    君行雪閱讀 381評論 0 0

友情鏈接更多精彩內(nèi)容