2013-03-03 9 views
15

Non ricevo notifiche edicole quando l'app non è in esecuzione, ecco cosa ho fatto.Ricevere notifiche edicola solo quando l'app è in esecuzione

L'applicazione ha le chiavi plist corrette 'UINewsstandApp = YES' e 'UIBackgroundModes = edicola-content'.

Nel delegato dell'app mi registro per tutti i tipi di notifica e ricevo il mio token da APNS, dal lato server (sto usando una gemma chiamata Grocer), ho impostato il certificato dev e ho inviato un push regolare e funziona .

se invio un push in edicola lo ricevo se l'app è in esecuzione su 'didReceiveRemoteNotification', ma quando l'app non è in esecuzione non ricevo nulla nel centro notifiche, che è principalmente dovuto al fatto che 'Grocer' ha il seguente payload {"aps": {"contenuto disponibile": 1}} e non è possibile aggiungere altri tasti (avviso, badge, ecc.)

così ho pensato che non dovrei ottenere nulla nel centro notifiche, guardo per "UIApplicationLaunchOptionsRemoteNotificationKey" nelle opzioni di avvio, quindi scrivi un file per assicurarti che l'app venga eseguita in background, il file non viene mai scritto come tale

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 

if(remoteNotif) 
    { 
     NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
     NSString *filePath = [cachePath stringByAppendingPathExtension:@"pushreceived.txt"]; 
     [@"testing" writeToFile:filePath atomically:YES encoding:NSASCIIStringEncoding error:nil]; 
    } 

Ho NKDontThrottleNewsstandContentNotifications impostato su true nelle impostazioni predefinite dell'utente, quindi eseguo la sincronizzazione per essere sicuro.

quando l'applicazione è in esecuzione, non importa quante volte i inviare la spinta, ho sempre arrivare una richiamata da "didReceiveRemoteNotification", con il "contenuto-disponibile" corretta

se l'applicazione è chiusa o nel sfondo, non succede nulla.

Aggiornamento:

sono riuscito a cambiare la gemma che invia il carico utile di notifica, ecco il dizionario invia

{"aps"=> 
    { 
    "alert"=>"Hello iPhone!!", 
    "content-available"=>1, 
    "badge"=>1, 
    "sound"=>"default" 
    } 
} 

e qui il dizionario userinfo ricevo sul mio app (durante l'esecuzione)

{ 
    aps =  { 
     alert = "Hello iPhone!!"; 
     badge = 1; 
     "content-available" = 1; 
     sound = default; 
    }; 
} 

si prega di notare le virgolette intorno a contenuti disponibili, questo significa che APNS analizzato come una chiave personalizzata?

risposta

3

Per ricevere notifiche quando l'applicazione è in esecuzione in background, è necessario aggiungere un metodo applicationDidEnterBackgroud alla classe principale. Dal Apple documentation:

Le applicazioni possono anche trovare le notifiche locali utile quando vengono eseguiti in background e qualche messaggio, i dati, o un altro elemento arriva che potrebbe essere di interesse per l'utente. In questo caso, devono presentare immediatamente la notifica utilizzando il metodo di applicazione UIA presentLocalNotificationNow: (iOS consente a un'applicazione di avere un tempo limitato per l'esecuzione in background). Listing 2-2 illustra come puoi farlo.


- (void)applicationDidEnterBackground:(UIApplication *)application { 
    NSLog(@"Application entered background state."); 
    // bgTask is instance variable 
    NSAssert(self->bgTask == UIInvalidBackgroundTask, nil); 

    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [application endBackgroundTask:self->bgTask]; 
      self->bgTask = UIInvalidBackgroundTask; 
     }); 
    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     while ([application backgroundTimeRemaining] > 1.0) { 

      // Replace this code with your notification handling process 

      NSString *friend = [self checkForIncomingChat]; 
      if (friend) { 
       UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
       if (localNotif) { 
        localNotif.alertBody = [NSString stringWithFormat: 
         NSLocalizedString(@"%@ has a message for you.", nil), friend]; 
        localNotif.alertAction = NSLocalizedString(@"Read Message", nil); 
        localNotif.soundName = @"alarmsound.caf"; 
        localNotif.applicationIconBadgeNumber = 1; 
        [application presentLocalNotificationNow:localNotif]; 
        [localNotif release]; 
        friend = nil; 
        break; 
       } 
      } 
     } 
     [application endBackgroundTask:self->bgTask]; 
     self->bgTask = UIInvalidBackgroundTask; 
    }); 

} 

anche note:

Perché l'unico tipo di notifica supportato per applicazioni non-esecuzione è icona-badging, semplicemente passare NSRemoteNotificationTypeBadge come parametro di registerForRemoteNotificationTypes :.

+0

la notifica in edicola 'in teoria' dovrebbe essere in grado di avviare l'applicazione anche se è disattivata con 'UIApplicationLaunchOptionsRemoteNotificationKey' .. che non sta succedendo atm – Zoidberg

+0

@Zoidberg questa risposta sembra utile? http://stackoverflow.com/a/4296282/187954 –

+0

purtroppo, non è, è essenzialmente quello che sto facendo nel codice nella mia domanda: < – Zoidberg

2

Prova queste come un controllo di integrità:

  • In Impostazioni -> Edicola, è necessario scaricare il contenuto automatico avanti per la vostra applicazione.
  • Assicurati di aver usato [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability] nell'app.
  • Assicurati di aver richiesto la modalità in background come "contenuto di edicola" nel tuo plist.
  • Eseguire l'app nel dispositivo, non nel simulatore.

Se è stato eseguito correttamente, è necessario ricevere una notifica in didReceiveRemoteNotification anche quando l'app non è in esecuzione.

Problemi correlati