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

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

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

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

CoreTextでTextViewの一文字の向きを変える(#2)

さて、サンプルそのままだと面白くないので、本日6月から開始する自転車規制強化 にのっかったサンプル<自転車の転だけ横に曲げる>にしてみます。(14歳以上が対象。自転車のイヤホン装着や片手走行、 酔っ払い運転、歩道運転、片手スマホ、、、、今まで誰もがやり通してきたことが「逮捕や補導の対象」となるようです。赤切符もきられる ようになるとのことで、自転車に酔っ払ってのって自動車の免停なんかになりかね無いので注意です)

関数引数の参照渡し Inout

Swiftで参照だけを渡す(呼び出し元の変数の値を変更する)にはどうしたらよいのかな〜と調査していると、関数引数に参照渡しする方法でindexinoutという言葉があることを知りました。紹介いたします

アプリから電話をかける

Objective-Cではサンプルがありましたが日本語では無かったので共有です!
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!