VoIP、PushKit 和应用程序唤醒

Ger*_*eas 5 voip ios pushkit silentpush callkit

我正在使用 PushKit 和 CallKit 开发 VoIP 应用程序。我知道类似的问题在不同的论坛上经常被问到,但不幸的是从未得到真正的回答。此外,这些帖子中的大多数都是 2015 年左右的,所以我认为很可能已经发生了很多变化,因为有人可能同时想到了如何让这个工作发挥作用。

什么在起作用:

当应用程序在前台运行或发送到后台时,它也会使用沙箱服务器以及生产服务器接收推送通知。

我使用的是 iOS 11 和 Xcode 9,需要在“功能”中启用常规推送通知,以及手动将 voip 后台模式添加到 info.plist 以便调用委托方法。仅链接 CallKit 和 PushKit 不足以接收通知。我还启用了后台音频、后台获取和远程通知。我还在进行推送注册表注册之前创建了一个后台任务,并在收到推送令牌后结束该任务。

什么不起作用:

重启后唤醒应用程序或来电时强制退出。

我看到在仪器活动监视器中的来电上启动了该进程,但看起来有些东西无法正常工作,因为我没有收到来电用户界面。

问题:

  1. 当应用程序未运行时,传入通知的入口点是什么?-pushRegistry:didReceiveIncomingPushWithPayload:forType:或者也许(仅)-application:didFinishLaunchingWithOptions:
  2. 我将凭据存储在钥匙串中的服务器上注册。是否有可能在应用程序启动过程中的某个时刻查询钥匙串中的某些内容还为时过早?

更新:

我自己想出了一个解决方案。这更多的是客户端和服务器之间的时间问题。所以这对我有用。

  1. 从启动应用程序的服务器发送推送
  2. 收到推送后,给应用程序一些时间来启动并在 sip 服务器上重新注册
  3. 使用最新的注册信息向客户端发送INVITE

同样重要的是不要过早调用推送通知委托上的完成处理程序,这将使应用程序重新进入睡眠状态并且永远不会收到 INVITE。

也可能有帮助,并且可以让场景变得更加宽容。如果您的 sip 服务器多次发送邀请,请确保每次都使用最新的注册信息。意思是……假设第一个 INVITE 发送得太早,导致某些过时的注册信息,并且客户端仍然尝试在服务器上更新该信息……确保下一个 INVITE 使用更新的信息。某些 sip 服务器仅使用每次迭代可用的第一个信息。所以你会永远等待而没有收到客户端的任何信息。

Stu*_*t M 0

每次启动您的应用程序时,它都应该实例化一个PKPushRegistry实例并设置其委托。这应该发生在响应回调之一UIApplication -application:applicationDidFinishLaunching\xe2\x80\xa6,而不是(例如)在视图控制器的-viewWillAppear/-viewDidAppear回调中,因为当您的应用程序在后台启动时仅调用前者。一些开发人员遇到了错误,他们只在视图控制器或其他代码路径中实例化了一个仅在应用程序在前台PKPushRegistry启动时相关的代码路径(即显示可见的 UI 时),因此请注意,无论什么情况,该对象始终都会被实例化。无论是背景还是前景。

\n\n

创建PKPushRegistry并分配其委托后,它将有资格接收传入推送通知有效负载的委托回调,并且您的应用程序应该能够处理这些有效负载并处理传入呼叫。

\n