2

iPhone アプリと WatchKit アプリを同期しようとしているときに問題が発生しました。問題は、私の WatchKit アプリtableViewに iPhone のデータ配列が追加されていることです。

Watch Connectivity フレームワークのインタラクティブ メッセージングを使用しています

セッションの確立

    if(WCSession.isSupported()){
        self.session = WCSession.defaultSession()
        self.session.delegate = self
        self.session.activateSession()
    }

メッセージを WatchKit アプリに送信する

    do {
        let dataDict = ["data": dictionary1]
        try WCSession.defaultSession().updateApplicationContext(dataDict)
    }

    catch {
        print(error)
    }

これがWatchでメッセージを受け取る方法です

func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {

    dispatch_async(dispatch_get_main_queue()) { () -> Void in


        if let retrievedArray1 = applicationContext["data"] as? [Int : Bool] {

            self.arrayOnWatch = retrievedArray1

        }
    }}

1つの例外を除いてうまく機能します-iPhoneでアプリを起動するまでデータ配列を取得できません。これは私の場合の解決策ではありません。

実際の電話アプリを開かずにメッセージを転送および受信する方法についてのアイデアはありますか?

ありがとうございました。

4

1 に答える 1

2

アプリケーション コンテキストの使用は、iPhone アプリがアプリケーション コンテキストをアクティブに設定する必要があるため、このケースでは機能しません。

WatchKit を使用sendMessageして、時計が iPhone アプリにデータを要求できるようにすることができます。

接続をアクティブにした後、ExtensionDelegateで iPhone アプリにメッセージを送信します。

if WCSession.defaultSession().reachable {
    let messageDict = ["message": "hello iPhone!"]
    WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in
        print(replyDict)
        }, errorHandler: { (error) -> Void in
        print(error)
    }
}

これにより、iPhone アプリが実行されていない場合、バックグラウンドで iPhone アプリが起動します。

iPhone アプリのAppDelegateで、対応する WCSessionDelegate メソッドを実装します (didFinishLauncingWithOptions:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
    replyHandler(["message": "Hello Watch!"])
}

「Hello Watch!」の代わりにデータを送信するだけです。iPhone アプリが実行されていなくても、ウォッチにはデータが保持されます。

于 2015-10-23T16:09:12.433 に答える