6

WatchKit アプリからメインの親アプリケーションに情報を送信しようとしています。私が理解していることからopenParentApplication、AppDelegate.swift で受信されるウォッチキット拡張機能で使用できるはずですが、うまくいかないようhandleWatchKitExtensionRequestです。handleWatchKitExtensionRequest引き金になった。

私はいくつかの問題を抱えていたので、この時点で、実際に渡される情報について心配する前に、接続を確立しようとしています。現在、Watchkit ViewController には次のものがあります。

 let testDict = [
    "value1" : "Test 1",
    "value2" : "Test 2"
]

@IBAction func saveButtonFunction() {
    openParentAppForBalance(testDict)
}

private func openParentAppForInfo(Dict: [String: String]) {

    WKInterfaceController.openParentApplication(testDict,
        reply: {(reply, error) -> Void in
            println("openParentApplication called in button function")
    })
}

関数が呼び出されていることを出力に示していますが、handleWatchKitExtensionRequest応答しません。現在、呼び出されることのない AppDelegate.swift で次のように設定されています。

func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) {

    println("we made it!")

    var retValues = Dictionary<String,String>()

    retValues["retval1"] = "return Test 1"
    retValues["retval1"] = "return Test 2"

    reply(retValues)

}

これがどのように機能するかを理解する上で、おそらくここで本当に基本的な何かが欠けているだけだと思いますが、handleWatchKitExtensionRequestトリガーされる方法についての助けがあれば大歓迎です!

4

2 に答える 2

25

ああ、ここで起こっていることは、あなたのコードは正しく、本来あるべきとおりに機能しているということです。ここで解釈しているのは、実際には正しくなく、あなたを迷わせます。良いニュースは、あなたのコードはすでに動いているということです。

あなたは言う、

...これは、関数が呼び出されていることを出力に示しています...

コンソールに というメッセージが表示されている場合はopenParentApplication called in button function、次のようになります。

コードのこの部分は Swift Closure です。

{(reply, error) -> Void in
        println("openParentApplication called in button function")
}

WatchKit 拡張機能が呼び出すWKInterfaceController.openParentApplicationと、親 iPhone アプリにディクショナリ (あなたのtestDict) が渡されます。データがシリアル化されている場合、iPhone アプリケーションはこれを使用してデータを返すことができます。また、渡したクロージャーを返します。これにより、後で応答が受信された時点で、WatchKit 拡張機能が自身で定義したコードを実行できるようになります。このクロージャーには、返されたデータと、呼び出さtestDictれたときにローカルにアクセスできた他の変数の両方の使用を含めることができます。openParentApplicationWatchKit 拡張機能は、クロージャーが返されると、クロージャー内のコードを自動的に実行します。

したがって、 が表示openParentApplication called in button functionされた場合、これは iPhone アプリケーションからの応答が受信され、閉鎖が実行されたことを示します。したがって、WatchKit テスト コードでは、実際には println ステートメントを次のように変更する必要があります。

WKInterfaceController.openParentApplication(testDict,
    reply: {(reply, error) -> Void in
        println("Reply to openParentApplication received from iPhone app")
    })

さて、コードが正しく実行されていることに気付かなかったのは当然のことですが、このコードが iPhone アプリで実行されたことをコンソールで拒否されると予想していたためです。

println("we made it!")

ただし、Xcode は 2 つのプロセスへの同時アタッチをサポートしていません。したがって、WatchKit アプリに接続している場合、iPhone アプリのログ メッセージは表示されません。接続されたプロセスでない場合、iPhone アプリもブレークポイントに応答しません。これらはどちらも、バックグラウンドで実行されているか (によって起こされたopenParentApplication)、フォアグラウンドで実行されているか (WatchKit アプリの実行後にシミュレーターで手動で起動した場合) に当てはまります。iPhone アプリのアクティビティの効果を見ることができますが、 WatchKit アプリに接続している間は、直接イントロスペクトすることはできません。

まず、コードは正しく機能しています。テスト コードを通過できます。また、WatchKit アプリに応答しているときに iPhone 側の動作を内省することに関連して、部分的な解決策があります。シミュレーターから WatchKit アプリを起動し、実行したら、Xcode でメニュー オプション [デバッグ] > [プロセスにアタッチ] をアクティブにし、上部の [可能性の高いターゲット] でiPhone アプリ プロセスを選択します。これで、iPhone アプリのコンソール メッセージが表示され、iPhone アプリがブレークポイントに応答するようになりますが、もちろん、WatchKit アプリ側からこれらを表示することはできなくなります。シミュレーターで引き続き両方のアプリを操作でき、実行中にどちらにアタッチされているかを切り替えることができます。

于 2015-01-23T19:07:49.157 に答える