如何使用 Watch Connectivity 传输 UIImage
How to transfer a UIImage using Watch Connectivity
如何在 phone 上通过 WatchConnecitivity 将 UIImage
从 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?) {
}
如何在 phone 上通过 WatchConnecitivity 将 UIImage
从 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?) {
}