Отправить данные словаря на Apple Watch из приложения ios

В моем приложении у меня есть эта страница с именем «TicketDetailViewController», на которой у меня есть 3 метки и изображение, в котором данные отображаются с предыдущей страницы. Теперь то, что я хочу, это когда я нажимаю кнопку «Отправить», я хочу отправить отображаемые данные, т. е. 3 метки и изображение, на мои часы Apple, где я также взял 3 метки и изображение в его раскадровке. Проблема в том, что я использую базу данных 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<String,AnyObject>()
    watch_ticket_category.setText(dict["Watchdat"]! as? String)
}

}


person Nishant Narola    schedule 22.08.2016    source источник
comment
когда я нажимаю отправить для просмотра, в консоли ничего не появляется, сохраняются только данные и ничего больше   -  person Nishant Narola    schedule 22.08.2016
comment
это что-то не так в моем коде или нет?. я не понимаю   -  person Nishant Narola    schedule 22.08.2016
comment
Вы активировали сеанс в своем приложении для iOS? И доступны ли часы, когда вы отправляете сообщение?   -  person Eric Qian    schedule 22.08.2016
comment
да, сеанс активирован с обеих сторон.. как мне сделать это доступным?   -  person Nishant Narola    schedule 22.08.2016
comment
где я могу написать это в моем приведенном выше коде   -  person Nishant Narola    schedule 22.08.2016
comment
Вам нужно проверить, доступны ли часы, прежде чем отправлять сообщение на часы.   -  person Eric Qian    schedule 22.08.2016
comment
Отлаживайте свой код для каждого шага и определяйте проблему. Узнайте, можете ли вы получать данные из FMDB и правильно ли работает функция отправки сообщений.   -  person Kenan Karakecili    schedule 22.08.2016
comment
ничего не происходит?   -  person Nishant Narola    schedule 22.08.2016
comment
извлеченные данные печатаются на консоли, только если я запускаю приложение IOS, но когда я запускаю приложение IOS + watch вместе, оно ничего не показывает в консоли   -  person Nishant Narola    schedule 22.08.2016


Ответы (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)

Словарь, который вы проверяете, является новым пустым словарем, который вы только что создали. Однако данные телефона, которые получили часы, были переданы didReceiveMessage в параметре message. Если вы проверите этот словарь, вы должны найти то, что ожидаете.

Обратите внимание, что значение ключа «Watchdat» не может быть условно преобразовано в строку. Вам также необходимо исправить это, в зависимости от того, имели ли вы значение этого ключа в качестве словаря или массива.

Если бы вы хотели, чтобы это был вложенный словарь, поскольку ваш код написан сейчас, вам нужно было бы установить каждую метку, например:

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

Что касается изображения:

Тип столбца изображения вашей записи — строка, но вы ожидаете, что часы отобразят WKInterfaceImage. Если вы намеревались передать изображение на часы, вам также необходимо исправить этот код на стороне iOS.

На SO есть много ответов, объясняющих, как передать изображение на часы. Две вещи, которые вы должны иметь в виду:

  • Размер изображения. Не тратьте время и заряд батареи на передачу изображения с высоким разрешением, которое в конечном итоге будет отображаться на меньшем экране часов. Масштабируйте изображение перед его передачей.

  • Максимальный размер полезной нагрузки, поддерживаемый sendMessage, особенно если вы собираетесь передавать массив билетов (и изображений) вместо одного билета.

person Community    schedule 22.08.2016
comment
я немного изменил свой источник.. я передаю словарь, подобный тому, который написан в коде.. теперь, как я могу передать это в свое приложение для часов - person Nishant Narola; 23.08.2016
comment
Я обновил свой ответ, чтобы указать, что вы проверяли пустой словарь на стороне часов. Вместо этого проверьте message словарь, который вам передали. Вам также придется преобразовать изображение телефона в данные перед отправкой, иначе sendMessage завершится ошибкой. И последнее: вы заполнили ticketInfo n раз внутри цикла results с одинаковыми деталями. Почему вы делаете это внутри цикла? До сих пор неясно, зачем sendToWatch вообще нужно создавать какой-то массив результатов, поскольку этот массив, похоже, не имеет ничего общего с отправкой. - person ; 23.08.2016
comment
я использую базу данных FMDB, в которой у меня есть 5 столбцов с именами: изображение, билет_категория, билет_тип, дата, время. Итак, как я могу получить данные и как я могу преобразовать свое изображение в NSDATA? - person Nishant Narola; 24.08.2016
comment
Вот существующий вопрос, , объясняющий, как преобразовать изображение перед его отправкой в смотреть. Если у вас есть несвязанный вопрос о том, как получить данные из FMDB, вам следует задать отдельный вопрос. - person ; 24.08.2016