如何使用Watch Connectivity传输UIImage

时间:2015-10-13 22:40:19

标签: ios swift swift2 watchkit watch-os-2

如何将UIImage WatchConnecitivity 从iPhone传输到Apple Watch,而无需手机上的用户互动,只会加载,因为手表会以编程方式调用它。我需要这个,因为创建UIImage的图像处理使用Watchkit API中不可用的逻辑,所以必须从手机创建它。我似乎使用了一些Watch Connectivity的例子:

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

然而,我一般都是新手表套件和iOS,我对如何使用这个会话管理器很困惑,特别是从手表到设备,而不是像我在网上的例子中看到的那样。有人可以提供一个如何在手表和手机上执行此操作的示例,以便通过手表从手机上呼叫UIImage吗?

3 个答案:

答案 0 :(得分:12)

要在iPhone和Apple Watch之间传输文件,您应使用Watch Connectivity,使用WCSession正确处理通信。您可以使用UIImage的{​​{1}}委托方法发送NSData didReceiveMessageData

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

如果是PNG图片

NSData

如果是JPG图片

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

然后您可以使用let image = UIImage(named: "nameOfYourImage.jpg") let data = UIImageJPEGRepresentation(image, 1.0) 发送消息,如下所示:

  

<强> ViewController.swift

WCSession
  

<强> InterfaceController.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.
   }
}

在上面的代码中,当您打开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时,上面的示例仅用于学习目的,您必须以更合适的方式处理项目的复杂性

我希望这对你有所帮助。

答案 1 :(得分:0)

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

这不是使用会话的方式,因为当时我还没有意识到它,但也许它会帮助你获得整个逻辑。

答案 2 :(得分:0)

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

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

  }