2015-11-26 14 views
10

Sto scrivendo un'app Swift con CloudKit. Quando un record viene modificato in CloudKit da un dispositivo, voglio che i record corrispondenti vengano aggiornati nella memoria locale degli altri dispositivi senza visualizzare una notifica push.CloudKit CKSubscription senza notifiche?

Devo chiamare registerUserNotificationSettings in didFinishLaunchingWithOptions (nel senso che l'utente deve accettare le notifiche per la mia app) anche se non ho intenzione di visualizzare alcuna notifica push?

risposta

3

Sì, è necessario chiamare registerUserNotificationSettings anche tutto ciò che serve è la notifica remota in background. Quindi l'utente chiederà il permesso per le notifiche. Non ha senso in quanto gli utenti non vedranno le notifiche ma è così che è.

Io lo uso per configurarlo:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let settings = UIUserNotificationSettings(forTypes: .None , categories: nil) application.registerUserNotificationSettings(settings) application.registerForRemoteNotifications() }

Assicurarsi che quando si chiama CloudKit saveSubscription che fornisci shouldSendContentAvailable = true. Il seguente codice è per la sottoscrizione di una zona personalizzato:

let subscription = CKSubscription(zoneID:zoneID, options: CKSubscriptionOptions(rawValue: 0)) 

let notificationInfo = CKNotificationInfo() 
notificationInfo.shouldSendContentAvailable = true 

subscription.notificationInfo = notificationInfo 

CKContainer.defaultContainer().privateCloudDatabase.saveSubscription(subscription) { subscription, error in 
} 

È inoltre necessario abilitare funzionalità Modalità Sfondo sotto Xcode per il progetto, e selezionare la casella Notifiche remoti.

L'utente può accedere all'app Impostazioni per disabilitare le notifiche per l'app. Tuttavia, riceverai comunque un trigger di notifica remota dal server CloudKit.

implementare le seguenti funzioni nel AppDelegate per ricevere notifiche remote:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {} 

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {} 

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

non è vero, vedere la mia risposta. – malhal

+0

Questo è sbagliato. la risposta malhal è quella corretta. –

10

In questo caso non è necessario chiamare registerUserNotificationSettings.

È necessario aggiungere l'impostazione Info.plist "Modalità sfondo richiesta" (UIBackgroundModes), "L'app scarica contenuto in risposta alle notifiche push" (remote-notification). E chiama anche registerForRemoteNotifications. Infine, imposta notificationInfo.shouldSendContentAvailable = YES; sul tuo abbonamento.

Da quando l'app è in esecuzione per rispondere a tutte le notifiche è necessario fare attenzione a gestire il caso in cui una notifica viene saltata, è possibile utilizzare la modalità aereo per testare, viene consegnato solo l'ultimo.

Nota: una volta creato l'abbonamento da qualsiasi dispositivo, lo application:didReceiveRemoteNotification:fetchCompletionHandler: verrà richiamato su tutti i dispositivi che utilizzano lo stesso account iCloud e hanno installato l'app.

+1

Questa è la risposta corretta. Non richiede all'utente di consentire notifiche push, ma ottiene comunque le notifiche che devono essere gestite da AppDelegate ma la richiamata è l'applicazione '- (void): (applicazione UIA *) haReceiveRemoteNotification: (NSDictionary *) userInfo fetchCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler'. La richiamata di cui sopra nella risposta è sbagliata, ma potrebbe essere perché questa è una risposta molto vecchia. –

+0

ha aggiunto la parte mancante grazie – malhal

+1

Se non si desidera ricevere una notifica quando l'app è in background e non mostrare l'avviso, non è necessario aggiungere "UIBackgroundModes" e la sottochiave associata "remote-notification". In questo caso, l'app riceve la notifica nel solito gestore di notifiche remote in "AppDelegate" ma ancora senza la richiesta di accettazione da parte dell'utente per l'abilitazione delle notifiche push.Quindi ci sono due modi in base alle necessità. Quindi, in sostanza, non chiamare 'registerUserNotificationSettings' funziona per il caso speciale delle notifiche di CloudKit. –