探索Xcode11下通過(guò)VoIP推送如何實(shí)現(xiàn)微信視頻推送持續(xù)震動(dòng)

2021.6 更新

根據(jù)目前了解情況仙蚜,除查找技術(shù)解決方案外,還有可能向蘋(píng)果申請(qǐng)?zhí)厥鈾?quán)限來(lái)解決此問(wèn)題相种。關(guān)鍵詞:com.apple.developer.pushkit.unrestricted-voip


需求

公司項(xiàng)目有一套即時(shí)的視頻語(yǔ)音聊天功能,產(chǎn)品希望是當(dāng)App切入后臺(tái)掛起或者被用戶(hù)劃掉后,收到視頻語(yǔ)音推送時(shí)传蹈,App可以持續(xù)震動(dòng)及響鈴(持續(xù)震動(dòng)及響鈴),并且用戶(hù)點(diǎn)擊通知時(shí)步藕,App啟動(dòng)后就可以及時(shí)的進(jìn)行視頻語(yǔ)音通話(用戶(hù)無(wú)等待)惦界。

技術(shù)現(xiàn)狀

蘋(píng)果推送有三種方案:
1.普通推送
2.靜默推送
3.VoIP推送

針對(duì)三種推送方案的說(shuō)明,網(wǎng)上有很多很詳細(xì)的資料咙冗,這里就不一一列舉沾歪。我們很快的就可以鎖定,如果要實(shí)現(xiàn)以上需求雾消,VoIP是我們唯一可以選擇的方案灾搏。
在Xcode11之前,我們可以直對(duì)接VoIP推送立润,唯一面臨的是蘋(píng)果的審核狂窑。但是前段時(shí)間蘋(píng)果發(fā)布了一則通知:

Important
On iOS 13.0 and later, if you fail to report a call to CallKit, the system will terminate your app. Repeatedly failing to report calls may cause the system to stop delivering any more VoIP push notifications to your app. If you want to initiate a VoIP call without using CallKit, register for push notifications using the UserNotifications framework instead of PushKit. For more information, see UserNotifications.

通過(guò)Xcode11我們收到VoIP推送時(shí),如果我們沒(méi)有調(diào)用Callkit相關(guān)代碼桑腮,即reportNewIncomingCallWithUUID蕾域,我們會(huì)直接收到以下崩潰信息:

Apps receving VoIP pushes must post an incoming call (via CallKit or IncomingCallNotifications) in the same run loop as   pushRegistry:didReceiveIncomingPushWithPayload:forType:[withCompletionHandler:] without delay.

*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], /BuildRoot/Library/Caches/com.apple.xbs/Sources/PushKit/PushKit-37/PKPushRegistry.m:343

顯然蘋(píng)果為了避免我們不正當(dāng)?shù)氖褂肰oIP推送,進(jìn)行了強(qiáng)制處理,所以我們需要對(duì)接CallKit咯旨巷?如果這樣做了巨缘,在提交的時(shí)候,以下信息可能在等著你:

Apple Dear Developer,

The Chinese Ministry of Industry and Information Technology (MIIT) http://www.miit.gov.cn/n1146285/ ... n3057713/index.html requested that CallKit functionality be deactivated in all apps available on the China App Store.

Since your app currently includes CallKit and is available for sale on the China App Store, you will need to submit an update that removes CallKit functionality in China.

VOIP call functionality continues to be allowed but can no longer take advantage of CallKit ’ s intuitive look and feel. CallKit can continue to be used in apps outside of China.

If you have questions or do not believe your app is subject to this update, please contact MIIT.

Best regards,

App Store Review

那我們通過(guò)手機(jī)號(hào)碼等條件采呐,進(jìn)行區(qū)域處理若锁。國(guó)內(nèi)使用普通推送,國(guó)外通過(guò)VoIP來(lái)做應(yīng)該可以通過(guò)蘋(píng)果要求斧吐,但是老板不同意了又固,我們面向的是國(guó)內(nèi)用戶(hù)。仿佛已經(jīng)撞到南墻了煤率!

另辟蹊徑

那讓我們先來(lái)對(duì)比下幾個(gè)大廠如何做的仰冠。

  • QQ:收到視頻通話,手機(jī)持續(xù)震動(dòng)幾秒直至推送自動(dòng)隱藏蝶糯。點(diǎn)擊QQ無(wú)等待直接可以接聽(tīng)
  • 微信:收到視頻通話洋只,手機(jī)持續(xù)震動(dòng)至少30s。點(diǎn)擊微信無(wú)需等待直接可以接聽(tīng)
  • 閑魚(yú):收到視頻通話昼捍,手機(jī)震動(dòng)识虚,點(diǎn)擊閑魚(yú)后無(wú)需等待直接可以接聽(tīng)

