2015-12-18 2 views
11

In meiner iOS-Anwendung verwende ich Core Data zum Speichern von Daten und eine Abrufanforderung zum Erstellen eines Arrays von s zur Anzeige in einem UITableView.So teilen Sie Daten mit Watch Connectivity beim Arbeiten mit Core Data

Auf dem Watch OS überprüfe ich, ob unterstützt wird und aktiviere eine Sitzung, dann sende ich der iOS-Anwendung eine Nachricht von der watchOS-Erweiterung. Wenn die iOS-Anwendung die Nachricht vom watchOS empfängt, sollte sie das Array Objects an die watchOS-Erweiterung senden, um die Daten in der WKInterfaceTable anzuzeigen. Letztendlich versuche ich zu erreichen;

  • Wie das Array von Objects mit der watchOS Erweiterung teilen?

  • Wenn der Benutzer Objekte im Array auf der Uhr hinzufügt/bearbeitet/löscht, wie können wir die Daten auf dem iPhone aktualisieren?

  • Auch die iOS-Anwendung ist in eine UITabBarController eingebettet, also spielt es eine Rolle, mit welchem ​​View-Controller ich kommuniziere?

beobachten OS FavouritesInterfaceController

var session : WCSession! 

override func willActivate() { 
    // This method is called when watch view controller is about to be visible to user 
    super.willActivate() 

    //Check if session is supported and Activate 
    if (WCSession.isSupported()) { 
     session = WCSession.defaultSession() 
     session.delegate = self 
     session.activateSession() 
    } 
} 

override func awakeWithContext(context: AnyObject?) { 
    super.awakeWithContext(context) 
    // Interface Objects 

    //Send Message 
    sendmessagetoiphone() 
} 

func sendMessageToIphone() { 
    if(WCSession.isSupported()){ 
     session.sendMessage(["b":"goodBye"], replyHandler: nil, errorHandler: nil) 
    } 
} 

IOS Anwendung: FavouritesViewController

var objects = [Objects]() 

func loadData() { 

    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
    let request = NSFetchRequest(entityName: "Objects") 
    request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)] 
    do { 
     try 
      self.objects = moc.executeFetchRequest(request) as! [Objects] 
     // success ... 
    } catch { 
     // failure 
     print("Fetch failed") 
    } 
} 

    func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 
    //handle received message 
    let value = message["Value"] as? String 
    dispatch_async(dispatch_get_main_queue()) { 
     self.messageLabel.text = value 
    } 
    //send a reply 
    replyHandler(["Value":"Hello Watch"]) 
    } 

Antwort

5
  • Wie das Array von Objekten mit der Uhr OS Erweiterung teilen? Da Sie WatchConnectivity Framework verwenden, um das Array von Objekten aus iPhone mit sendMessage Methode und in Ihrem FavoritesInterfaceController implementieren die func session(session: WCSession, didReceiveMessage Methode zu senden, um die Antwort zu erhalten, oder Sie können das Array in replyhandler zu bekommen.

  • Wenn der Benutzer Objekte im Array im Watch OS hinzufügt/löscht/löscht Wie können wir die Daten auf dem iPhone aktualisieren?

    Senden Sie die objectId entlang der mit neuen Änderungen in Ihrer sendMessage Methode Uhr Telefon, am Telefon auf Empfang die Änderungen in Ihrer Datenbank speichern Sie es gemacht und den aktualisierten Wert in Ihrem replyHandler senden so dass Ihre Uhr Inhalte entsprechend aktualisiert werden.

  • Auch die iOS-Anwendung ist in einem UITabBarController eingebettet, also spielt es eine Rolle, mit welchem ​​View-Controller ich kommuniziere?

    Sie möchten ViewController, mit dem Sie kommunizieren ODER der, der für Änderungen verantwortlich ist, sollte am Leben sein. Wenn mehrere ViewControllers WCSessionDelegates hören, empfangen alle Live-Controller diese Nachricht, wenn Sie eine Nachricht von der Uhr senden. Sie sollten eine Art von identifier in Ihrem sendMessage Wörterbuch enthalten, damit Sie wissen, welche Operation ausgeführt werden soll. Wie wenn Sie delete ein Objekt dann wenn watch sendet eine Nachricht die identifier wird delete enthalten, so dass Sie beim Empfang können Sie die identifier Wert überprüfen und führen Sie die delete Operation.

+0

Es scheint, ich muss sowohl die iOS-Anwendung und Watch App offen für diese Methode zu arbeiten haben. Das verhindert den schnellen Zugriff auf Daten auf Ihrer Uhr, ohne dass Sie Ihr Telefon herausziehen müssen. Hab ich recht ? – RileyDev

+0

Wenn Sie die Kommentare zu dieser Methode in WCSession.h sehen, heißt es: ** Wenn die Pendant-App nicht ausgeführt wird, wird die Pendant-App beim Empfang der Nachricht gestartet (nur iOS-Pendant-App). Das Nachrichtenwörterbuch kann nur die Eigenschaftslistentypen akzeptieren. ** Selbst wenn Ihre Gegen-iOS-App geschlossen ist und Sie eine Nachricht von der Uhr an das iPhone senden, wird die App gestartet und die Nachricht empfangen, aber das Gegenteil ist nicht möglich. – Muneeba

3

Sie können das replyHandler im nachrichts um dies zu tun. Stellen Sie sicher, dass Sie den Antworthandler sowohl in der Watch- als auch in der iOS-App implementieren, um dies zu erhalten.

Wenn Sie es richtig verstanden haben, kann Ihr Antwort-Handler sicherstellen, was Ihre iOS App als Reaktion auf die Nachricht einer Watch-App tut.

Auch von Ihrer Antwort sprechen (von einem Array von Objekten senden) - Sie sollten es als ein Wörterbuch senden und es auf der Uhr abrufen.

2

Erstens, das ist eine wirklich gute Frage. Für den Anfang empfehle ich Ihnen, diese Sitzung von der WWDC 2015 zu sehen: Sitzung 713 - Einführung von Watch Connectivity. Dies kann here.

Nun zu Ihrer eigentlichen Frage gefunden werden. Es gibt ein tolles Tutorial und Github repo, die Ihnen zeigen, wie Sie Core-Daten zwischen Ihrer Apple Watch App und der Container-App mithilfe von App-Gruppen kommunizieren können, da Sie damit auf alle freigegebenen Inhalte wie Core Data und sogar NSUSerdefaults zugreifen können.

Sie können dann die vollständige Anleitung dazu finden Sie unter der folgenden.

Hoffe, dass hilft, Julian.

+0

Ich bin ziemlich sicher, dass GitHub Beispiel nicht gut mit Xcode 7 funktioniert, oder besser gesagt, WatchSDK 2. – Sulthan

+0

Hm. Ich werde es später überprüfen. Es sollte gut hart funktionieren. –

+1

Es funktioniert auf Uhr os 1 ... –