iOS 13 在后台没有收到 VoIP 推送通知

Posted

技术标签:

【中文标题】iOS 13 在后台没有收到 VoIP 推送通知【英文标题】:iOS 13 not getting VoIP Push Notifications in background 【发布时间】:2019-09-26 10:47:39 【问题描述】:

我正在使用 CallKit 和 PushKit 在 Swift 中开发软件电话。在 ios 13 之前,VoIP 通知运行良好。但是在 iOS 13 更新后,我的应用在后台时没有收到 VoIP 推送通知。在前台调用didReceiveIncomingPushWith,但在后台不调用它。

我该如何解决这个问题?

代码

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.
    print("\(#function)")
    let voipPushResgistry = PKPushRegistry(queue: nil)
    voipPushResgistry.delegate = self
    voipPushResgistry.desiredPushTypes = [PKPushType.voIP]

    return true


func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) 
    print("\(#function) token invalidated")


func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) 
    let deviceToken = credentials.token.reduce("", $0 + String(format: "%02X", $1) )
    print("\(#function) token is: \(deviceToken)")


func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) 
    print("\(#function)")
    print("It worked..")
    if type == .voIP 
        print("Uygulama aktif")
    

谢谢。

【问题讨论】:

【参考方案1】:

如果您使用 Xcode 11(和 iOS 13 SDK)构建应用程序,如果您未能向 CallKit 报告,PushKit 将不再工作。

在 iOS 13.0 及更高版本上,如果您未能向 CallKit 报告呼叫,则 系统将终止您的应用程序。多次不报告来电可能 导致系统停止发送更多 VoIP 推送通知 到您的应用程序。如果您想在不使用的情况下发起 VoIP 呼叫 CallKit,使用 UserNotifications 注册推送通知 框架而不是 PushKit。

https://developer.apple.com/documentation/pushkit/pkpushregistrydelegate/2875784-pushregistry

【讨论】:

这应该是公认的答案。 Apple 表示您需要在收到传入的 VoIP 推送后立即向 CallKit 调用 reportNewIncomingCall 函数(在同一个运行循环中)。否则应用程序将在启动时崩溃,并且会产生来电从未到达的效果。如果您在 VoIP 推送到达时的同一运行循环中未能向 CallKit 报告新来电,Apple 将在几次尝试后停止发送 VoIP 推送。 没错,但这个问题有点误导。我知道这个 iOS 13 的限制,但据我所知,如果你没有报告呼叫,无论它是在后台还是在前台,应用程序都会崩溃。所以,这让我觉得这不是正确的答案。 这意味着使用 Xcode 10 构建将暂时避免此限制?有人可以证实这一点吗?我已经将我的故事板升级到 Xcode 11..CallKit 在中国被禁止我需要时间通过 UserNotifications 来采用它。感谢任何帮助。 知道什么应用程序仍在使用 voip 通知吗? 有什么理想的吗?我不知道为什么当应用程序在后台/被杀死时它不起作用【参考方案2】:

@mudassirzulfiqar 在Github 上的回答(感谢他)。卸载并重新安装我的应用程序后,我收到了 voip 推送通知。现在,我将在didReceiveIncomingPushWith 中调用reportNewIncomingCall

我已经解决了这个问题,正如 Apple 在官方论坛中所说的那样,我猜 3 到 5 次尝试后不调用完成将导致您的应用程序被禁止。所以我认为当应用在 2 到 3 次尝试中被禁止时,它就会停止接收 voip。

用例: 我重新安装了我的应用程序并将我的应用程序置于后台并 didReceiveIncomingPushWith 被调用。但是因为我没有在正确的时间使用完成关闭,所以下次我可能不会再收到 voip 了。 当应用程序处于前台时,这始终可以正常工作。

【讨论】:

谢谢!这也适用于我。 PushKit 实际上有两个不同版本的“didReceiveIncomingPushWith”方法,我以前使用没有完成的方法,而使用带有完成处理程序的方法对我有用。再次感谢:) @Rishabh 你能分享一些关于这两个版本的更多信息以及为什么重要吗? @AleksandarT 查看下面的链接developer.apple.com/documentation/pushkit/… 实际上,Apple 刚刚弃用了第一个版本,现在我们需要使用带有完成的版本,这里的完成块是通知我们的过程完成并报告电话。 正确答案! 你是救生员!我花了两天时间解决这个问题。【参考方案3】:

使用 iOS 13 SDK 编译时,您将无法再通过 CallKit 接收 VoIP 通知和报告新来电。

检查this other question,我已经解释了您可以用于不提醒新来电的通知的选项。

【讨论】:

【参考方案4】:

documentation 说:

通常,您会在应用运行期间保持推送注册表对象的运行。

尝试将voipPushResgistry 声明为AppDelegate 的属性,而不是application(didFinishLaunchingWithOptions) 函数的变量。也许它会有所帮助。

【讨论】:

以上是关于iOS 13 在后台没有收到 VoIP 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS8.0.2 上没有收到 Pushkit voip 推送通知

即使应用程序未在后台运行,也可以自动打开应用程序的VoIP推送通知是否可以在iOS中使用?

[iOS][推送通知]没有收到通知

即使应用程序未在后台运行,VoIP 推送通知也会自动打开应用程序,这在 iOS 中是不是可行?

直接在推送 iOS 上启动 App

iOS 模拟器或物理设备未收到 FCM 数据消息