gpt4 book ai didi

swiftui - 在 SwiftUI 中使用 WCSession 向 Apple Watch 发送消息

转载 作者:行者123 更新时间:2023-12-03 16:53:19 28 4
gpt4 key购买 nike

很久以前我做了一个例子,如何使用 Swift 从 iPhone 向 Apple Watch 发送简单的消息:

import UIKit
import WatchConnectivity

class ViewController: UIViewController, WCSessionDelegate {

// MARK: Outlets

@IBOutlet weak var textField: UITextField!

// MARK: Variables

var wcSession : WCSession! = nil

// MARK: Overrides

override func viewDidLoad() {
super.viewDidLoad()

wcSession = WCSession.default
wcSession.delegate = self
wcSession.activate()

}

// MARK: Button Actions

@IBAction func sendText(_ sender: Any) {

let txt = textField.text!
let message = ["message":txt]

wcSession.sendMessage(message, replyHandler: nil) { (error) in

print(error.localizedDescription)

}

}

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

// Code

}

func sessionDidBecomeInactive(_ session: WCSession) {

// Code

}

func sessionDidDeactivate(_ session: WCSession) {

// Code

}

}

现在我正在尝试使用 SwiftUI 做同样的事情,但到目前为止还没有成功。
任何人都可以帮助解决这个问题吗?

我只需要知道如何将 WCSession 类和 WCSessionDelegate 与 SwiftUI 一起使用。

谢谢

最佳答案

我刚刚和你有同样的问题,我想通了:
首先你需要实现一个符合WCSessionDelegate的类.我喜欢为此使用一个单独的类:

import WatchConnectivity

class ConnectivityProvider: NSObject, WCSessionDelegate {

private let session: WCSession

init(session: WCSession = .default) {
self.session = session
super.init()
self.session.delegate = self
}

func send(message: [String:Any]) -> Void {
session.sendMessage(message, replyHandler: nil) { (error) in
print(error.localizedDescription)
}
}

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

func sessionDidBecomeInactive(_ session: WCSession) {
// code
}

func sessionDidDeactivate(_ session: WCSession) {
// code
}
}
现在您需要一个 ViewModel,它将您的 ConnectivityProvider 作为参数。 ViewModel 将负责您的 View 和 ConnectivityProvider 的连接。它还保存稍后在您的 View 中定义的文本字段的值。
import SwiftUI  

final class ViewModel: ObservableObject {

private(set) var connectivityProvider: ConnectivityProvider
var textFieldValue: String = ""

init(connectivityProvider: ConnectivityProvider) {
self.connectivityProvider = connectivityProvider
}

func sendMessage() -> Void {
let txt = textFieldValue
let message = ["message":txt]
connectivityProvider.send(message: message)
}
}
现在您可以构建一个由 Textfield 和 Button 组成的简单 View 。您的 View 将取决于您刚刚定义的 ViewModel。
import SwiftUI

struct ContentView: View {

@ObservedObject var viewModel: ViewModel

var body: some View {
VStack {
TextField("Message Content", text: $viewModel.textFieldValue)

Button(action: {
self.viewModel.sendMessage()
}) {
Text("Send Message")
}
}
}
}
最后但同样重要的是,您需要在 SceneDelegate 中组合 ConnectivityProvider、ViewModel 和 View:
let viewModel = ViewModel(connectivityProvider: ConnectivityProvider())
let contentView = ContentView(viewModel: viewModel)

...

window.rootViewController = UIHostingController(rootView: contentView)
====================================
更新:如何激活 session ?
首先向您的 ConnectivityProvider 添加一个激活 session 的新函数:
class ConnectivityProvider: NSObject, WCSessionDelegate {
...
func connect() {
guard WCSession.isSupported() else {
print("WCSession is not supported")
return
}

session.activate()
}
...
}
现在,您可以在需要连接 WCSession 时调用 connect 函数。您应该能够在任何地方连接它,例如在您的 SceneDelegate、您的 ViewModel 中,甚至直接在您的 ConnectivityProvider 的 init 中:
连接提供者初始化:
class ConnectivityProvider: NSObject, WCSessionDelegate {

private let session: WCSession

init(session: WCSession = .default) {
self.session = session
super.init()
self.session.delegate = self
self.connect()
}
...
}
View 模型:
import SwiftUI  

final class ViewModel: ObservableObject {

private(set) var connectivityProvider: ConnectivityProvider
var textFieldValue: String = ""

init(connectivityProvider: ConnectivityProvider) {
self.connectivityProvider = connectivityProvider
self.connectivityProvider.connect()
}

func sendMessage() -> Void {
let txt = textFieldValue
let message = ["message":txt]
connectivityProvider.send(message: message)
}
}
场景委托(delegate):
let connectivityProvider = ConnectivityProvider()
connectivityProvider.connect()
let viewModel = ViewModel(connectivityProvider: connectivityProvider)
let contentView = ContentView(viewModel: viewModel)

...

window.rootViewController = UIHostingController(rootView: contentView)

关于swiftui - 在 SwiftUI 中使用 WCSession 向 Apple Watch 发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59804121/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com