BOSS: QQ、微信都實(shí)現(xiàn)了妒茬,你為什么實(shí)現(xiàn)不了担锤。。乍钻。

既然這些App都收到了VoIP推送并且激活了App肛循,同時(shí)沒(méi)有出現(xiàn)CallKit的電話界面,說(shuō)明通過(guò)某些方式是可以實(shí)現(xiàn)的银择。那我就把重點(diǎn)放在了當(dāng)我們調(diào)用reportNewIncomingCallWithUUID方法的時(shí)候多糠,系統(tǒng)做了什么。如果可以找到欢摄,那我們就可以偷偷地做個(gè)好心人幫系統(tǒng)做一下熬丧。

嘗試思路一

嘗試打印當(dāng)前所有線程內(nèi)的方法調(diào)用,看這個(gè)過(guò)程中怀挠,是否有一些不一樣的方法被調(diào)用析蝴,令人遺憾的是并沒(méi)有找到有用的信息。

嘗試思路二

監(jiān)聽(tīng)所有通知的發(fā)送绿淋,是否通過(guò)一些通知進(jìn)行了信息傳遞闷畸。這這個(gè)過(guò)程中,我們發(fā)現(xiàn)有一個(gè)不一樣的通知出現(xiàn):PKPushIncomingCallReportedNotification吞滞。
然后讓我們?cè)囋嚥辉僬{(diào)用reportNewIncomingCallWithUUID方法佑菩,而是發(fā)送這個(gè)通知呢盾沫?結(jié)果正是我們想要的!沒(méi)有CallKit的通話界面殿漠,App有沒(méi)有異常崩潰通知赴精。

存在的問(wèn)題

但是偶爾會(huì)出現(xiàn)無(wú)法再次收到VoIP的push通知。
高重現(xiàn)場(chǎng)景為:收到VoIP推送后長(zhǎng)時(shí)間不處理绞幌,客戶(hù)端會(huì)被異常終止蕾哟,之后就收不到了。但是收到時(shí)客戶(hù)端激活莲蜘,就沒(méi)有問(wèn)題谭确。

寫(xiě)在最后

目前工作有其他更緊急的插入進(jìn)來(lái),暫時(shí)沒(méi)有繼續(xù)研究了(后面抽時(shí)間再看)票渠。這里只是提供了一種解決問(wèn)題的思路逐哈,我們不能因?yàn)檎J(rèn)為做不到就不去嘗試。
如果有朋友有更好的思路或者存在問(wèn)題解決方案找到了问顷,可以回復(fù)用來(lái)幫助更多的人學(xué)習(xí)昂秃。
同時(shí)呢,這種方式只是我們挑戰(zhàn)自己的方式择诈,上架App還是要遵守蘋(píng)果規(guī)范的械蹋!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末出皇,一起剝皮案震驚了整個(gè)濱河市羞芍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌郊艘,老刑警劉巖荷科,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纱注,居然都是意外死亡畏浆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)狞贱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刻获,“玉大人,你說(shuō)我怎么就攤上這事瞎嬉⌒保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵氧枣,是天一觀的道長(zhǎng)沐兵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)便监,這世上最難降的妖魔是什么扎谎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任碳想,我火速辦了婚禮,結(jié)果婚禮上毁靶,老公的妹妹穿的比我還像新娘胧奔。我一直安慰自己,他們只是感情好预吆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布葡盗。 她就那樣靜靜地躺著,像睡著了一般啡浊。 火紅的嫁衣襯著肌膚如雪觅够。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天巷嚣,我揣著相機(jī)與錄音喘先,去河邊找鬼。 笑死廷粒,一個(gè)胖子當(dāng)著我的面吹牛窘拯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坝茎,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涤姊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嗤放?” 一聲冷哼從身側(cè)響起思喊,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎次酌,沒(méi)想到半個(gè)月后恨课,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岳服,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年剂公,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吊宋。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纲辽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出璃搜,到底是詐尸還是另有隱情拖吼,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布腺劣,位于F島的核電站绿贞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏橘原。R本人自食惡果不足惜籍铁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一涡上、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拒名,春花似錦吩愧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至同云,卻和暖如春糖权,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炸站。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工星澳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旱易。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓禁偎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阀坏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子如暖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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