CoreData App & Watch

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CoreData App & Watch

    Hi,

    ich bin noch ganz neu in der IOS Entwicklung und versuche mich gerade an einer kleinen DemoApp für das iPhone + die Apple Watch 3.

    Aller Anfang ist schwer, aber vieles habe ich mittlerweile verstanden und hinbekommen. Die App hat optisch und funktional Form angenommen. Daten werden in einem TableView aufgelistet, ursprünglich über ein Array, jetzt über eine CoreData-Datenbank und man kann die Daten löschen sowie in einem zweiten (Detail)-ViewController aufrufen um weitere "Unter"-Daten dazu ansehen zu können. Auf der Watch gibt es auch schon eine hübsche Optik + gleicher Aufbau der Elemente wie in der iPhone-App allerdings und jetzt kommts aktuell noch gefüttert aus einem Array.

    Ich stehe jetzt vor einem Rätsel und bitte euch um Rat. A wie macht man es am besten und B wie macht man es überhaupt?

    Es geht um den Zugriff auf die gleichen CoreData-Daten von iPhone und Watch. Selbstverständlich auch um das Updaten, Löschen und Hinzufügen. Ich bin eigentlich ein Fan von Google, da man dort immer alles zu allen Fragen / Themen findet. Gepaart mit YouTube & Stackoverflow läufts dann, ABER in diesem Falls, oder eher bei dem Thema Apple WatchOS 5 (4, 3) CoreData finde ich einfach mal nichts brauchbares.

    Ich habe jetzt schon die Begriffe "WatchConnectivity framework", "App Groups", "WCSession" und "WKExtension" gefunden. Ich vermute alles wird auf eine Art und Weise kombiniert und benötigt, aber ich verstehe es einfach nicht. In einem Tutorial, welches ich auch umgesetzt hatte, ging es darum eine Message / einen String aus der iPhone-App per Button an die Watch zu senden. Das hat auch geklappt, aber ich verstehe den Sinn dahinter nicht, da ich ja nicht beide Geräte gleichzeitig geöffnet haben möchte.

    Vielmehr geht es darum:

    1. Auf dem iPhone Daten anlegen / speichern z.B. eine Einkaufsliste "Einkauf 1"
    2. In diese Liste gehen und dort Einträge / Produkte hinzufügen
    3. Auf der Watch die angelegte Liste ansehen und Produkte nach Kauf abhaken + ein Datum speichern
    4. Auf dem iPhone soll dann natürlich das per Watch abgehakte Produkt als abgehakt markiert sein (also die CoreData-Daten geupdated worden sein)

    Dann hatte ich gelesen, dass wenn ich CoreData-Daten auf der Watch vom iPhone anzeigen lassen möchte, dass dann immer die App auf dem iPhone ebenfalls gestartet wird? Ist das wirklich so?

    Frage kurz und knapp: "Wie kann ich von iPhone und Watch per Swift auf die gleiche CoreData-Datenbank zugreifen und die Daten anzeige, bearbeiten, löschen oder hinzufügen, sodass auf beiden Geräten die identischen Daten zu sehen sind?"

    Ich danke euch wirklich sehr für eure Unterstützung!

    LG

    PS.: an das Speicher der Daten auf und das holen von einem Server hatte ich schon gedacht, aber das ist für mich noch etwas zu komplex. Außerdem, wenn kein Internet vorhanden ist, könnte ich die App weder auf iPhone noch auf der Watch nutzen? Richtig? Oder sollte ich es doch so machen? Du merkst ich bin hier noch am Anfang und mega verunsichert!
  • Mac & i Test Abo
  • 5 Stunden später (Tag 3) und ich suche tatsächlich immer noch nach einer Lösung. Das gibt es ja gar nicht.


    So weit ich das jetzt zu meinem Ursprungspost beurteilen kann, sind so ziemlich alle Stackoverflow Fragen zu dem Thema veraltet (WatchOS 1) oder aber mit dem Hinweis, das es seit WatchOS2 nur noch per Watch Connectivity funktioniert.

    Nach einigen holprigen Anläufen konnte ich eine Verbindung zwischen iPhone und Watch herstellen und die Watch dazu bewegen, dass Sie beim Empfang einmal vibriert. DER WAHNSINN! -.-*

    Aber der Aufbau ist der totale Blödsinn:

    1. Watch + Watch App muss aktiv sein
    2. iPhone App starten, Message wird gesendet
    3. Watch empfängt Message und vibriert


    Hier der bisherige Aufbau zum Thema Watch Connectivity - falls das vielleicht Jemandem zukünftig hilft:

    Quellcode

    1. // ViewController.swift
    2. import UIKit
    3. import CoreData
    4. import WatchConnectivity
    5. class ViewController: UIViewController, WCSessionDelegate {
    6. var session : WCSession!
    7. var lastMessage: CFAbsoluteTime = 0
    8. func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
    9. func sessionDidBecomeInactive(_ session: WCSession) {}
    10. func sessionDidDeactivate(_ session: WCSession) {}
    11. func sendWatchMessage() {
    12. let currentTime = CFAbsoluteTimeGetCurrent()
    13. if lastMessage + 0.5 > currentTime {
    14. return
    15. }
    16. if (WCSession.default.isReachable) {
    17. let message = ["Message": "Hello"]
    18. WCSession.default.sendMessage(message, replyHandler: nil)
    19. }
    20. lastMessage = CFAbsoluteTimeGetCurrent()
    21. }
    22. override func viewDidLoad() {
    23. super.viewDidLoad()
    24. if (WCSession.isSupported()) {
    25. let session = WCSession.default
    26. session.delegate = self
    27. session.activate()
    28. }
    29. }
    30. override func viewWillAppear(_ animated: Bool) {
    31. super.viewWillAppear(animated)
    32. self.sendWatchMessage()
    33. }
    34. }
    Alles anzeigen



    Quellcode

    1. // InterfaceController.swift
    2. import WatchKit
    3. import CoreData
    4. import WatchConnectivity
    5. class InterfaceController: WKInterfaceController, WCSessionDelegate {
    6. var session : WCSession!
    7. func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
    8. }
    9. func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
    10. WKInterfaceDevice().play(.click)
    11. }
    12. override func willActivate() {
    13. super.willActivate()
    14. if WCSession.isSupported() {
    15. let session = WCSession.default
    16. session.delegate = self
    17. session.activate()
    18. }
    19. }
    20. ...
    21. }
    Alles anzeigen

    Wenn das tatsächlich die einzige "normale" Möglichkeit ist, also das auf beiden Geräten die jeweilige App geöffnet und aktiv sein muss, abgesehen von kostenpflichtigen Online-Services wie Parse, Firebase, CloudKit oder einem eigenen Server mit einer MySQL Datenbank, dann kann man Apple dafür doch einfach nur erschießen?! Da ich von Apple bis dato eigentlich eine Menge halte kann ich mir nicht vorstellen, dass es tatsächlich nicht anders funktioniert?

    Freunde bitte, helft mir bitte auf die Sprünge ich weiß das hier viele Profis unter euch sind, wo liegt mein Gedankenfehler oder gehts einfach nur nicht anders als über eine Cloudlösung?

    Ich danke euch !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von CodeNerd ()

  • Oh man 4 weitere Stunden tüfteln und ich krieg es nicht gebacken.

    Was ich immerhin jetzt verstanden bzw. herausgefunden habe ist, dass ich von der Watch per Message das iPhone im Hintergrund anfragen kann. Super Sache und das ich wohl ein Dictionary senden kann. Ideal!

    Aber ich bekomme die Verbindung nicht hergestellt. Das kann doch alles nicht war sein :(

    Wünsche euch einen guten Morgen! Ich muss jetzt mal ein paar Stündchen die Augen zu machen. Was eine Herausforderung!

    Ich hoffe einer von euch kann mir mal auf die Sprünge helfen bevor der Mac an der Wand landet :S
  • Michael schrieb:

    Also, ich habe keine Apple Watch und daher auch keinerlei Erfahrung, wie man dafür entwickelt. Daher kann ich dir leider nicht helfen.
    Hallo Michael, lieben Dank für deine Antwort! Ich habe es tatsächlich vor 2 Minuten geschafft :thumbsup:

    Die Watch schickt eine Anfrage an das iPhone und das iPhone sendet Teile des Inhalts der CoreData Datenbank als Dictionary an die Watch, die diese Daten dann verarbeitet und anzeigt.

    Da es online nur unglaublich viele falsche oder veraltete Infos gibt - nichts zu WatchOS 5 und IOS 12 - werde ich nachher den Code hier noch kurz posten, sobald ich alles fertig habe, für den Fall, dass Jemand vor dem gleichen Problem steht ^^