如何使用 Watch Connectivity 传输 UIImage

How to transfer a UIImage using Watch Connectivity

如何在 phone 上通过 WatchConnecitivityUIImage 从 iPhone 传输到 Apple Watch 而无需用户交互,并且只加载因为手表以编程方式调用它。我需要这个,因为创建 UIImage 的图像处理使用了 Watchkit API 中不可用的逻辑,因此它必须从 phone 中创建。我似乎有一些使用手表连接的例子:

func startSession() {
    session?.delegate = self
    session?.activateSession()
}

但是,我是手表套件的新手,对如何使用此会话管理器感到困惑,尤其是如何从手表转到设备,而不是像我在苹果文档中看到的那样反过来。有人可以提供一个示例,说明如何在手表和 phone 上执行此操作以在手表的 phone 上调用 UIImage 吗?

您必须将图像传输为 NSData,然后在手表端对其进行解码。您可以查看我的博客 post,其中介绍了类似案例。 http://eluss.github.io/AppleWatch_iPhone_data_transfer/

这不是使用 session 的方式,因为我当时并不知道它,但也许它会帮助您了解整个逻辑。

要在 iPhone 和 Apple Watch 之间传输文件,您应该使用 Watch Connectivity,使用 WCSession 来正确处理通信。您可以使用 WCSessionDelegate.

didReceiveMessageData 委托方法将 UIImage 作为 NSData 发送

您应该知道的第一件事是将 UIImage 转换为 NSData,反之亦然。您可以为此使用以下代码:

如果是PNG图片

let image = UIImage(named: "nameOfYourImage.jpg")
let data = UIImagePNGRepresentation(image)

如果是JPG图片

let image = UIImage(named: "nameOfYourImage.jpg")
let data = UIImageJPEGRepresentation(image, 1.0)

然后您可以使用 WCSession 发送消息,如下所示:

ViewController.swift

class ViewController: UIViewController, WCSessionDelegate {

   override func viewDidLoad() {
       super.viewDidLoad()
       // Do any additional setup after loading the view, typically from a nib.

       if WCSession.isSupported() {
           WCSession.defaultSession().delegate = self
           WCSession.defaultSession().activateSession()
       }

       let image = UIImage(named: "index.jpg")!

       let data = UIImageJPEGRepresentation(image, 1.0)

       WCSession.defaultSession().sendMessageData(data!, replyHandler: { (data) -> Void in
           // handle the response from the device

        }) { (error) -> Void in
              print("error: \(error.localizedDescription)")

       }
   }

   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
   }
}

InterfaceController.swift

import WatchKit
import Foundation
import WatchConnectivity


class InterfaceController: WKInterfaceController, WCSessionDelegate {

   override func awakeWithContext(context: AnyObject?) {
       super.awakeWithContext(context)

       // Configure interface objects here.
   }

   override func willActivate() {
       // This method is called when watch view controller is about to be visible to user
       super.willActivate()

       if WCSession.isSupported() {
           WCSession.defaultSession().delegate = self
           WCSession.defaultSession().activateSession()
       } 
   }

   override func didDeactivate() {
       // This method is called when watch view controller is no longer visible
       super.didDeactivate()
   }

   func session(session: WCSession, didReceiveMessageData messageData: NSData, replyHandler: (NSData) -> Void) {

       guard let image = UIImage(data: messageData) else {
           return
       }

       // throw to the main queue to upate properly
       dispatch_async(dispatch_get_main_queue()) { [weak self] in
           // update your UI here
       }

      replyHandler(messageData)
   }
}

在上面的代码中,当你打开ViewController时,它会发送UIImage,上面的例子只是为了学习目的,你必须以更适当的方式处理它的复杂性你的项目。

希望对你有所帮助。

在InterfaceController中,如果使用WCSessionDelegate,记得扩展方法activationDidCompleteWith:

func session(_ session: WCSession, activationDidCompleteWith  
  activationState: WCSessionActivationState, error: Error?) {

  }