簡體   English   中英

VoIP,PushKit和應用程序喚醒

[英]VoIP, PushKit and app wake up

我正在使用PushKit和CallKit開發VoIP應用程序。 我知道在不同的論壇上經常會問到類似的問題,但遺憾的是從未真正回答過。 此外大部分帖子都是從2015年左右開始的,所以我認為很多機會可能已經改變,有人可能會想到如何讓這個工作。

什么工作:

當應用程序在前台運行或發送到后台時,它會使用沙盒服務器接收推送通知,生產服務器也是如此。

我在iOS 11和Xcode 9上,需要在'功能'中啟用常規推送通知,以及手動將voip后台模式添加到info.plist以便調用委托方法。 單獨鏈接CallKit和PushKit還不足以接收通知。 我還啟用了背景音頻,后台提取和遠程通知。 我還在執行推送注冊表注冊之前創建了一個后台任務,並在收到推送令牌后結束該任務。

什么不起作用:

重啟后喚醒應用程序或強制退出來電。

我看到這個過程在Instruments活動監視器中的傳入呼叫上啟動但是看起來有些東西從那里起作用,因為我沒有得到來電ui。

問題:

  1. 當應用程序未運行時,傳入通知的入口點是什么? -pushRegistry:didReceiveIncomingPushWithPayload:forType:或者也許(僅) -application:didFinishLaunchingWithOptions: ?
  2. 我存儲了我的憑據,以便在鑰匙串中注冊服務器。 是否有可能在應用程序啟動期間有一個點,現在查詢鑰匙串的時間還為時過早?

更新:

我自己想出了一個解決方案 這更像是客戶端和服務器之間的時間問題。 所以這對我有用。

  1. 從啟動應用程序的服務器發送推送
  2. 在收到推送后,給應用程序一些時間啟動並在sip服務器上重新注冊
  3. 使用最新的注冊信息向客戶發送INVITE

同樣重要的是不要太早調用推送通知委托上的完成處理程序,這將使應用程序重新進入休眠狀態,並且永遠不會收到INVITE。

也許有幫助,這將使場景更寬容一些。 如果您的SIP服務器發送邀請幾次,請確保在每個服務器上始終使用最新的注冊信息。 意思是......讓我們說第一個INVITE發送得太早到一些過時的注冊信息,客戶端仍然會啟動嘗試在服務器上更新該信息...確保下一個使用更新的信息。 一些sip服務器只使用每次迭代可用的第一個信息。 因此,如果客戶端沒有收到任何信息,您將永遠等待。

每次啟動應用程序時,都應該實例化PKPushRegistry實例並設置其委托。 這應該是響應UIApplication -application:applicationDidFinishLaunching…回調之一,而不是(例如)在視圖控制器的-viewWillAppear/-viewDidAppear回調中,因為只有在后台啟動應用程序時才會調用前者。 一些開發人員遇到了錯誤,他們只在視圖控制器或其他代碼路徑中實例化PKPushRegistryPKPushRegistry在應用程序在前台啟動時(即顯示可見的用戶界面時)相關,所以請注意PKPushRegistry對此對象進行實例化無論是背景還是前景。

創建PKPushRegistry並分配其委托后,它將有資格接收傳入推送通知有效負載的委托回調,並且您的應用應該能夠處理這些有效負載並處理來電。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM