VoIP、PushKit和应用程序唤醒



我正在使用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回调中,因为在后台启动应用程序时只调用前者。一些开发人员遇到了一些错误,他们只在视图控制器或其他代码路径中实例化了PKPushRegistry,而这些代码路径只有在前台中启动应用程序时才相关(即,在显示可见UI时),因此请注意,无论该对象是后台还是前台,都要始终实例化该对象。

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

相关内容

  • 没有找到相关文章

最新更新