从ios applicaton发送字典数据到apple watch

在我的应用程序中,我有一个名为“TicketDetailViewController”的页面,其中我有3个标签和一个imageView,其中数据显示在上一页。 现在我想要的是当我点击我的“sendtowatch”按钮时,我想将显示的数据,即3个标签和一个imageView发送到我的苹果手表,其中我还在其故事板中采用了3个标签和一个imageView。 问题是我使用FMDB数据库来存储和检索数据。 现在,从我的IOS应用程序点击我的按钮,显示的数据将保存在数据库中,同时我还需要检索它,以便手表可以接收我存储在数据库中的最新数据。 我试过这个解决方案,但没有运气。

这是我正在运行的应用程序页面下面的截图

我在IOS方面的源代码如下:

@IBAction func sendToWatch(sender: AnyObject) { let ticketDB = FMDatabase(path: databasePath as String) if ticketDB.open() { let insertSQL = "INSERT INTO TICKET (image, ticket_category, ticket_type, date, time) VALUES ('\(display_image.image!)', '\(ticket_category.text!)', '\(ticket_type_name.text!)', '\(ticket_date.text!)', '\(ticket_time.text!)')" let result = ticketDB.executeUpdate(insertSQL,withArgumentsInArray: nil) if !result { print("Error: \(ticketDB.lastErrorMessage())") } else { let alt = PMAlertController(title: "Success!", description: "Your data is saved to Database!", image: UIImage(named: ""), style: .Alert) alt.addAction(PMAlertAction(title: "OK!", style: .Default, action: { (ACTION) -> Void in let ticketInfo = NSMutableDictionary() let ticketDB = FMDatabase(path: self.databasePath as String) if ticketDB.open() { let querySQL = "SELECT * FROM TICKET" let result: FMResultSet? = ticketDB.executeQuery(querySQL, withArgumentsInArray: nil) if let result = result { self.ticketDataArray = NSMutableArray() while result.next() { ticketInfo["ticket_category"] = self.ticket_category.text ticketInfo["ticket_type"] = self.ticket_type_name.text ticketInfo["date"] = self.ticket_date.text ticketInfo["time"] = self.ticket_time.text ticketInfo["image"] = self.display_image.image print("Data: \(ticketInfo)") } let dict = ["Watchdat":ticketInfo] self.session.sendMessage(dict, replyHandler: { (replayDic: [String:AnyObject]) -> Void in print(replayDic["Watchdat"]) }, errorHandler: { (error:NSError) -> Void in print(error.description) }) }else { print("Error: \(ticketDB.lastErrorMessage())") } ticketDB.close() } })) self.presentViewController(alt, animated: true, completion: nil) print(databasePath) } } 

我在手表端的源代码如下

 class InterfaceController: WKInterfaceController, WCSessionDelegate { var session: WCSession! @IBOutlet var watch_displayImage: WKInterfaceImage! @IBOutlet var watch_ticket_category: WKInterfaceLabel! @IBOutlet var watch_ticketType: WKInterfaceLabel! @IBOutlet var watch_ticketTime: WKInterfaceLabel! @IBOutlet var watch_ticketDate: WKInterfaceLabel! override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) if WCSession.isSupported() { session = WCSession.defaultSession() session.delegate = self session.activateSession() } } override func willActivate() { // This method is called when watch view controller is about to be visible to user super.willActivate() } func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { print(message.values) var dict = Dictionary() watch_ticket_category.setText(dict["Watchdat"]! as? String) } 

}

在iOS方面:

您花时间构建一个故障单数组,但随后不对该数组执行任何操作。 您传递了单个票证的字典,而不是传递一系列票证字典。

 let ticketInfo = NSMutableDictionary() ... self.ticketDataArray = NSMutableArray() while result.next() { ticketInfo.setObject(result.stringForColumn("image"), forKey: "image") ticketInfo.setObject(result.stringForColumn("ticket_category"), forKey: "ticket_category") ticketInfo.setObject(result.stringForColumn("ticket_type"), forKey: "ticket_type") ticketInfo.setObject(result.stringForColumn("date"), forKey: "date") ticketInfo.setObject(result.stringForColumn("time"), forKey: "time") self.ticketDataArray.addObject(ticketInfo) } let dict = ["Watchdat":ticketInfo] 

您应该省略构造数组,或传递用于该键的正确值。

在watchOS方面:

 var dict = Dictionary() watch_ticket_category.setText(dict["Watchdat"]! as? String) 

您正在检查的字典是您刚创建的新的空字典。 但是,手表收到的手机数据在message参数中传递给didReceiveMessage 。 如果你检查本字典,你应该找到你期望的。

请注意,“Watchdat”键的值不能有条件地转换为String。 您还需要更正它,具体取决于您是否将该键的值表示为字典或数组。

如果您认为它是嵌套字典,那么现在您的代码就已编写,您必须设置每个标签,如下所示:

 watch_ticket_category.setText(message["Watchdat"]!["ticket_category"]) 

关于图像:

您的记录的图像列类型是一个字符串,但您希望手表显示WKInterfaceImage 。 如果您打算将图像传递给手表,则还需要在iOS端修复该代码。

有很多答案可以解释如何将图像传输到手表。 你应该记住的两件事是:

  • 图像的大小。 不要浪费时间和电池寿命来传输高分辨率的图像,最终会在较小的手表屏幕上显示。 传输图像之前缩放图像。

  • sendMessage支持的最大有效负载大小,特别是如果您打算传输票证(和图像)数组而不是单个票证。