Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > アップルWatchから親アプリケーションへデータ送信

アップルWatchから親アプリケーションへデータ送信

サンプル画像

前回の記事では実機上で親アプリケーションからAppleWatchにイベントを送るのができなかった。 Notificationでできるはずなのですが、動作してくれなかった、、、、、。今回はいったん逆の時計から親アプリへのデータ送信の方法サンプルサイト をQiita様の中の記事でみつけましたので検証してみます。


参考:WatchKit AppからiPhone上の親アプリケーション本体にデータを渡す
参考:handleWatchKitExtensionRequest not responding to openParentApplication in Watchkit Extension (Swift)

Watch OS 2以降はデバイス間のデータ移管はWatchConnectivityを利用します

NSUserDefaultは利用できなくなっているので注意です!(2017-02-24)代わりにWCSessionをご利用ください。

参考:[watchOS 2][iOS 9] Watch Connectivity で情報をやりとりする様々な方法
参考: NSUserDefaults not working on Xcode beta with Watch OS2
参考:[WatchOS2] WatchOS2からiOSに対してメッセージを送る

やってみた

どうやらWatch側でopenParentApplication:reply:、本体実機側のアプリで application:handleWatchKitExtensionRequest:reply:を 実装すれば対応できるとのことです。やってみます。ひげがのびる怪しい過去記事のサンプルを利用しながら、端末でのびるヒゲの本数を 親アプリにも教えてあげるサンプルを作成してみます。

サンプル画像 このWatch側で動いている処理を本体へ、、、、

まずWatch側の実装です


    func onHigenobita(){
        //ここが実行されます
        timerLabel.setText("ひげが\(++higeCnt)本のびた");
        
        WKInterfaceController.openParentApplication(["higeValue": "\(higeCnt)"],
            reply: {replyInfo, error in
                println(replyInfo["fromParentApplication"])
        })
    }

タイマーで呼ばれている箇所です。ここにopenParentApplicationを実装します。replayのfromParentApplicationは実機側のAppから 返信内容を表示している箇所です

引き続き親側も準備します。AppDelegate.swftに以下を追加してみます


    func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) {
        var higeValueFromWatch: String = userInfo["higeValue"] as! String!
        reply(["fromParentApplication":"Parent Application got \(higeValueFromWatch) Hige!"])
    }
    

すると、、、 AppDelegate.swift:69:10: Parameters of 'application(_:handleWatchKitExtensionRequest:reply:)' have different optionality than expected by protocol 'UIApplicationDelegate' こんな警告が出たなんだこれは。よくわかりませんが、警告ですので恐る恐る進めてみます。すると、、、、思っているようにうまくいかない。。。Watch側が真っ黒(ログは受け取っていたので動作はしている様でした。)。

と思いましたがCleanしてからだとWatch側表示されました。うーん、いまいち挙動がまだおかしいような気がする。β版なので仕方ないのかな

サンプル画像

ひとまず確認できました。本体のiPhone側実機からreplayされている内容が反映されているのをLogで確認できました。

カスタマイズ

あんまり思い浮かびませんでしたので、ヒゲの伸びる速度を1.25倍ずつ加速度的に伸びるようにしてどんな気持ちになるかを検証してみました。


    func onHigenobita(){
        //ここが実行されます
        higeCnt = higeCnt * 1.25;
        timerLabel.setText("ひげが\(higeCnt)本のびた");
        WKInterfaceController.openParentApplication(["higeValue": "\(higeCnt)"],
            reply: {replyInfo, error in
                println(replyInfo["fromParentApplication"])
        })
    }
    

サンプル画像

なんだか胸がモヤモヤします。気持ちいいものではありませんね。。。。

まとめ

WatchKitの検証よりもヒゲが伸びて僕の気持ちがどう動くかの訳のわからぬお恥ずかしい検証になってしまいました。。。失礼しました。

(※2015/3/5追記)AppleWatchの発表があるとのAppleカンファレンス<3月9日>がもうすぐです!事前のまとめ情報をGIZMODE様で見つけましたので共有です!
発表会直前! 世界が注目するApple Watch事前情報まとめ

前の記事はこちらからです!

次の記事はこちらからです!

↓こんな記事もありますよ!

Facebook SDKを試してみる#3(再調査)

SDKのインストーラが起動しても結局frameworkをドラッグドロップしなちゃ追加できない、面倒臭い、と発言してしまったのですが、 どうやらSDKをインストーラにてインストールした場合(SDK4.1)は、importするだけでどうやらSDKが追加できるとかなんとか。

WatchKitでタイマーアプリを作成する。

簡単なアプリを作成しながらAppleWatchを学んでいきます。前回の記事で大まかな動きは理解できましたので、 つぎはAppleWatchとアプリとの連携をタイマー機能を利用して検証していきます

willsetとdidsetでプロパティを監視。意味あるのか???

クラスのプロパティにはWillsetとdidsetという監視用の関数があると聞いたのですが、用途は分かるにしても メリットとしてはどういうものなのかなと、うーん、と考えていました。調べていると海外のサイトでは同じように疑問にもつ質問があがっていました。 getとsetで同じことができるのでは?との私と同じスタンスです。解決されていましたので、順に説明していきます。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!