在我的iOS应用程序中,我使用Core Data存储数据和获取请求,以创建NSManagedObject
的数组以在UITableView
中显示。
在Watch OS上,我检查是否支持WCSession
并激活会话,然后向iOS应用程序发送watchOS扩展中的消息。
当iOS应用程序收到来自watchOS的消息时,它应该将Objects
数组发送到watchOS扩展,以显示WKInterfaceTable
中的数据,但我不确定如何执行此操作。最终我想要实现的是;
如何与watchOS扩展程序共享Objects
数组?
如果用户在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"])
}
答案 0 :(得分:5)
如何与Watch OS Extension共享对象数组?
由于您使用的是WatchConnectivity
框架,请使用sendMessage
方法从iPhone发送对象数组,并在FavoritesInterfaceController
中实施func session(session: WCSession, didReceiveMessage
方法以获取响应,或者您可以获取 replyhandler 中的数组。
如果用户在Watch OS上添加/编辑/删除阵列中的对象 我们如何更新iPhone上的数据?
使用sendMessage
方法将watchId与手表中的新更改一起发送,在手机上接收后,数据库中的更改将保存并在 replyHandler 这样您的观看内容将相应更新。
iOS应用程序也嵌入在UITabBarController中 与我沟通的视图控制器有什么关系?
您希望与之通信的viewController或负责进行更改的那个应该处于活动状态。如果多个ViewControllers正在监听WCSessionDelegates
,那么当您从监视发送任何消息时,所有实时控制器都将收到该消息。您应该在identifier
字典中包含某种sendMessage
,以便了解要执行的操作。如果您想要delete
一个对象,那么当watch
发送消息时,identifier
将包含delete
,以便在收到时您可以检查identifier
值和执行delete
操作。
答案 1 :(得分:3)
您可以使用 sendMessage 中的 replyHandler 来执行此操作。确保在Watch和iOS App上实现回复处理程序以实现此目的。
基本上,如果你做得对,你的回复处理程序可以确保你的iOS应用程序响应观看应用程序的消息。
另外,谈到您的回复(发送一组对象) - 您应该将其作为字典发送并在手表上获取。
答案 2 :(得分:2)
首先,这是一个非常好的问题。对于初学者,我建议您从WWDC 2015:Session 713 - Watch Connectivity简介中观看此会话。可以找到here.
现在回答你的实际问题。有一个很棒的教程和Github repo向您展示如何使用App Groups在Apple Watch应用程序和容器应用程序之间进行核心数据通信,因为这使您可以访问所有共享内容,例如Core Data甚至NSUSerdefaults。
然后,您可以在以下link下找到有关如何执行此操作的完整教程。
希望有帮助,朱利安。