2015-12-18 18 views
11

W mojej aplikacji iOS używam Core Data do przechowywania danych i żądania pobierania, aby utworzyć tablicę z NSManagedObject s do wyświetlania w UITableView.Udostępnianie danych przy użyciu funkcji Watch Connectivity podczas pracy z Core Data

W systemie Watch OS sprawdzam, czy WCSession jest obsługiwany i aktywuje sesję, a następnie wysłać aplikacji iOS wiadomość z rozszerzenia watchOS.

Gdy aplikacja iOS otrzymuje wiadomość z watchOS, powinna wysłać tablicę Objects do rozszerzenia watchOS, aby wyświetlić dane w WKInterfaceTable, ale nie jestem pewien, jak to zrobić. Ostatecznie to, co próbuję osiągnąć, to;

  • Jak udostępnić tablicę Objects z rozszerzeniem watchOS?

  • Jeśli użytkownik dodaje/edytuje/usuwa obiekty w tablicy w zegarku, w jaki sposób możemy zaktualizować dane w telefonie iPhone?

  • Co więcej, aplikacja iOS jest osadzona wewnątrz UITabBarController, więc czy ma znaczenie, z którym kontrolerem widoku komunikuję się?

Watch 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 Zastosowanie: 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"]) 
    } 

Odpowiedz

5
  • Jak udostępnić tablicę obiektów za pomocą rozszerzenia Watch OS? Ponieważ używasz WatchConnectivity ramy wysłać tablicę obiektów z iPhone przy użyciu sendMessage sposób iw swoim FavoritesInterfaceController wdrożyć metodę func session(session: WCSession, didReceiveMessage w celu uzyskania odpowiedzi lub można uzyskać tablicę w replyHandler do.

  • Jeśli użytkownik dodaje/edytuje/usuwa obiekty z tablicy w systemie Watch OS w jaki sposób możemy zaktualizować dane w telefonie iPhone?

    Wyślij objectID wzdłuż z nowymi zmianami w sposobie sendMessage od zegarka na telefon, na otrzymywanie na telefon wykonane zmiany w bazie danych zapisz go i przesłać zaktualizowaną wartość w swojej replyHandler więc, że zawartość zegarek być odpowiednio zaktualizowany.

  • Również aplikacja iOS jest osadzona wewnątrz kontrolera UITabBarController, więc ma znaczenie, z którym kontrolerem widoku komunikuję się?

    Żądany kontroler widoku, z którym się komunikujesz lub osoba odpowiedzialna za wprowadzanie zmian, powinna być przy życiu. Jeśli wiele kontrolerów ViewControllers nasłuchuje na WCSessionDelegates, wtedy po wysłaniu dowolnej wiadomości z zegarka wszystkie kontrolery na żywo otrzymają tę wiadomość. Powinieneś dołączyć pewien rodzaj identifier do słownika sendMessage, abyś wiedział, która operacja ma zostać wykonana. Tak jak w przypadku, gdy chcesz delete obiektu, wtedy watch wysyła komunikat identifier będzie zawierał delete, więc po otrzymaniu możesz sprawdzić wartość identifier i wykonać operację delete.

+0

Wygląda na to, że muszę uruchomić aplikację iOS i aplikację Watch, aby ta metoda działała. Które pokonuje punkt szybkiego dostępu do danych na zegarku bez wyciągania telefonu. Mam rację ? – RileyDev

+0

Jeśli zobaczysz komentarze na temat tej metody w WCSession.h, to jest napisane ** Jeśli aplikacja kontrpartner nie jest uruchomiona, odpowiednia aplikacja zostanie uruchomiona po otrzymaniu wiadomości (tylko aplikacja z odpowiednikiem iOS). Słownik wiadomości może akceptować tylko typy list właściwości. ** Nawet jeśli twoja aplikacja Konto iOS jest zamknięta i wysyłasz wiadomość z zegarka na iPhone'a, uruchomi ona aplikację i otrzyma wiadomość, ale odwrócenie nie jest możliwe. – Muneeba

3

Można użyć replyHandlerw sendMessage aby to zrobić. Pamiętaj, aby zaimplementować obsługę odpowiedzi w aplikacjach Watch i iOS, aby to uzyskać.

Zasadniczo, jeśli zajmiesz się tym dobrze, Twój program obsługi odpowiedzi może zapewnić, co aplikacja iOS robi w odpowiedzi na wiadomość z aplikacji zegarka.

Także, mówiąc o twojej odpowiedzi (wysłania tablicy obiektów) - powinieneś wysłać ją jako słownik i pobrać na zegarek.

2

Po pierwsze, jest to naprawdę dobre pytanie. Na początek polecam obejrzenie tej sesji z WWDC 2015: Session 713 - Introducing Watch Connectivity. To można znaleźć here.

Teraz na Twoje aktualne pytanie. Jest świetny samouczek i Github repo, które pokazują, jak przekazywać dane rdzenia między aplikacją Apple Watch a aplikacją kontenerową za pomocą grup aplikacji, ponieważ umożliwia to dostęp do wszystkich udostępnianych treści, takich jak podstawowe dane, a nawet NSUSerdefaults.

Następnie można znaleźć kompletny samouczek, jak to zrobić pod następującym link.

Nadzieję, że pomaga, Julian.

+0

Jestem pewien, że przykład Github nie działa dobrze z Xcode 7, lub lepiej powiedział, WatchSDK 2. – Sulthan

+0

Hm. Sprawdzę to później. Powinien działać dobrze ... –

+1

Pracuje na zegarze 1 ... –