公司項目有一套即時的視頻語音聊天功能,產品但願是當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
BOSS: QQ、微信都實現了,你爲何實現不了。。。學習
既然這些App都收到了VoIP推送而且激活了App,同時沒有出現CallKit的電話界面,說明經過某些方式是能夠實現的。那我就把重點放在了當咱們調用reportNewIncomingCallWithUUID方法的時候,系統作了什麼。若是能夠找到,那咱們就能夠偷偷地作個好心人幫系統作一下。ui
嘗試打印當前全部線程內的方法調用,看這個過程當中,是否有一些不同的方法被調用,使人遺憾的是並無找到有用的信息。this
監聽全部通知的發送,是否經過一些通知進行了信息傳遞。這這個過程當中,咱們發現有一個不同的通知出現:PKPushIncomingCallReportedNotification。 而後讓咱們試試再也不調用reportNewIncomingCallWithUUID方法,而是發送這個通知呢?結果正是咱們想要的!沒有CallKit的通話界面,App有沒有異常崩潰通知。
可是偶爾會出現沒法再次收到VoIP的push通知。 高重現場景爲:收到VoIP推送後長時間不處理,客戶端會被異常終止,以後就收不到了。可是收到時客戶端激活,就沒有問題。
目前工做有其餘更緊急的插入進來,暫時沒有繼續研究了(後面抽時間再看)。這裏只是提供了一種解決問題的思路,咱們不能由於認爲作不到就不去嘗試。
若是有朋友有更好的思路或者存在問題解決方案找到了,能夠回覆用來幫助更多的人學習。
同時呢,這種方式只是咱們挑戰本身的方式,上架App仍是要遵照蘋果規範的!