2015-07-16 15 views
28

Sto lavorando a un'app di grandi dimensioni con un'enorme quantità di codice legacy. Attualmente - c'è un'implementazione per:didReceiveRemoteNotification non funziona in background

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

Il problema è che viene chiamato solo quando l'applicazione è in primo piano o quando l'utente tocca la notifica, mentre l'applicazione è in background. Ho cercato di implementare:

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

ma l'applicazione si comporta allo stesso. In ogni caso - questo metodo non viene chiamato quando l'app è in background. Quale potrebbe essere il problema?

+1

È normale che il metodo non venga chiamato quando l'app è in background.Sistema ti notificherà la notifica attraverso la visualizzazione di un avviso o un banner. – KudoCC

+0

Qual è la versione iOS del tuo dispositivo? E 'almeno 7? Poiché 'fetchCompletionHandler:' richiede iOS minimo 7. –

risposta

60

di attuazione didReceiveRemoteNotification e didReceiveRemoteNotification:fetchCompletionHandler è il modo corretto, ma è anche necessario effettuare le seguenti operazioni:

Assicurati di registrarsi per le notifiche remote, vedere documentation here:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 

    return YES; 
} 

fare anche sicuri di modificare Info.plist e selezionare le caselle di controllo "Abilita modalità sfondo" e "Notifiche remote":

enter image description here

Inoltre, è necessario aggiungere "content-available":1 al carico notifica push, altrimenti l'applicazione non sarà svegliato se è in background (vedi documentation here):

Per una notifica push per innescare un'operazione di download, carico utile di notifica deve includere la chiave di contenuti disponibili con il suo valore impostato su 1. Quando quella chiave è presente, il sistema si sveglia l'applicazione in sullo sfondo (o lancia in background) e richiama l'applicazione l'applicazione del delegato : didReceiveRemoteNotification: fetchCompletionHandler: metodo . L'implementazione di tale metodo deve scaricare il contenuti pertinenti e integrarlo nella vostra applicazione

Così payload dovrebbe almeno simile a questa:

{ 
    aps = { 
     "content-available" : 1, 
     sound : "" 
    }; 
} 
+1

Sto già chiamando registerForRemoteNotificationTypes e le notifiche remote sono abilitate – YogevSitton

+6

@godmoney Vedere la mia risposta di aggiornamento, è necessario aggiungere "contenuto-disponibile": "1" 'al carico utile della notifica. .. –

+1

@BarisAkar Grande. Non conoscevo il carico utile 'content-available'. +1 –

4

Ho avuto lo stesso problema. È apparso un banner di notifica, ma -application: didReceiveRemoteNotification: fetchCompletionHandler: il metodo non è stato chiamato. La soluzione per me che ha lavorato è stato quello di aggiungere attuazione - applicazione: didReceiveRemoteNotification: metodo e chiamata ora di -Application: didReceiveRemoteNotification: fetchCompletionHandler ::

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 

    self.application(application, didReceiveRemoteNotification: userInfo) { (UIBackgroundFetchResult) in 

    } 
} 
+0

Hi ZaEem, hai trovato una soluzione –

+0

quando l'app è in background, inviando una notifica push remota solo questo metodo è chiamato 'func application (applicazione: UIApplication, didReceiveRemoteNotification userInfo: [NSObject: AnyObject])' – Wilson

+0

@UsmanNisar Ho aggiunto la soluzione per il mio problema e sta funzionando bene per me. non sta funzionando per te? –

8
  1. Registrati per spingere la notifica in App delegato.
  2. Aggiungi la modalità in background nelle funzionalità dell'app.
  3. Aggiungi "content-available" = "1" durante l'invio della notifica push (se si sta utilizzando firebase, sostituire "content-available" = "1" di "content_available" = "true" durante l'invio della notifica push dal lato server).