5

Mój projekt używa powiadomień Firebase jako swojej usługi APN, ale korzystałem z Konsoli Firebase do wysyłania powiadomień do mojego urządzenia jako testu, a one pojawiają się tylko (przez wyjście konsoli) na pierwszym planie. Gdy aplikacja jest w tle lub urządzenie znajduje się na ekranie blokady, żadne powiadomienia nie przychodzą na urządzenie. Jednak wynik konsolowy w końcu przychodzi z metody applicationReceivedRemoteMessage po ponownym uruchomieniu aplikacji.applicationReceivedRemoteMessage wykonuje się tylko na pierwszym planie.

func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) { 

     print("%@", remoteMessage.appData) 
     print("QQQQQ") 
    } 

Przykład wyjściowa:

%@ [AnyHashable("notification"): { 
    body = Hi; 
    e = 1; 
}, AnyHashable("from"): 492525072004, AnyHashable("collapse_key"): org.myApp] 
QQQQQ 
+0

Prawdopodobny duplikat [Brak odbioru APN, gdy nie ma aplikacji] (http://stackoverflow.com/questions/40295475/not-receiving-apns-when-out-of-app) – Chris

+0

Pytanie, do którego się odwołałeś nie ma odpowiedzi i jest sformułowane inaczej. –

Odpowiedz

0

Jest problem z iOS i komunikatów danych. Stwierdza here że

iOS, FCM przechowuje komunikat i dostarcza ją tylko wtedy, gdy aplikacja jest w pierwszym planie i ustanowieniu połączenia FCM.

Tak więc MUSI być praca dookoła. Coś podobnego do kopalni:

Send 2 powiadomień push:

1) Normalny obudzić użytkowników telefonów/zainicjować gdy aplikacja jest w tle przy użyciu tego kodu:

{ 
    "to" : "/topics/yourTopicName", 
    "notification" : { 
    "priority" : "Normal", 
    "body" : "Notification Body like: Hey! There something new in the app!", 
    "title" : "Your App Title (for example)", 
    "sound" : "Default", 
    "icon" : "thisIsOptional" 
    } 
} 

2) Powiadomienie o danych, które zostanie uruchomione, gdy użytkownik otworzy aplikację

{ 
    "to" : "/topics/yourTopicName", 
    "data" : { 
     "yourData" : "1", 
     "someMoreOfYourData" : "This is somehow the only workaround I've come up with." 
    } 
} 

, a więc, zgodnie z metodą - (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage obsługiwać dane:

- (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage { 
// Print full message 
NSLog(@"%@", remoteMessage.appData); 
// 
//*** ABOUT remoteMessage.appData ***// 
// remoteMessage.appData is a Key:Value dictionary 
// (data you sent with second/data notification) 
// so it's up to you what will it be and how will the 
// app respond when it comes to foreground. 
} 

będę też zostawić ten kod do uruchomienia powiadomienia wewnątrz aplikacji (tworzenie lokalnych powiadomienia), ponieważ można go użyć do stworzenia wyciszony transparent, może, więc użytkownik zostanie poinformowany ponownie, nawet gdy aplikacja chodzi o planie:

NSDictionary *userInfo = remoteMessage.appData;  
UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
localNotification.userInfo = userInfo; 
localNotification.soundName = UILocalNotificationDefaultSoundName; 
localNotification.alertBody = userInfo[@"yourBodyKey"]; 
localNotification.alertTitle = userInfo[@"yourTitleKey"]; 
localNotification.fireDate = [NSDate date]; 
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 

To spowoduje zgłoszenie samej sekundzie aplikacja przychodzi na pierwszym planie.