由于Voip推送,应用程序如何确定它是否从终止状态启动?

[注意:这个问题是关于VoiP的推动,而不是普通的推送] [注2:问题不在于如何设置一个应用程序来接收VoIP推送,正确地阅读它实际上要求]。

如果应用程序被终止,并且Voip推送到达,则在didFinishLaunchingWithOptions中选项为零。 (例如,如果在用户点击本地通知时启动应用程序,则可以对比这一点)。

一个应用程序如何知道它是由于VoIP推送的到来而推出的,而不是在应用程序已经在后台的时候推送到达?

您需要将委派设置为已创build的PKPushRegistry对象,并将其指定为VOIPtypes:

 let voipRegistry = PKPushRegistry(queue: nil) voipRegistry.delegate = myPushDelegate voipRegistry.desiredPushTypes = [PKPushType.voIP] 

你的委托必须符合PKPushRegistryDelegate协议。

然后,执行pushRegistry(_:didReceiveIncomingPushWith:for:completion:)协议函数( 引用 ) – 这个函数将在接收到推送(即使在应用程序被提前终止)时被调用。

function说明:

通知委托人已收到远程推送。

指定的推送types。 完成处理负载后立即调用完成处理程序。当接收到推送通知时,将调用此方法

请注意这个函数: pushRegistry(_:didReceiveIncomingPushWith:for:)pushRegistry(_:didReceiveIncomingPushWith:for:)已被弃用,所以不要和我上面提到的那个混淆。

有关PKPushRegistryDelegate协议的更多信息: 在这里

关于实际的问题,有一个解决办法 – 这个想法是创build一个标志,当应用程序终止时将被销毁,但一旦它醒来,状态将会改变 – 如果应用程序从后台醒来,标志状态将被保存,但如果应用程序在终止后醒来,该标志将保持默认值。

在推送的委托类中:

 import PushKit class PushDelegate: PKPushRegistryDelegate { var flag = false func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) { if flag { print("the app woke up from background") } else { print("the app was terminated") flag = true } } } 

另外,为了检测用户是否启动了应用程序(这是应用程序处于活动状态的唯一情况),请使用以下代码:

 let state = UIApplication.shared.applicationState if state == .background { // background } else if state == .active { // foreground }