swift2 如何使用Watch Connectivity传输UIImage

k3fezbri  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(223)

如何通过WatchConnectivityUIImage从iPhone传输到Apple Watch,而无需用户在手机上进行交互,并且仅在手表以编程方式调用它时才加载。我需要这一点,因为创建UIImage的图像处理使用了Watchkit API中不可用的逻辑,因此必须从手机中创建。我看过一些手表连接的示例,使用:

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

然而,我是手表套件的新手,我对如何使用这个会话管理器感到困惑,特别是从手表到设备,而不是像我在苹果文档中看到的相反。有人能提供一个例子,说明如何在手表和手机上都这样做,以便从手表在手机上调用UIImage吗?

9fkzdhlc

9fkzdhlc1#

若要在iPhone和Apple Watch之间传输文件,您应该使用Watch Connectivity,使用WCSession来正确处理通信。您可以使用WCSessionDelegatedidReceiveMessageData委托方法将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来发送消息,就像按照下面的方式:

视图控制器.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.
   }
}

界面控制器.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,上面的例子只是为了学习,你必须根据项目的复杂性以更合适的方式处理它。
我希望这对你有帮助。

fdbelqdn

fdbelqdn2#

你必须将你的图像作为NSData传输,然后在手表上解码它。你可以看看我的博客文章,我在那里讨论了类似的情况。http://eluss.github.io/AppleWatch_iPhone_data_transfer/
这不是会话的方式,因为我当时没有意识到这一点,但也许它会帮助你得到整个逻辑。

1mrurvl1

1mrurvl13#

在InterfaceController中,如果您使用WCSessionDelegate,请记得以下列方式扩充activationDidCompleteWith方法:

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

  }

相关问题