原因:“杀死应用程序,因为它在收到PushKit VoIP推送回调后从未向系统发布传入呼叫。”

我正在寻找解决方案,但还没有发现。我的应用程序仅接收VoIP推送,而在iOS 13之后,当应用程序处于后台模式时,我将无法再接收推送。我看了其他问题,但无法通过提出的解决方案解决问题。 有人可以帮助我吗?

  

在iOS 13.0及更高版本上,必须使用CallKit框架在收到传入的IP语音呼叫时报告它们,并且在didReceiceIncomingPush()方法执行完之前,必须使用CallKit框架进行报告,否则系统将终止您的应用程序。

     

反复无法报告呼叫可能会阻止您的应用接收更多来电通知。

     

基本上,您不能再将VoIP推送用于非VoIP消息传递,而将需要使用常规的推送通知。

我阅读了此公告,但是在我的应用中,对于特定类型的推送VoIP,我无法使用功能reportNewIncomingCall(),因为它需要以下参数:uuid,handle,hasVideo ecc。 这些参数不存在于有效载荷中。

YC4130332000 回答:原因:“杀死应用程序,因为它在收到PushKit VoIP推送回调后从未向系统发布传入呼叫。”

从iOS 13开始,您只能使用VoIP推送来报告来电。对于不是来电的推送,您必须使用其他选择(请在此处查看此answer)。

  

反复无法报告呼叫可能会阻止您的应用接收更多来电通知。

从我的测试来看,它似乎仅报告两次或3次失败后就阻止了所有VoIP推送,并且将在大约24小时内保持阻止状态。

  

因为它需要以下参数:uuid,handle,hasVideo ecc。这些参数不存在于有效载荷中

如果您收到新来话的VoIP推送,但仍然没有上面列出的必需信息,则可以使用“虚拟”值初始化该呼叫,然后更新它们。例如,将remoteHandle设置为import csv,os from PIL import Image input_path = r'C:\Users\isaac\OneDrive\Documents\Prao\dataset-image-super-resolution.zip\dataset-upload-to-kaggle\finished\train\dataraw\hires' data = os.listdir(input_path) # here is the error ,然后使用正确的值对其进行更新:

CXHandle(type: .generic,value: "Connecting...")
,

这不是有效载荷问题。您可以创建自己的有效负载。只是您必须在此回调中调用以下函数。

func pushRegistry(_ registry: PKPushRegistry,didReceiveIncomingPushWith payload: PKPushPayload,for type: PKPushType,completion: @escaping () -> Void)

否则,苹果将阻止推送通知一段时间。

provider.reportNewIncomingCall(with: uuid,update: update) { error in
completion() }
,

如果将呼入实现为另一个函数并按以下方式进行调用。它不起作用

func pushRegistry(_ registry: PKPushRegistry,completion: @escaping () -> Void) {
    yourIncomingCallFunction()
}

相反,请尝试以下操作:

func pushRegistry(_ registry: PKPushRegistry,completion: @escaping () -> Void) {

            print("didReceiveIncomingPushWith payload")

            if let callerID = payload.dictionaryPayload["callerID"] as? String,let hasVideo = payload.dictionaryPayload["hasVideo"] as? Bool{
                let update = CXCallUpdate()
                 update.remoteHandle = CXHandle(type: .generic,value: callerID)
                 update.hasVideo = hasVideo


                 let bgTaskID = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
                self.provider?.reportNewIncomingCall(with: UUID(),update: update,completion: { (_) in
                    completion()
                })
                UIApplication.shared.endBackgroundTask(bgTaskID)
            }
        completion()
    }

这已在pushRegistry:didReceiveIncomingPushWith payload with completion handler函数内部实现了呼叫提供者发布呼叫请求的功能。这对我有用。

使用终端命令尝试VOIP请求:

curl -v -d '{"callerID": "test@test.com","uuid":"YourUDIDorEmptyField","hasVideo": false}' --http2 --cert yourvoipcertificatepemfile_Here.pem:pemfilePassword_Here https://api.development.push.apple.com/3/device/yourDeviceTokenID_generated_with_update_push_credentials_with_token_Here

替换:

  1. test@test.com以及有关CXHandle.HandleType的详细信息 如果是您的呼叫者姓名(.generic)或电子邮件(.emailAddress)或电话号码(.phoneNumber

  2. YourUDIDorEmptyField和您的UUID一起使用,也可以保留为空,就像reportNewIncomingCall(with: UUID(),update: callUpdate)在代码本身中初始化UUID()一样。

  3. "hasVideo" : false,这里的false显然是Boolean (true/false),它处理传入呼叫屏幕上的Audio / Video呼叫状态,您可以使用它来识别呼叫的确切类型是通过实施它。

  4. yourvoipcertificatepemfile_Here是从voip证书(.pem中导出的voipcertificate.cer文件的名称,它不是直接导出的,而是从开发人员帐户生成并安装到计算机后导出的。然后在您的keychain -> mycertificates 导出中作为带有密码(.pem)的pemfilePassword_Here文件。)

  5. pemfilePassword_Here是从安装的voip证书中导出.pem文件时输入的密码。 (请参阅第4点。)

  6. yourDeviceTokenID_generated_with_update_push_credentials_with_token_Here应该替换为通过遵循token的{​​{1}}方法生成的Delegate。见下文。

    PKPushRegistryDelegate

    func pushRegistry(_ registry: PKPushRegistry,didUpdate pushCredentials: PKPushCredentials,for type: PKPushType) {

如果您有任何疑问,请告诉我。我已经在前景,背景,锁屏中的应用程序上对此进行了测试,甚至从最近的应用程序中删除了该应用程序。 (iOS 13.4.1和Xcode版本11.4(11E146))

,

iOS会终止应用程序,即使不是在iOS 13上也不行。苹果公司本身表示,如果该应用程序是在iOS 13和更高版本上开发的,它将终止,但在无法报告后仍会终止应用程序。我已经与Apple开发人员支持小组进行了交谈,他们说只有iOS 13可以做到这一点,但仍然出现错误。

本文链接:https://www.f2er.com/3082201.html

大家都在问