VoIP,PushKit和应用程序唤醒

时间:2017-11-18 18:35:38

标签: ios voip callkit pushkit silentpush

我正在使用PushKit和CallKit开发VoIP应用程序。我知道在不同的论坛上经常会问到类似的问题,但遗憾的是从未真正回答过。此外大部分帖子都来自2015年左右,所以我认为很多机会可能已经改变,有人可能会想到如何使这个工作。

什么工作:

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

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

什么不起作用:

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

我看到这个过程在乐器活动监视器中的来电启动,但看起来有些东西不起作用,因为我没有收到来电ui。

问题:

  1. 当应用未运行时,传入通知的入口点是什么? -pushRegistry:didReceiveIncomingPushWithPayload:forType:或者(仅)-application:didFinishLaunchingWithOptions:
  2. 我存储了我的凭据,以便在钥匙串中注册服务器。是否可能在应用程序启动过程中发现一个问题,因为查询钥匙串是否为时过早?
  3. 更新:

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

    1. 从启动应用程序的服务器发送推送
    2. 在收到推送
    3. 后,给应用程序一些时间启动并在sip服务器上重新注册
    4. 使用最新的注册信息向客户发送邀请
    5. 同样重要的是不要过早地调用推送通知委托上的完成处理程序,这将使应用程序重新进入休眠状态,并且永远不会收到INVITE。

      也许有用,可以使场景更宽容一些。如果您的SIP服务器发送邀请几次,请确保在每个服务器上始终使用最新的注册信息。意思是......让我们说第一个INVITE发送到某些过时的注册信息太早了,客户端仍然会尝试在服务器上更新该信息...确保下一个使用更新的信息。一些sip服务器只使用每次迭代可用的第一个信息。因此,如果客户端没有收到任何信息,您将永远等待。

1 个答案:

答案 0 :(得分:0)

每次启动应用时,都应该实例化PKPushRegistry实例并设置其代理。这应该发生在UIApplication -application:applicationDidFinishLaunching…回调之一,而不是(例如)在视图控制器的-viewWillAppear/-viewDidAppear回调中,因为只有在您的应用启动时调用前者的背景。一些开发人员遇到了错误,他们只在视图控制器或其他代码路径中实例化了PKPushRegistry,这只是在前景中启动应用时才相关(即显示可见的用户界面时) ,所以请注意不管它是背景还是前景,都要实例化这个对象。

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