当应用程序被杀死时,iOS 没有收到推送通知

Posted

技术标签:

【中文标题】当应用程序被杀死时,iOS 没有收到推送通知【英文标题】:iOS doesn't receive Push notification when the app is being killed 【发布时间】:2017-07-11 12:53:04 【问题描述】:

我在 Stack Overflow 上也发现过类似的问题,但都没有弄清楚这一点。

我正在使用 Firebase Cloud Messaging 在我的应用中发送推送通知。我将收到的消息存储在本地数据库中。当我的应用程序处于活动状态或在后台时,我的应用程序能够接收通知(正确调用委托方法)但如果应用程序被强制退出或不在内存中,那么设备也正在接收通知并坐在通知中心但是当应用程序由图标启动时,没有调用任何委托方法。如果用户在通知中心单击消息,则应用程序会启动,但仅接收单击的消息而不是所有消息(在收到多个通知的情况下)。 根据 Apple - 如果用户强制退出,系统不会自动启动您的应用程序。在这种情况下,用户必须重新启动您的应用或重启设备,然后系统才会再次尝试自动启动您的应用

但是即使用户启动了应用程序仍然没有收到收到并坐在通知中心的通知。

以下是应用所遵循的要点:

我的应用没有 VoIP 功能。 Content-available 已设置为 1。 已启用接收后台远程通知。 所有发送的通知都已收到并显示在通知中心。

    aps =     
        alert =         
            body = "Push Notification Test Message";
            title = Push Notification;
        ;
        badge = 1;
        "content-available" = 1;
        sound = default;
    ;
    "gcm.message_id" = "0:1499340350307980%361a2e5b361a2e5b";
    m = "Push Notification Test Message";
    tag = m;

【问题讨论】:

当您的应用程序被杀死时,您是否在设备中收到通知? 是的,无论我的应用程序处于何种状态,我的设备都会收到所有通知。 我添加了我的答案。请检查一下。 【参考方案1】:

    如果应用程序被强制退出或不在内存中,那么您的应用程序将不会收到静默通知(即 Content-available 设置为 1)。 在上述情况下只接收推送通知。

    如果用户点击通知中心的消息,则应用启动,只有点击的消息才会在委托方法中接收。您无法访问通知托盘中的所有消息。

【讨论】:

【参考方案2】:

您的应用不应依赖推送通知的传递。正如您所发现的,无法保证推送通知的交付。

即使您的应用没有终止,您也可能不会收到所有通知;例如,如果设备处于飞行模式并且发送了多个通知,则当设备重新联机时,只会发送最后一个通知。

您的应用应在启动或收到通知时向服务器检查新消息,以便“赶上”。

您还可以考虑在静默通知中包含消息负载。如果您的应用被终止以提示他们打开您的应用,这将显示给用户。

【讨论】:

你能提供更多关于应用程序应该如何检查的信息吗?应该多频繁?是否应该考虑使用HEAD 请求?我已经问了所有这些问题here,但到目前为止还没有收到任何回复或评论。如能回复将不胜感激【参考方案3】:

如果应用程序未运行,则无法获取应用程序的推送通知。这是限制。您只能获取和清除本地通知。因此,解决问题的另一种方法是在发送通知时将通知保存在后端。然后在启动应用程序后,您可以从服务器获取通知列表,并将其与 id 匹配。您可以在通知播放负载中发送您想要的任何参数。

【讨论】:

【参考方案4】:

当应用程序通过点击任何通知打开时,您需要处理推送通知的方法。一旦你点击通知应用程序就会醒来并吃午饭。

在 didFinishLaunchingWithOptions 中,您需要输入以下条件:

 if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) 
        NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:[launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]];
    

点击通知时也会调用下面的方法:

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


【讨论】:

我在 didFinishLaunchingWithOptions 中添加了但仍然无法正常工作

以上是关于当应用程序被杀死时,iOS 没有收到推送通知的主要内容,如果未能解决你的问题,请参考以下文章

当 iOS 应用程序被暂停/杀死并且用户点击通知时如何处理 Firebase 推送通知?

iOS React 在应用程序被杀死时推送通知

当应用程序被杀死时,在推送通知后执行操作:react-native,IOS

应用程序被杀死时未收到 IOS 13 VOIP 推送通知

在应用程序未运行时处理推送通知(应用程序被杀死)

当应用程序被杀死Android时无法接收解析推送通知