我正在使用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服务器只为每个迭代使用第一个可用的信息。因此,您将永远等待而没有在客户端上接收到任何内容。
正在工作的内容:
当应用程序在前台运行或发送到后台时,它使用沙盒服务器以及生产服务器接收推送通知。
我使用的是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服务器只为每个迭代使用第一个可用的信息。因此,您将永远等待而没有在客户端上接收到任何内容。