VoIP、PushKit和应用程序唤醒

5
我正在使用PushKit和CallKit开发VoIP应用程序。我知道类似的问题在不同的论坛上已经被问了很多次,但遗憾的是没有得到真正的答案。此外,大多数这些帖子都来自2015年左右,因此我认为可能有很多东西已经改变了,也许有人已经想出了如何使其工作。
正在工作的内容:
当应用程序在前台运行或发送到后台时,它使用沙盒服务器以及生产服务器接收推送通知。
我使用的是iOS 11和Xcode 9,需要在“功能”中启用常规推送通知,并手动将voip背景模式添加到info.plist中,以便调用委托方法。仅链接CallKit和PushKit不足以接收通知。我还启用了背景音频、后台获取和远程通知。在执行推送注册之前,我还创建了一个后台任务,并在接收到推送令牌后结束该任务。
未能解决的问题:
在重新启动或强制退出时唤醒应用程序以响应来电。
虽然我在Instruments活动监视器中看到进程在来电时启动,但从那里看起来好像有些东西不起作用,因为我没有看到来电界面。
问题:
1.当应用程序未运行时,来电通知的入口点是什么?-pushRegistry:didReceiveIncomingPushWithPayload:forType:还是(仅)-application:didFinishLaunchingWithOptions:?
2.我将我的凭据存储在钥匙串中以向服务器注册。是否可能在应用程序启动期间有一个时机过早查询某些内容的情况?
更新:
我自己找到了解决方案。这更像是客户端和服务器之间的时间问题。所以这是对我有效的方法。
1.从启动应用程序的服务器发送推送
2.在接收到推送后,给应用程序一些时间来启动并重新注册到sip服务器
3.使用最新的注册信息向客户端发送INVITE
另外重要的是不要太早调用推送通知委托上的完成处理程序,否则应用程序会回到睡眠状态,INVITE将永远不会被接收。
此外,也许有帮助的是使场景更加宽容。如果您的sip服务器多次发送邀请,请确保每次都使用最新的注册信息。也就是说...假设第一个INVITE太早发送到一些过时的注册信息上,并且客户端仍在尝试在服务器上更新该信息...请确保下一个使用已更新的信息。一些SIP服务器只为每个迭代使用第一个可用的信息。因此,您将永远等待而没有在客户端上接收到任何内容。

当您收到VoIP推送时,本地通知将被安排包含音频(铃声)文件,并且您点击后进入VoIP委托方法。当您通过应用程序图标打开应用程序时,入口点将是didfinishlaunchingwithoption方法。在此处了解更多信息:https://github.com/hasyapanchasara/PushKit_SilentPushNotification - Hasya
这是一个启动客户端和接收服务器发来的INVITE之间的时间问题。请参见更新后的原始帖子。 - Gert Andreas
你是如何处理来电的呢?能否给我一些提示或代码,逐步解释从接收VoIP通知到开始通话的过程。 - Paresh. P
我收到了didReceiveIncomingPushWithPayload的调用,但应用程序没有自动唤醒。 - Paresh. P
1个回答

0
每次您的应用程序启动时,它都应该实例化一个PKPushRegistry实例并设置其委托。这应该是响应UIApplication -application:applicationDidFinishLaunching…回调之一发生的,而不是(例如)在视图控制器的-viewWillAppear/-viewDidAppear回调中,因为只有前者在您的应用程序在后台启动时被调用。一些开发人员遇到了错误,其中他们仅在视图控制器或其他代码路径中实例化了PKPushRegistry,这些代码路径仅在应用程序在前景(即显示可见UI时)启动时才相关,因此请注意,无论是后台还是前台,始终实例化此对象。
一旦您创建了PKPushRegistry并分配了其委托,它将有资格接收传入推送通知负载的委托回调,并且您的应用程序应该能够处理这些负载并处理传入呼叫。

这已经被设置为那样了。谢谢。请查看原帖获取我的解决方案。 - Gert Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接