Передача UIImage с телефона на часы не работает

За watchOS 2 а также Xcode 7.3Я пытаюсь отправить изображение со стороны iPhone на сторону часов. На стороне телефона, у меня есть это:

func sendImage() {
    if WCSession.isSupported() {
        let session = WCSession.defaultSession()
        if session.watchAppInstalled {
            do {
                let image = UIImage(named: "myPic")
                let imgData = NSKeyedArchiver.archivedDataWithRootObject(image!)
                let dictionary = ["img": imgData]
                try session.updateApplicationContext(dictionary)
            } catch {
                print("ERROR: \(error)")
            }
        }
    }
}

Затем в WatchKit Extension боковая сторона (ExtensionDelegate файл), у меня есть:

func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {

    let initialController = WKExtension.sharedExtension().rootInterfaceController as! InterfaceController
    initialController.showImage(applicationContext["img"] as! NSData)
}

И в InterfaceController:

func showImage(imageData: NSData) {
    let image = UIImage(data: imageData, scale: 1.0)
    self.myImage.setImage(image!)
}

где myImage это WKInterfaceImage выход. когда showImage метод называется, imageData не является nil, но image когда self.myImage.setImage(image!) называется. Что я делаю неправильно?

2 ответа

Он считает, что использованный вами подход не является рекомендованным Apple (хотя частично с необходимыми мерами предосторожности могут быть использованы), Apple рекомендует использовать следующий метод обмена файлами (вы можете сохранить свое изображение во временный файл и отправить его в часы)

func transferFile(_ file: NSURL, metadata metadata: [String : AnyObject]?) -> WCSessionFileTransfer

Конечно, вы должны помнить, что обмен данными между Apple Watch и iPhone ограничен как измерение.

Я незнаком с NSKeyedArchiver но это то, что я предлагаю.

Вы архивируете изображение на телефоне, а затем просто пытаетесь использовать данные на стороне часов. Я думаю, вам понадобится разархивировать, если это имеет смысл. Я обнаружил, что существует NSKeyedUnarchiver который имеет unarchiveObjectWithData функция. Попробуйте это вместо использования архивных данных, так что вы сначала разархивируете данные, а затем создадите UIImage.

Вы также можете вместо этого использовать функцию UIImagePNGRepresentation который принимает UIImage на стороне телефона и отправляет NSData. Затем вы пропускаете дополнительный этап архивирования, который, я не уверен, вам даже нужен. Затем вы просто создаете UIImage с NSData, который был отправлен.

Если это не работает, добавьте распечатку отправляемых вами данных и данных, полученных на Watch, и сравните их.

Другие вопросы по тегам