У меня был тот же вопрос, что и у вас, и я понял:
Сначала вам нужно реализовать класс, соответствующий 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. Он также содержит значение для текстового поля, которое позже будет определено в вашем представлении.
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)
}
}
Теперь вы можете создать простое представление, состоящее из текстового поля и кнопки. Ваш 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")
}
}
}
}
И последнее, но не менее важное: вам нужно объединить ваш ConnectivityProvider, ViewModel и View внутри вашего SceneDelegate:
let viewModel = ViewModel(connectivityProvider: ConnectivityProvider())
let contentView = ContentView(viewModel: viewModel)
...
window.rootViewController = UIHostingController(rootView: contentView)