问题 使用Core Data时如何使用Watch Connectivity共享数据


在我的iOS应用程序中,我使用Core Data来存储数据和一个获取请求来创建一个数组 NSManagedObjects以显示在 UITableView

在Watch OS上,我检查是否 WCSession 支持并激活会话,然后从iOS应用程序发送来自watchOS扩展的消息。

当iOS应用程序从watchOS收到消息时,它应该发送数组 Objects 到watchOS扩展名来显示数据 WKInterfaceTable,但我不确定如何做到这一点。最终我想要实现的是;

  • 如何共享数组 Objects 使用watchOS扩展?

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

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

观看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应用程序: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"])
   }

6967
2017-12-18 22:51


起源



答案:


  • 如何与Watch OS扩展共享对象数组? 因为你正在使用 WatchConnectivity 框架,使用从iPhone发送对象数组 sendMessage 方法和你的方法 FavoritesInterfaceController  实施 func session(session: WCSession, didReceiveMessage  方法以获得响应,或者您可以获取数组 replyhandler 至。

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

    随着你的新变化发送objectId sendMessage 从手表到手机的方法,在手机上接收后,数据库中的更改保存并发送更新的值 replyHandler 这样您的观看内容就会相应更新。

  • 此外,iOS应用程序嵌入在UITabBarController中 与我通信的视图控制器有关系吗?

    您希望与之通信的viewController或负责进行更改的那个应该处于活动状态。如果多个ViewControllers正在侦听 WCSessionDelegates 然后,当您从手表发送任何消息时,所有实时控制器都将收到该消息。你应该包括某种 identifier 在你的 sendMessage 字典,以便您可以知道要执行的操作。就像你想要的那样 delete 一个对象,然后 watch 发送消息 identifier 将包含 delete 所以在收到你可以检查 identifier 价值并执行 delete 操作。


5
2017-12-22 06:52



看来我必须打开iOS应用程序和Watch应用程序才能使用此方法。这样就无法在不拔出手机的情况下快速访问手表上的数据。我对么 ? - RileyDev
如果你在WCSession.h中看到关于这个方法的评论,它说 如果对方应用程序未运行,则会在收到消息时启动对应应用程序(仅限iOS对应应用程序)。消息字典只能接受属性列表类型。 因此,即使您的计数器iOS应用程序已关闭,并且您从手表向iPhone发送消息,它也会启动应用程序并收到消息,但反过来是不可能的。 - Muneeba


答案:


  • 如何与Watch OS扩展共享对象数组? 因为你正在使用 WatchConnectivity 框架,使用从iPhone发送对象数组 sendMessage 方法和你的方法 FavoritesInterfaceController  实施 func session(session: WCSession, didReceiveMessage  方法以获得响应,或者您可以获取数组 replyhandler 至。

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

    随着你的新变化发送objectId sendMessage 从手表到手机的方法,在手机上接收后,数据库中的更改保存并发送更新的值 replyHandler 这样您的观看内容就会相应更新。

  • 此外,iOS应用程序嵌入在UITabBarController中 与我通信的视图控制器有关系吗?

    您希望与之通信的viewController或负责进行更改的那个应该处于活动状态。如果多个ViewControllers正在侦听 WCSessionDelegates 然后,当您从手表发送任何消息时,所有实时控制器都将收到该消息。你应该包括某种 identifier 在你的 sendMessage 字典,以便您可以知道要执行的操作。就像你想要的那样 delete 一个对象,然后 watch 发送消息 identifier 将包含 delete 所以在收到你可以检查 identifier 价值并执行 delete 操作。


5
2017-12-22 06:52



看来我必须打开iOS应用程序和Watch应用程序才能使用此方法。这样就无法在不拔出手机的情况下快速访问手表上的数据。我对么 ? - RileyDev
如果你在WCSession.h中看到关于这个方法的评论,它说 如果对方应用程序未运行,则会在收到消息时启动对应应用程序(仅限iOS对应应用程序)。消息字典只能接受属性列表类型。 因此,即使您的计数器iOS应用程序已关闭,并且您从手表向iPhone发送消息,它也会启动应用程序并收到消息,但反过来是不可能的。 - Muneeba


你可以使用 replyHandler 在里面 发信息 去做这个。确保在Watch和iOS App上实现回复处理程序以实现此目的。

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

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


3
2017-12-21 15:23





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

现在问你的实际问题。有一个很棒的教程和 Github回购 这将向您展示如何使用App Groups在Apple Watch应用程序和容器应用程序之间进行核心数据通信,因为这使您可以访问所有共享内容,例如Core Data甚至NSUSerdefaults。

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

希望有所帮助,朱利安。


2
2017-12-22 05:34



我很确定github示例与Xcode 7不兼容,或者更好地说,WatchSDK 2。 - Sulthan
嗯。我稍后会看看。它应该工作得很好.. - Julian E.
它正在研究OS 1 ... - Julian E.