我正在用VoIP和CallKit开发一个应用程序。我知道类似的问题在不同的论坛上经常被问到,但不幸的是没有得到真正的回答。而且,这些帖子大多是在2015年左右发布的,所以我想,很有可能已经发生了很大的变化,因为有些人可能已经意识到了,同时,如何才能做到这一点。
什么起作用了:
当应用程序在前台运行或发送到后台时,它也会使用沙箱服务器接收推送通知,也就是生产服务器。
我使用的是iOS 11和Xcode 9,需要在“功能”中启用常规推送通知,并将voip后台模式手动添加到info.plist中,以便调用委托方法。仅链接CallKit和PushKit并不足以接收通知。我还启用了背景音频、后台获取和远程通知。在进行push注册表注册之前,我还创建了一个后台任务,并在收到push令牌后结束该任务。
不起作用的:
在重启后唤醒应用程序,或者在接到电话时强制退出。
不过,我在仪器活动监视器中看到了在传入呼叫上启动的过程,但是看起来好像有什么东西在那里不起作用,因为我没有得到传入呼叫ui。
问题:
-pushRegistry:didReceiveIncomingPushWithPayload:forType:还是(仅) -application:didFinishLaunchingWithOptions:?更新:
我自己想出了解决办法。这更多的是客户端和服务器之间的时间问题。所以这就是对我有用的东西。
同样重要的是不要过早调用push通知委托上的完成处理程序,这将使应用程序重新进入睡眠状态,并且永远不会收到邀请。
也许还会有所帮助,也可能会让情况变得更加宽容。如果您的sip服务器发送了几次invite,请确保每次都使用最新的注册信息。意思是..。假设第一个邀请发送得太早,一些过时的注册信息,而客户端仍然启动试图更新服务器上的信息.确保下一次使用更新的信息。有些sip服务器只使用每个迭代可用的第一个信息。所以你会永远等待而不收到客户的任何信息。
发布于 2017-11-21 18:31:17
每次应用程序启动时,它都应该实例化一个PKPushRegistry实例并设置它的委托。这应该是在响应UIApplication -application:applicationDidFinishLaunching…回调时发生的,而不是在视图控制器的-viewWillAppear/-viewDidAppear回调中(例如),因为只有在后台启动应用程序时才调用前者。有些开发人员遇到错误,他们只在视图控制器或其他代码路径中实例化PKPushRegistry,而这些代码路径仅在前台启动应用程序(即显示可见UI时),因此请注意,无论该对象是背景还是前台,总是实例化的。
一旦您创建了一个PKPushRegistry并分配了它的委托,它就有资格接收传入的推送通知有效负载的委托回调,并且您的应用程序应该能够处理这些有效负载并处理传入呼叫。
https://stackoverflow.com/questions/47369658
复制相似问题