推送通知代码执行(强制退出应用)

Posted

技术标签:

【中文标题】推送通知代码执行(强制退出应用)【英文标题】:Push Notification code execution (forced-quit app) 【发布时间】:2015-08-14 18:33:07 【问题描述】:

我想知道像 Whatsapp 这样的应用程序如何能够向消息的发件人提供送达回执(双重绿色检查)。

我已经看到,即使您强制退出 Whatsapp(使用应用程序任务切换器并刷掉应用程序),发件人仍然会在收到推送通知的那一刻收到交货收据(双绿色检查)电话。显然,他们能够在收到推送通知时执行代码(向后端发出请求,通知交付)。

由于ios7可以发送带有“content-available”的推送通知有效负载:1,这使得通知的接收者能够执行用户代码,所以,首先我以为他们正在使用这个功能。 但是,如果用户强制退出应用程序,则在收到通知时不会执行用户代码。因此,我无法模仿 Whatsapp 的行为。

我已启用功能>后台模式并检查了远程通知。

我正在使用这种方法处理通知:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

我正在使用此有效负载发送通知:


    "aps":
            "alert":"Hello world",
            "sound":"MySound.wav",
            "content-available":1
    

我已经检查过了:

Will iOS launch my app into the background if it was force-quit by the user? WWDC 视频 Whats New With Multitasking(来自 WWDC 2013 的#204)

我还阅读了有关 PushKit 的信息(尽管我没有尝试过),这可能对这里有所帮助,但我的理解是该应用程序需要是一个 VOIP 应用程序。显然,我不想让我的应用程序上的 VOIP 在收到推送通知时只执行代码。

谢谢。

【问题讨论】:

【参考方案1】:

您刚刚在描述中回答了您的问题。

    如果应用被强制退出,则无法通过常规推送通知唤醒应用。

    见App Programming Guide for iOS:

    在大多数情况下,系统在应用程序被强制后不会重新启动它们 由用户退出。一个例外是位置应用程序,它在 iOS 8 和 后来被用户强制退出后重新启动。其他 但是,在某些情况下,用户必须明确启动应用程序或重新启动 应用程序可以在设备启动前自动进入 系统后台。

    VoIP 推送通知可以唤醒应用,即使它被强制退出。

    见Voice Over IP (VoIP) Best Practices:

    如果您的应用在 VoIP 时没有运行,它会自动重新启动 收到推送。

    WhatsApp 中的两个 蓝色 标记表示收件人已阅读消息。如果您在收到推送通知后获得两个 蓝色 标记,则这是 WhatsApp 中的设计错误或错误,因为您无法判断用户是否真的阅读了通知。如果您得到两个 灰色 标记,则仅表示消息已发送到设备。同样,如果您在收到推送通知并且应用程序被强制退出之后获得两个 灰色 标记,则 WhatsApp 正在(错误)为此使用 VoIP 推送,或者他们只是假设推送是已交付或将交付。

【讨论】:

谢谢巴里斯。在收到推送通知后,无论应用程序是否强制退出,我都会得到两个绿色(灰色)标记。我猜当时他们正在为此使用VoIP。我做了更多的研究并测试了向在没有 VoIP 推送的 iOS7 上安装了 Whatsapp 的设备发送消息(PushKit 适用于 iOS>=8),在这种情况下,我没有得到两个绿色(灰色)标记,所以我可以得出结论,我的理论(他们使用 PushKit VoIP 推送)是正确的。

以上是关于推送通知代码执行(强制退出应用)的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序被用户强制退出时处理推送通知iOS(替代方案?)

当用户通过向上滑动强制退出应用程序时,可操作的推送通知不会出现在 iOS 8+ 设备上

使用firebase发送静默推送通知,以便在应用程序被杀死时唤醒它

静默推送通知。 iOS

如果我们手动强制停止应用程序,推送通知不起作用

什么是静默推送通知?设备什么时候收到?