我正在使用PushKit和CallKit开发VoIP应用程序。我知道在不同的论坛上经常会问到类似的问题,但遗憾的是从未真正回答过。此外大部分帖子都来自2015年左右,所以我认为很多机会可能已经改变,有人可能会想到如何使这个工作。
当应用程序在前台运行或发送到后台时,它会使用沙箱服务器接收推送通知,也是生产服务器。
我在iOS 11和Xcode 9上需要启用常规推送通知功能'以及手动将voip后台模式添加到info.plist以获取要调用的委托方法。单独链接CallKit和PushKit还不足以接收通知。我还启用了背景音频,后台提取和远程通知。我还在执行推送注册表注册之前创建了一个后台任务,并在收到推送令牌后结束该任务。
重新启动后唤醒应用程序或强制退出来电。
我看到这个过程在乐器活动监视器中的来电启动,但看起来有些东西不起作用,因为我没有收到来电ui。
-pushRegistry:didReceiveIncomingPushWithPayload:forType:
或者(仅)-application:didFinishLaunchingWithOptions:
?更新:
自己想出一个解决方案。这更像是客户端和服务器之间的时间问题。所以这对我有用。
同样重要的是不要过早地调用推送通知委托上的完成处理程序,这将使应用程序重新进入休眠状态,并且永远不会收到INVITE。
也许有用,可以使场景更宽容一些。如果您的SIP服务器发送邀请几次,请确保在每个服务器上始终使用最新的注册信息。意思是......让我们说第一个INVITE发送到某些过时的注册信息太早了,客户端仍然会尝试在服务器上更新该信息...确保下一个使用更新的信息。一些sip服务器只使用每次迭代可用的第一个信息。因此,如果客户端没有收到任何信息,您将永远等待。
答案 0 :(得分:0)
每次启动应用时,都应该实例化PKPushRegistry
实例并设置其代理。这应该发生在UIApplication
-application:applicationDidFinishLaunching…
回调之一,而不是(例如)在视图控制器的-viewWillAppear/-viewDidAppear
回调中,因为只有在您的应用启动时调用前者的背景。一些开发人员遇到了错误,他们只在视图控制器或其他代码路径中实例化了PKPushRegistry
,这只是在前景中启动应用时才相关(即显示可见的用户界面时) ,所以请注意不管它是背景还是前景,都要实例化这个对象。
创建PKPushRegistry
并分配其委托后,它将有资格接收传入推送通知有效负载的委托回调,并且您的应用应该能够处理这些负载并处理来电。