【问题标题】:Send dictionary data to apple watch from ios applicaton从 ios 应用程序向 Apple Watch 发送字典数据
【发布时间】:2016-08-22 05:47:39
【问题描述】:

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

下面是我正在运行的应用程序页面的屏幕截图 screenshot for my running app

我的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<String,AnyObject>()
    watch_ticket_category.setText(dict["Watchdat"]! as? String)
}

}

【问题讨论】:

  • 当我点击发送观看时,控制台中没有任何内容,只有数据被保存,没有其他内容
  • 我的代码有问题吗?我没听懂
  • 您是否在 iOS 应用上激活了会话?当您发送消息时,手表是否触手可及?
  • 是的,双方都激活了会话..我如何做到这一点?
  • 调试每一步的代码并找出问题所在。看看您是否可以从 FMDB 获取数据,或者发送消息函数是否正确完成了它的工作。

标签: ios swift wcsession


【解决方案1】:

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<String,AnyObject>()
watch_ticket_category.setText(dict["Watchdat"]! as? String)

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

请注意,“Watchdat”键的值不能有条件地转换为字符串。您还需要更正此问题,具体取决于您的意思是该键的值是字典还是数组。

如果您打算让它成为一个嵌套字典,就像您现在编写的代码一样,您必须设置每个标签,如下所示:

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

关于图片:

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

关于如何将图像传输到手表上有很多答案。您应该记住的两件事是:

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

  • sendMessage 支持的最大负载大小,尤其是在您打算传输一组票(和图像)而不是单个票时。

【讨论】:

  • 我已经稍微改变了我的来源..我正在传递字典,就像用代码编写的那样..现在我如何将它传递给我的手表应用程序
  • 我更新了我的答案,指出您正在查看手表端的空字典。相反,请检查传递给您的 message 字典。您还必须在发送之前将手机的图像转换为数据,否则sendMessage 将失败并出现错误。最后一点是您已经在results 循环内填写了ticketInfo n 次,并且具有相同的详细信息。你为什么要在循环中这样做?目前还不清楚为什么sendToWatch 甚至需要构造一些结果数组,因为该数组似乎与“发送”没有任何关系。
  • 我正在使用 FMDB 数据库,其中有 5 个列,分别命名为 image、ticket_category、ticket_type、date、time。那么如何获取数据以及如何将图像转换为 NSDATA?
  • 这是一个现有的问题explaining how to convert an image before sending it to the watch。如果您对如何从 FMDB 获取数据有不相关的问题,您应该提出一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多