2012-01-03 29 views
19

Sto costruendo un'applicazione per iPhone che dipende dai dati di un database online.Servizi push iOS: è possibile una notifica push invisibile?

Per aggiornare i dati nell'app posso controllare a un determinato intervallo di tempo se è necessario un aggiornamento ma è molto più interessante se potessi utilizzare un servizio push che invia una notifica all'app facendogli sapere che è ora di un aggiornamento.

Non sto parlando di notifiche push visibili qui, solo una notifica push invisibile per attivare il metodo di aggiornamento nella mia app.

Esiste un modo standard per farlo oppure è possibile utilizzare i servizi di notifica push di Apple a questo scopo?

Con altre parole: ora sto utilizzando pull per ottenere gli aggiornamenti, c'è un modo per far sì che il back-end della mia app sappia che è l'ora di un aggiornamento?

Modifica: E se è impossibile, quale sarebbe il buon intervallo di tempo per l'aggiornamento (0,03 kb se non ci sono aggiornamenti). È molto da controllare ogni 30 secondi?

+0

Ciao, in modo da trovare la soluzione? –

+0

No, alla fine ho deciso di continuare a tirare ... forse implementerò qualcosa di diverso nella versione 2.0 della mia app :) – Tieme

risposta

27

C'è una documentazione ben spiegata nello Apple Online Library.

con Apple servizio di notifica push (APN) è possibile ottenere qualsiasi combinazione di:

  • un messaggio di avviso per visualizzare all'utente
  • Un numero da badge sull'icona dell'applicazione con
  • Un suono a play

Quando dico qualsiasi intendo dire che non è possibile alcun avviso, nessun badge e nessun suono. Le notifiche remote sono disponibili anche se l'applicazione è chiusa (ma almeno una volta eseguita, per registrarsi nel servizio di notifica), iOS ha il debito di gestire la spinta e svegliare l'applicazione.

Se si desidera utilizzare APNS è necessario

  • un server web (genererà la spinta)
  • una CSR dal server Web
  • un certificato di mela confidando proprio server (questo è il motivo della RSI)
  • un'applicazione iOS con un App ID configurato per le notifiche

con tutto ciò che riguarda la RSI e tru pungere il tuo server è dettagliato nel portale di provisioning iOS, nella sezione "App ID", nella scheda "Come". Prova this link.

Nel vostro server Web deve essere ospitato il provider APNS che farà queste due azioni:

  • Registrare un token che identifica un impianto di cemento su un dispositivo iOS concreta. Questo token è generato per l'APN di Apple e verrà inviato al fornitore dalla tua app. enter image description here

  • generare le notifiche push: verrà inviato dal provider ad Apple APNS, un APNS Apple consegna al vostro app (con una modalità di silenzio allarme e/o il badge e/o il suono e/o) enter image description here

La notifica APNS verrà inviata all'app utilizzando il sistema di notifica remota.

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

È possibile esaminare il Easy APNS App Delegate

Come provider è possibile utilizzare il proprio sviluppata oppure è possibile utilizzare/modificare chiunque già scaricabile come

Quindi la risposta è SI, è possibile. Utilizzando Easy APNS esamples, la generazione spinta deve assomigliare a questo:

$apns->newMessage(1); 
$apns->addMessageCustom('acme2', array('bang', 'whiz')); 
$apns->queueMessage(); 
+1

Grazie per questa risposta dettagliata e informazioni, ma non riesco a scoprire direttamente come inviare un messaggio push a Apple senza un suono/avviso/badge, sai dove dovrei cercare nei doc di facile APNS? – Tieme

+0

Ho modificato la mia risposta per aggiungere un rapido esempio. – Esepakuto

+0

tnx, lo proverò – Tieme

3

Non è possibile inviare una notifica push invisibile mentre l'applicazione è in background. L'unico modo è aggiornare i dati quando l'applicazione arriva in primo piano.

È necessario verificare in un determinato intervallo di tempo se è necessario un aggiornamento o effettuare una connessione pull con il server.

+0

E quando l'applicazione è in primo piano? È possibile utilizzare la spinta allora? – Tieme

+0

No, sarà necessario estrarre il contenuto dal server a un determinato intervallo o su azioni selezionate. C2DM è meglio di APNS in quel caso! – pgratton

1

È possibile ricevere una notifica mentre si è in primo piano, ma il server non farà alcuna differenza se si è in background o in primo piano, a meno che non si invii al server informazioni che si trovano in primo piano.

