3121041
@3121041

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Swift】AppleWatch(SwiftUI)とiPhone(Storyboard)の連携が上手くいきません。

解決したいこと

現在作っているアプリを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で作っています。

ViewController.swift
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"])
    }
}
ContentView.swift
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の記事が少ないので初歩的なことかも知れませんが、質問させていただきます。よろしくお願いいたします。

参考サイト

0

1Answer

Your answer might help someone💌