12

In my iOS application I use Core Data to store data and a fetch request to create an array of NSManagedObjects to display in a UITableView.

On the Watch OS I check if WCSession is supported and active a session, then send the iOS application a message from the watchOS extension.

When the iOS application receives the message from the watchOS it should send the array of Objects to the watchOS extension to display the data in the WKInterfaceTable, but I am unsure how to do this. Ultimately what I am trying to achieve is;

  • How to share the array of Objects with the watchOS extension?

  • If the user adds/edits/deletes objects in the array on the Watch, how can we update the data on the iPhone ?

  • Also, the iOS application is embedded within a UITabBarController so does it matter which view controller I communicate with?

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 Application : 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"])
   }
4

3 回答 3

7
  • 如何与 Watch OS Extension 共享对象数组? 由于您使用的是WatchConnectivity框架,因此请使用sendMessage方法从 iPhone 发送对象数组,并在您FavoritesInterfaceController 实现该func session(session: WCSession, didReceiveMessage 方法以获得响应,或者您可以在回复处理程序中获取数组

  • 如果用户在 Watch OS 的数组中添加/编辑/删除对象,我们如何更新 iPhone 上的数据?

    将 objectId 与您的sendMessage方法中的新更改一起从手表发送到手机,在手机接收时,数据库中的更改将保存并在您的replyHandler中发送更新的值,以便您的手表内容将相应更新。

  • iOS 应用程序也嵌入在 UITabBarController 中,所以我与哪个视图控制器通信是否重要?

    您想要与之通信的 viewController 或者负责进行更改的 viewController 应该是活动的。如果多个 ViewController 正在监听,WCSessionDelegates那么当您从 watch 发送任何消息时,所有实时控制器都会收到该消息。identifier您应该在字典中包含某种类型,sendMessage以便知道要执行的操作。就像如果您想要delete一个对象,那么在watch发送消息时identifier将包含 delete这样的内容,以便在接收时您可以检查identifier值并执行delete操作。

于 2015-12-22T06:52:03.537 回答
3

您可以使用sendMessage中的replyHandler来执行此操作。确保在 Watch 和 iOS App 上都实现了回复处理程序以获取此信息。

基本上,如果你做对了,你的回复处理程序可以确保你的 iOS 应用程序对手表应用程序的消息做出什么响应。

另外,谈到您的响应(发送对象数组)-您应该将其作为字典发送并在手表上获取。

于 2015-12-21T15:23:03.987 回答
3

首先,这是一个非常好的问题。对于初学者,我建议您观看 WWDC 2015 中的本次会议:第 713 次会议 - 介绍 Watch Connectivity。这可以在这里找到。

现在到你的实际问题。有一个很棒的教程和Github 存储库向您展示了如何使用 App Groups 在 Apple Watch 应用程序和容器应用程序之间传递 Core Data,因为这使您能够访问所有共享内容,例如 Core Data 甚至 NSUSerdefaults。

然后,您可以在以下链接中找到有关如何执行此操作的完整教程。

希望有帮助,朱利安。

于 2015-12-22T05:34:22.843 回答