2015-03-29 5 views
7

Ho impostato un CKSubscription * in modo da ricevere le modifiche a un tipo di record.Le notifiche di sottoscrizione al database pubblico vengono ricevute da tutti gli utenti con la stessa sottoscrizione?

Sto utilizzando il database pubblico.

Quando eseguo il test con lo stesso utente (stesso account iCloud), ricevo la notifica.

Se utilizzo un utente diverso (diverso account iCloud) non ricevo la notifica.

Gli abbonamenti sono progettati per funzionare solo tra dispositivi dello stesso utente?

Ecco la documentazione che descrive abbonamenti:

Utilizzare un oggetto CKSubscription per seguire i cambiamenti che si verificano sul server. Un abbonamento si comporta come una query persistente sul server che può tracciare la creazione, la cancellazione e la modifica dei record. Quando si verificano le modifiche , attivano la consegna delle notifiche push in modo che l'app possa rispondere in modo appropriato.

https://developer.apple.com/library/ios/documentation/CloudKit/Reference/CKSubscription_class/index.html#//apple_ref/occ/cl/CKSubscription

mi sarei aspettato di ricevere una notifica non importa quale utente modifica il record, e la sottoscrizione predicato dovrebbe comunque corrispondere.

UPDATE

* Ogni utente ha un abbonamento con lo stesso predicato, essenzialmente focalizzato su un singolo RecordType con un particolare valore della proprietà.

Il payload per questa sottoscrizione è solo per push shouldSendContentAvailable = YES.

La documentazione si legge:

Quando questa proprietà è YES, il server include il bandiera contenuti disponibili nel payload della notifica push. Questo flag fa sì che il sistema attivi o meno un'app che al momento non è in esecuzione. L'app è quindi viene fornito il tempo di esecuzione in background per scaricare tutti i dati relativi a la notifica push, ad esempio l'insieme di record modificati. Se l'app è già in esecuzione in primo piano, l'inclusione di questo flag non ha alcun effetto aggiuntivo e la notifica viene recapitata all'app delegato per l'elaborazione come di consueto.

autorizzazione di protezione del RecordType è:

enter image description here

ulteriore aggiornamento

controllato i ceppi del dispositivo non riceve la spinta quando dovrebbe e vide:

apsd[85]: Silent Push: Deny app not available 

Riavviato il dispositivo e ora funziona correttamente!

+1

Caro down-elettore, che cosa c'è di sbagliato con questa domanda? – Vamos

risposta

2

Questo comportamento è dovuto a un errore nel modo in cui la mia CKSubscription è stato configurato. Se vogliamo che tutti gli utenti ricevano le notifiche dall'abbonamento, non dovrebbe avere un set di zoneID (dovrebbe rimanere nullo). Stavo impostando l'ID zona sul valore di defaultRecordZone, questo limiterà le notifiche all'utente corrente solo come l'utente di defaultRecordZone è l'utente corrente.

UPDATE

finalmente risolto il problema. Non solo è stato un problema di zoneID, ma sembra che ci sia anche un bug. La mia notifica di iscrizioneInfo aveva semplicemente shouldSendContentAvailable impostato su YES. Ciò non causa l'attivazione della notifica di sottoscrizione per le modifiche apportate da chiunque diverso dall'utente corrente (u1d1-> u1d2, ma non u1d1> u2d2). Ho semplicemente aggiunto un alertBody e le notifiche iniziano a sparare.

Qualcun altro deve affrontare questo problema?

UPDATE 2

riavvio del dispositivo risolto il problema.

+0

Per il [Servizio di notifica push Apple] (https : //developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1) documentazione la causa del flag 'content-available' la tua richiesta di essere riattivata in background e non avviserà l'utente. Tuttavia, è necessario avere il valore 'remote-notification' nella matrice' UIBackgroundModes' dell'applicazione. Se ti manca, la tua applicazione non si sveglierà e apparirà come se non ricevessi alcuna spinta. – farktronix

+0

L'aggiunta di 'alertBody' ha fatto sì che la notifica giunga come una normale spinta e avvisa l'utente, motivo per cui ha visto la notifica. – farktronix

+0

Non cercavo l'aggiornamento degli utenti, volevo solo che l'app aggiornasse silenziosamente i dati, la modalità di sfondo è impostata a destra – Vamos

2

Ogni utente deve creare il proprio abbonamento. Un abbonamento è valido solo per l'utente che lo ha creato. All'avvio dell'app è necessario verificare se le sottoscrizioni sono disponibili per l'utente corrente (è possibile utilizzare la funzione database.fetchAllSubscriptionsWithCompletionHandler per quello)

Quindi se è presente una sottoscrizione per un recordType e un predicato, l'utente deve ricevere le notifiche di lì sono tutte le modifiche per i record all'interno di questo recorType e predicato.

Non è possibile garantire che ogni modifica venga eseguita. Se ci sono più notifiche, potrebbe accadere che non riceverai tutto. Questo è il motivo per cui, dopo aver ricevuto una notifica si dovrebbe anche eseguire una query per le notifiche di sottoscrizione in sospeso sul server (utilizzando CKFetchNotificationChangesOperation)

Se si crea un record sul dispositivo, allora non si dovrebbe ricevere una notifica per che su quel dispositivo. Quindi se hai una raccolta dati per un abbonamento nella tua app, dovresti anche aggiornarla dopo aver modificato i dati.

Se pensi che questo è complesso, allora si potrebbe provare EVCloudKitDao

+0

Grazie a edwin-vermeer, ho capito cosa hai delineato qui. Quando si dice "[se] ci sono modifiche per i record all'interno di questo [recordType] e predicato", ciò significa che indipendentemente da quale utente modifica un record nel database pubblico, tutti gli utenti che hanno impostato una sottoscrizione riceveranno la notifica di modifica ? Poiché questa è la parte che non sto riscontrando, ricevo le notifiche correttamente quando si tratta dello stesso utente su dispositivi diversi, ma non quando si tratta di un altro utente su un altro dispositivo (l'ultima parte non è così chiara fammi sapere se ha senso o no). – Vamos

+0

"Quindi se hai una raccolta di dati [per] nella tua app, dovresti anche aggiornarla dopo aver modificato i dati" - non è sicuro che cosa significhi ... – Vamos

+0

diciamo che stai interrogando la tua app per recordType A e crea anche un abbonamento per recordType A. Quindi se aggiungi un nuovo record dal tuo telefono, non riceverai una notifica. quindi il record appena creato mancherà dai risultati della query iniziale. Se hai ancora quei risultati in memoria, dovresti anche aggiornare quel risultato. –

3

E per aggiungere un'altra dimensione alle risposte sopra, le iscrizioni CKS vengono registrate "per account iCloud" non per dispositivo. Tutti i dispositivi registrati nello stesso account iCloud (*) riceveranno tutte le notifiche basate su qualsiasi abbonamento inserito da qualsiasi dispositivo in tale account iCloud. Quando quanto sopra si riferisce a "utente", si intende "qualsiasi dispositivo connesso all'account iCloud".

  • tranne che per il particolare dispositivo che ha modificato il file che conduce alla notifica