2016-03-27 6 views
2

Meine App verwendet lokale Benachrichtigungen basierend auf dem Timing von Ereignissen, die mit Core Data protokolliert werden.iCloud & Core Data: Ist es möglich, NSPersistentStoreDidImportUbiquitousContentChangesNotification zu erhalten, während die App im Hintergrund läuft?

Jedes Mal, wenn sich mein Core Data Store auf dem Gerät ändert, rufe ich eine Funktion namens updateLocalNotifications() auf, die vorhandene lokale Benachrichtigungen löscht und neue basierend auf den aktualisierten Daten in Core Data einrichtet.

Meine NSPersistentStoreCoordinator für Core Data ist mit NSPersistentStoreUbiquitousContentNameKey eingerichtet, so dass es über iCloud automatisch synchronisiert wird.

Im Idealfall möchte ich, wenn der Benutzer meine App auf zwei oder mehr Geräten ausführt, updateLocalNotifications() auf allen Geräten ausführen, wenn sich die Core Data on iCloud ändert.

Ich habe diesen einfachen Code in AppDelegate zu hören und zu Änderungen an Daten auf iCloud reagieren:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    // update local notifications whenever new iCloud data is received 
    notificationCenter.addObserver(self, selector: #selector(updateLocalNotifications), name: NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: nil) 

... 

    return true 
} 

Wenn die App auf beiden Geräten geöffnet und im Vordergrund steht und ich lüge ein Ereignis auf einem Gerät Ich bekomme die NSPersistentStoreDidImportUbiquitousContentChangesNotification auf dem anderen Gerät innerhalb von etwa 20 Sekunden.

Das Problem ist, ich glaube nie, NSPersistentStoreDidImportUbiquitousContentChangesNotification zu erhalten, wenn die App im Hintergrund auf dem zweiten Gerät ausgeführt wird. Ich habe viel gegraben, aber ich finde nicht, ob die iCloud-Synchronisierung eigentlich im Hintergrund stattfinden soll oder nur, wenn sich meine App im Vordergrund befindet. Ich teste das immer noch, um zu sehen, ob es nur ein längeres Aktualisierungsintervall ist, wenn die App im Hintergrund ist.


Mögliche Lösung 1 (nicht machbar scheint basierend auf Tests so weit, aber das ist, was ich tun will)

An diesem Punkt, ich suche nach einer Lösung Holen Sie das zweite Gerät, um iCloud für Änderungen zu überprüfen, während es im Hintergrund ist und so eine NSPersistentStoreDidImportUbiquitousContentChangesNotification ausgelöst wird, wenn Änderungen und Auslösen dieser Benachrichtigung, auch wenn es weniger häufig als wenn die App im Vordergrund ist. Es gibt definitiv Nachteile für diesen Ansatz, wie es nicht aufgerufen wird, wenn die Person die App nach dem Start manuell beendet.

Mögliche Lösung 2 (scheint möglich, aber kompliziert)

Eine andere mögliche Lösung Ich erwäge wäre, einen Server einzurichten und zu verwenden stille Push-Benachrichtigungen mit content-available. Wenn jemand ein Ereignis auf einem Gerät protokolliert, pingt er den Server an und fordert ihn auf, einen Push an die anderen Geräte des Benutzers zu senden. Wenn ich auf diese Push-Benachrichtigung antworte, kann ich updateLocalNotifications() anrufen. Dies hat einige Nachteile. Eine davon ist, dass der Push content-available nicht funktioniert, wenn die App nicht gestartet wurde, nachdem das Gerät gestartet wurde oder manuell beendet wurde (ähnlich wie bei Lösung # 1). Eine zweite ist, dass es viel mehr Aufwand für das Einrichten eines Servers und das Pingen eines Servers jedes Mal erfordert, wenn sich die Ereignisse auf einem Gerät ändern, obwohl diese Information bereits über iCloud an einen Server gesendet wird.

Ich habe ein paar andere ähnliche Fragen (wie diese: How can I act on Core Data iCloud sync notification when the app is in the background?) gefunden, aber sie stellen keine möglichen Lösungen vor, also dachte ich, es wäre wert, meine Situation und mögliche Lösungen zu posten, falls es andere Leute gibt versuchen, ein ähnliches Problem zu lösen.

Antwort

1

Ich würde eine UX-Design-Lösung für dieses Problem bevorzugen.

Es ist fraglich, dass der Benutzer möchte, dass Ihre Erinnerungen auf allen ihren Geräten erscheinen. Sie sollten eine Einstellung angeben, in der der Benutzer sie ausschalten kann, oder besser, an. Machen Sie dem Nutzer klar, dass die Erinnerungen gerätespezifisch sind und dass sie nur aktualisiert werden, wenn die App aktiv ist, aber basierend auf den Eingaben von anderen Geräten.

Für die meisten Benutzer wird dies erwartet und akzeptables Verhalten.

+0

Interessante Lösung! Danke, dass du es geteilt hast. Ich hätte nie gedacht, dass Benachrichtigungen nur auf dem zuletzt verwendeten Gerät angezeigt werden (wo das Ereignis protokolliert wird), aber wie du sagst, könnte dies das erwartete Verhalten sein, oder ich könnte Benutzer darüber informieren und ihnen die Option zum Aktivieren geben, wenn ich mit einer Benachrichtigungssynchronisierungslösung in der Zukunft. – gohnjanotis

Verwandte Themen