探索Xcode11下經過VoIP推送如何實現微信視頻推送持續震動

需求

公司項目有一套即時的視頻語音聊天功能,產品但願是當App切入後臺掛起或者被用戶劃掉後,收到視頻語音推送時,App能夠持續震動及響鈴(持續震動及響鈴),而且用戶點擊通知時,App啓動後就能夠及時的進行視頻語音通話(用戶無等待)。html

技術現狀

蘋果推送有三種方案: 1.普通推送 2.靜默推送 3.VoIP推送bash

針對三種推送方案的說明,網上有不少很詳細的資料,這裏就不一一列舉。咱們很快的就能夠鎖定,若是要實現以上需求,VoIP是咱們惟一能夠選擇的方案。 在Xcode11以前,咱們能夠直對接VoIP推送,惟一面臨的是蘋果的審覈。可是前段時間蘋果發佈了一則通知:微信

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.
複製代碼

經過Xcode11咱們收到VoIP推送時,若是咱們沒有調用Callkit相關代碼,即reportNewIncomingCallWithUUID,咱們會直接收到如下崩潰信息:app

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

複製代碼

顯然蘋果爲了不咱們不正當的使用VoIP推送,進行了強制處理,因此咱們須要對接CallKit咯?若是這樣作了,在提交的時候,如下信息可能在等着你:ide

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
複製代碼

那咱們經過手機號碼等條件,進行區域處理。國內使用普通推送,國外經過VoIP來作應該能夠經過蘋果要求,可是老闆不一樣意了,咱們面向的是國內用戶。彷彿已經撞到南牆了!oop

另闢蹊徑

那讓咱們先來對比下幾個大廠如何作的。post

  • QQ:收到視頻通話,手機持續震動幾秒直至推送自動隱藏。點擊QQ無等待直接能夠接聽
  • 微信:收到視頻通話,手機持續震動至少30s。點擊微信無需等待直接能夠接聽
  • 閒魚:收到視頻通話,手機震動,點擊閒魚後無需等待直接能夠接聽

BOSS: QQ、微信都實現了,你爲何實現不了。。。學習

既然這些App都收到了VoIP推送而且激活了App,同時沒有出現CallKit的電話界面,說明經過某些方式是能夠實現的。那我就把重點放在了當咱們調用reportNewIncomingCallWithUUID方法的時候,系統作了什麼。若是能夠找到,那咱們就能夠偷偷地作個好心人幫系統作一下。ui

嘗試思路一

嘗試打印當前全部線程內的方法調用,看這個過程當中,是否有一些不同的方法被調用,使人遺憾的是並無找到有用的信息。this

嘗試思路二

監聽全部通知的發送,是否經過一些通知進行了信息傳遞。這這個過程當中,咱們發現有一個不同的通知出現:PKPushIncomingCallReportedNotification。 而後讓咱們試試再也不調用reportNewIncomingCallWithUUID方法,而是發送這個通知呢?結果正是咱們想要的!沒有CallKit的通話界面,App有沒有異常崩潰通知。

存在的問題:

可是偶爾會出現沒法再次收到VoIP的push通知。 高重現場景爲:收到VoIP推送後長時間不處理,客戶端會被異常終止,以後就收不到了。可是收到時客戶端激活,就沒有問題。

寫在最後

目前工做有其餘更緊急的插入進來,暫時沒有繼續研究了(後面抽時間再看)。這裏只是提供了一種解決問題的思路,咱們不能由於認爲作不到就不去嘗試。

若是有朋友有更好的思路或者存在問題解決方案找到了,能夠回覆用來幫助更多的人學習。

同時呢,這種方式只是咱們挑戰本身的方式,上架App仍是要遵照蘋果規範的!

相關文章
相關標籤/搜索