我在Stack Overflow上发现了类似的问题,但他们都没有清楚这一点。
我正在使用Firebase Cloud Messaging在我的应用中发送推送通知。我正在存储在本地数据库中收到的消息。当我的应用程序处于活动状态或后台时,我的应用程序可以接收通知(正确调用委托方法),但如果应用程序被强制退出或不在内存中,那么设备也会收到通知并坐在通知中心但是当应用程序由图标启动时,没有调用任何委托方法。如果用户单击通知中心中的“消息”,则会启动应用程序,但仅接收单击的消息,而不是所有消息(在收到多个通知的情况下)。 根据Apple的说法 - 如果用户强制退出系统,系统不会自动启动您的应用。在这种情况下,用户必须重新启动您的应用或重新启动设备,然后系统才会再次尝试自动启动您的应用。
但即使用户启动该应用仍然无法收到通知中心收到的通知。
以下是应用程序遵循的要点:
{
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;
}
答案 0 :(得分:4)
如果应用程序被强制退出或不在内存中,那么您的应用程序将不会收到静默通知(即内容可用设置为1)。 在上述条件下仅接收推送通知。
如果用户单击通知中心的消息,则会启动应用程序,只有在委派方法中才会收到单击该消息的消息。您无法访问通知托盘中的所有消息。
答案 1 :(得分:0)
您的应用不应该依赖推送通知的传递。正如您所发现的那样,无法保证提供推送通知。
即使您的应用未被终止,您也可能无法收到所有通知;例如,如果设备处于飞行模式并且发送了多个通知,则当设备重新联机时,仅传送最后一个通知。
您的应用应在服务器启动时或收到通知时向服务器查询新消息,以便赶上"赶上"。
您还可以考虑在静默通知中包含消息有效内容。如果您的应用程序被终止以提示他们打开您的应用程序,则会向用户显示此内容。
答案 2 :(得分:0)
如果应用未运行,则无法获取应用程序的推送通知。这是限制。您只能获取并清除本地通知。因此,解决问题的另一种方法是在发送时在后端保存通知。然后在启动应用程序后,您可以从服务器获取通知列表,并将其与ID匹配。您可以在通知playload中发送所需的任何参数。
答案 3 :(得分:0)
当通过点击任何通知打开应用程序时,您需要处理推送通知的方法。一旦你点击通知应用程序将唤醒和午餐。
在didFinishLaunchingWithOptions中,您需要置于以下条件:
if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:[launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]];
}
点击通知时,它也会调用以下方法:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
}