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事前情報まとめ

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

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

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

UIButton

基本的なボタンを動的にコーディングだけで作成する説明をしています。

UIStepper

さて今回は基本のコンポーネントの一つStepper(メモリを少しずつ+とーで上下させるコントロール)を説明します。 単純なコントロールですのが、初期設定で、+と-が表示される優れものです。ただ、単調な為に記事にするのが面白くないので、 何度も申し訳ありませんが「ヒゲ」にフォーカスして、ヒゲを剃るStepper(ヒゲの量を調整する)を作成して説明してみます。

URLエンコードとデコード

サーバとデータのやりとりをしているとURLエンコードしないと文字化けしちゃったりと問題がでる場合があります。 phpのurlencodeやurldecodeと連携させる場合等、Swift側でどうやってエンコードすれば良いかの方法を記載しております
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!