Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS 13未在后台获得VoIP推送通知_Iphone_Ios13_Xcode11_Callkit_Pushkit - Fatal编程技术网

Iphone iOS 13未在后台获得VoIP推送通知

Iphone iOS 13未在后台获得VoIP推送通知,iphone,ios13,xcode11,callkit,pushkit,Iphone,Ios13,Xcode11,Callkit,Pushkit,我正在用CallKit和PushKit开发一款Swift软电话。在iOS 13之前,VoIP通知工作正常。但在iOS 13更新后,我的应用程序在后台时不会收到VoIP推送通知。在前台调用didReceiveIncomingPushWith,但在后台不调用它 如何解决此问题 代码 谢谢 报告说: 通常,您会在应用程序运行期间保持推送注册表对象的运行 尝试将voipPushResgistry声明为AppDelegate的属性,而不是应用程序(didFinishLaunchingWithOptions

我正在用CallKit和PushKit开发一款Swift软电话。在iOS 13之前,VoIP通知工作正常。但在iOS 13更新后,我的应用程序在后台时不会收到VoIP推送通知。在前台调用didReceiveIncomingPushWith,但在后台不调用它

如何解决此问题

代码

谢谢

报告说:

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


尝试将
voipPushResgistry
声明为
AppDelegate
的属性,而不是
应用程序(didFinishLaunchingWithOptions)
函数的变量。可能会有帮助。

如果您使用Xcode 11(和iOS 13 SDK)构建应用程序,如果您无法向CallKit报告,PushKit将无法继续工作

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


使用iOS 13 SDK编译时,您不能再接收VoIP通知,也不能通过CallKit报告新的来电


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

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

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

用例: 我重新安装了我的应用程序,并将我的应用程序放到后台 didReceiveIncomingPushWith被调用。但是因为我没有在正确的时间使用完成闭包,我下次可能也不会再收到voip了。 当应用程序在前台时,这总是很好地工作


这应该是公认的答案。苹果表示,在收到传入的VoIP推送后(在同一运行循环中),您需要立即调用reportNewIncomingCall函数调用CallKit。否则,该应用程序将在启动时崩溃,并将产生类似来电从未到达的效果。在几次尝试之后,苹果将停止发送VoIP推送,因为您无法在VoIP推送到达时的同一运行循环中向CallKit报告新的来电。这是正确的,但问题有点误导。我知道iOS 13的限制,但据我所知,如果你没有报告呼叫,应用程序将崩溃,不管它是在后台还是前台。所以,这让我觉得这不是正确的答案。这意味着使用Xcode 10构建将暂时避免这个限制?有人能证实这一点吗?我已经将我的故事板升级到了Xcode 11。CallKit在中国是被禁止的,我需要时间在用户通知中采用它。感谢您的帮助。您知道什么样的应用程序仍然在使用voip通知吗?理想吗?我不知道为什么它不工作时,应用程序在后台/killedThanks!这对我也适用。PushKit实际上有两个不同版本的“didReceiveIncomingPushWith”方法,我以前使用的是未完成的方法,而使用的是完成处理程序的方法。再次感谢:)@Rishabh你能分享关于这两个版本的更多信息吗?AleksandarT查看下面的链接事实上,苹果刚刚否决了第一个版本,现在我们需要使用带有完成的版本,这里的完成块是通知我们的过程已经完成,我们报告呼叫。回答正确!
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")
    }
}