【Swift】AppleWatch(SwiftUI)とiPhone(Storyboard)の連携が上手くいきません。
Q&A
Closed
解決したいこと
現在作っているアプリをAppleWatchと連携できるようにしようとしています。
上手くいかなかったので、該当部分だけで仮のアプリを作ってみましたが、同じ状態です。
発生している問題・エラー
iPhoneのボタンを押したらAppleWatchのTextが"未"から"已"になるようにしたいのですが、ボタンを押しても変化がありません。
コンソールには以下の文が表示されています。
ビルド直後
Application context data is nil
Application context data is nil
ボタンを押した後
pushed
-[WCSession _onqueue_notifyOfMessageError:messageID:withErrorHandler:] 7848CBDF-9A08-4D36-B273-8093C764BA21 errorHandler: YES with WCErrorCodeDeliveryFailed
ペイロードを配信できませんでした。
しばらくして
-[WCSession _onqueue_notifyOfMessageError:messageID:withErrorHandler:] 7848CBDF-9A08-4D36-B273-8093C764BA21 errorHandler: YES with WCErrorCodeMessageReplyTimedOut
Message reply took too long.
該当するソースコード
iPhoneアプリはStoryboard、AppleWatchアプリはSwiftUIで作っています。
import UIKit
import WatchConnectivity
class ViewController: UIViewController, WCSessionDelegate {
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: (any Error)?) {
}
func sessionDidBecomeInactive(_ session: WCSession) {
}
func sessionDidDeactivate(_ session: WCSession) {
}
override func viewDidLoad() {
super.viewDidLoad()
if WCSession.isSupported(){
let session = WCSession.default
session.delegate = self
session.activate()
// Do any additional setup after loading the view.
}
}
@IBAction func a(_ sender: Any) {
let aaa = "已"
let message = ["send" :aaa.description]
WCSession.default.sendMessage(message, replyHandler: {reply in print("reply")}, errorHandler: {error in print(error.localizedDescription)})
print("pushed")
}
}
class WatchConnector: NSObject, ObservableObject, WCSessionDelegate{
override init() {
super.init()
if WCSession.isSupported() {
WCSession.default.delegate = self
WCSession.default.activate()
}
}
func session(
_ session: WCSession,
activationDidCompleteWith activationState: WCSessionActivationState,
error: Error?
) {
print("activationDidCompleteWith state= \(activationState.rawValue)")
}
func sessionDidBecomeInactive(_ session: WCSession) {
print("sessionDidBecomeInactive")
}
func sessionDidDeactivate(_ session: WCSession) {
print("sessionDidDeactivate")
}
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
replyHandler(["send" : "OK"])
}
}
import SwiftUI
import WatchConnectivity
struct ContentView: View {
@ObservedObject var connector = PhoneConnector()
var body: some View {
Text("\(self.connector.receivedMessage)")
}
}
struct ContentView_Previews: PreviewProvider{
static var previews: some View{
ContentView()
}
}
class PhoneConnector: NSObject, ObservableObject, WCSessionDelegate {
@Published var receivedMessage = "未"
override init() {
super.init()
if WCSession.isSupported() {
let session = WCSession.default
session.delegate = self
session.activate()
}
}
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: (any Error)?) {
print("activationDidCompleteWith state= \(activationState.rawValue)")
}
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
print("didReceiveMessage: \(message)")
DispatchQueue.main.async {
self.receivedMessage = message["send"] as! String
}
}
}
#Preview {
ContentView()
}
自分で試したこと
iPhoneとAppleWatch両方ともSwiftUIや両方Storyboardの記事はいくつかありましたが、別々のものはなかったので、2つを比較しながら自分なりに解釈して入力したつもりです。
AppleWatchの記事が少ないので初歩的なことかも知れませんが、質問させていただきます。よろしくお願いいたします。
参考サイト