Ecco perché nel tuo caso, come descritto nel messaggio precedente, è meglio controllare con il server quando sei venuto da sfondo o quando l'applicazione si avvia se c'è qualche upload.

L'altra opzione è quella di inviare una notifica visibile in modo che l'utente avrà inizio l'applicazione e quindi l'aggiornamento (come descritto nel paragrafo precedente) volontà accade

+0

Non è un'opzione per utilizzare la notifica visibile. Non voglio disturbare l'utente con il processo di sincronizzazione. – Tieme

0

utilizzare i metodi delegato applicationDidRecieveRemoteNotification a dire l'applicazione per il check-in con il servizio di aggiornamento. Oppure puoi fare in modo che l'app esegua il polling del servizio di aggiornamento durante l'applicationwillEnterForgound di non voler impostare le notifiche push.

0

Non penso che il tuo sia l'approccio giusto. Considerate tutte le cose che si costruirà per un compito semplice: 1) server per spingere 2) la registrazione per la notifica 3) che va di sfondo e di riprendere (il grande e complicato è il server per la notifica push)

e comunque quando hai ricevuto un messaggio, devi chiedere i dati ... nessun risparmio confrontando le richieste direttamente.

Quindi una soluzione pulita può essere: 1) chiedere al server utilizzando il normale protocollo HTTP (con richiesta asincrona NSURL ..), ad esempio: http: // ...... & lastUpdate = '2012: 05 : 01 18 00' che passano l'ultima data di aggiornamento abbiamo ottenuto un download di successo (È anche possibile utilizzare un tempo unicx timbro ...)

2) il server confronterà tale data con la sua ultima data di aggiornamento interno: se ha una data più recente, risponderà con XML o plist (preferisco plist ...)

3) l'app scarica nuovi dati e aggiorna la data/ora.

4) se nessun dato la risposta è semplicemente una stringa vuota o per esempio la stessa data che abbiamo inviato.

0

Breve risposta alla tua prima domanda: Bisogna interrogare.

Perché: - Quando la tua applicazione è in background, non può sapere di eventuali notifiche push, a meno che non ci sia un avviso e l'utente fa clic View o Launch, che non è garantito (e non si vuole l'avviso troppo).

Si potrebbe anche voler evitare di utilizzare APNS (se è solo per questo scopo), a causa del sovraccarico aggiuntivo della configurazione di un server con certificati Apple e tutto quel jazz.

Per rispondere alla seconda domanda: la frequenza con cui si desidera che gli aggiornamenti dipenda da ciò che fa l'app. Ad esempio, se si visualizzano i valori "Stock", è possibile aggiornare i dati ogni pochi secondi. Per il tempo, potrebbero essere alcune ore. Per altri, potrebbero essere giorni o anche più lunghi. Dipende dalla gravità degli aggiornamenti per l'utente.

+0

Sei sicuro che sia corretto? Avevo l'impressione che le app in background potessero ancora gestire le notifiche push. –

+0

Potresti elaborare "handle push notification"? Quando un'app è in background, è in stato sospeso e non conosce nulla finché non viene riavviata (vedere la risposta sopra). In iOS 4+, Apple ha introdotto "Background Execution e Multitasking", ma il modo generale e consigliato è ancora di lasciarlo sospendere. – Sailesh

+0

Rif: https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW20 – Sailesh

4

Sì, è possibile con iOS 7+

È possibile ricevere le notifiche "sfondo" push se si ignora questo metodo di UIApplicationDelegate: application(_:didReceiveRemoteNotification:fetchCompletionHandler:)

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) 
{ 
    // do what you need i.e. download fresh content (max. 30 seconds) 

    completionHandler(UIBackgroundFetchResult.NoData) 
} 

la documentazione di questo metodo metodo dice:

Utilizzare questo metodo per elaborare incomin g notifiche remote per la tua app. Diversamente dall'applicazione: didReceiveRemoteNotification: metodo, che è chiamato solo quando l'app è in esecuzione in primo piano, il sistema chiama questo metodo quando l'app è in esecuzione in primo piano o nello sfondo . Inoltre, se hai attivato la modalità di background delle notifiche remote , il sistema avvia la tua app (o la riattiva dallo stato sospeso ) e la inserisce nello stato di background quando arriva una notifica remota .

Non dimenticare di abilitare "Background recuperare" e "notifiche remote" nelle modalità di sfondo.

enter image description here

More info about background execution here.