見出し画像

ゴルフスコア管理アプリ「Shot Memo」開発裏話的なやつ

私が開発しましたゴルフスコア管理アプリ「Shot Memo」の紹介をこちらの記事にてさせていただきました。

本記事ではこのアプリ開発における裏話的なことを書かせていただこうかと思います。技術的なお話が多めになります。

開発期間について

企画を思いついた日 : 2020年3月10日
開発に着手した日 : 2020年3月17日
リリースした日 : 2022年2月11日

企画からリリースまで丸々2年かかりましたw
実は当初はApple Watchアプリの開発は考えておらず、iPhoneアプリのみで考えていました。開発自体は1ヶ月もかからず2020年の4月半ば頃にはほとんど終わっていて、実際のゴルフ場で試しで使ってみたところまぁ使いづらい!ww
そもそもボールを打つ前に毎回スマホを取り出してアプリ起動してボタンを押してって操作をすることが結構手間取るし、当時ド初心者だったのでボールが右に行ったり左に行ったりでそれどころじゃなかったですw
それから追加でApple Watchアプリの開発を行い、ゴルフ場に行ってはデバッグとパラメータなどのチューニング(という名の遊び)をひたすら行なっていました。

その間ラウンドした回数は49回!
その全てでこのアプリを使用しました。

 2021年の6月頃からソースコードに手を入れていないので、半年以上放置してしまっていました。。。(個人開発あるある)

企画について

自分がアプリを開発するときはまずは企画書の作成から行います。
企画書といってもアプリの概要や主要機能、画面リストなどをテキストで箇条書きにするだけですが、私の性格上アイデアやコンセプトをあらかじめ決めておかないと作りながら決めていくスタイルでやると途中から方向性がブレていってしまうので、開発途中で悩んだら企画書に戻ってコンセプトを再確認して方向性がブレないように心掛けをしています。

企画書はNotionでページを作ってやりたいことをガバーっと書いています。
かなり長いので全てはお見せできませんが、サンプルはこんな感じで、開発タスクの管理などもここで行なっています。

スクリーンショット 2022-02-07 15.31.11

ワイヤフレームの作成

企画がまとまってきたら次にワイヤフレームの作成をします。この話を他の人にすると「個人開発の割にすごい本格的だね」と言われるのですが、企画と同様にデザインのコンセプトなどもあらかじめ決めておかないと開発しながらだとかなりブレるので、画面の構成や簡単なデザインはあらかじめ決めてしまった方が個人的に開発が進めやすいのです。

ワイヤフレームはAdobe XDを使用しています。(デザイナー界隈ではFigma推しの人が多いので、次はそっちにしてみようかな)

ボタンのアイコンやアプリアイコンなどもここで作ってしまってます。(絵心が無いので、図形などを組み合わせたアイコンが多いですw)

スクリーンショット 2022-02-07 15.36.21

開発について

企画、ワイヤーが決まってきたらコードを書き始めます。
今回は画面数も少なく、iPhone側の機能もシンプルなのでそこまで苦労した点は無かったので、Apple Watch側のお話をしようかと思います。

今回は自身としては初めてApple Watchアプリの開発を行いました。
とはいっても、センサー情報を取得して位置情報を取得してiPhoneアプリに送信するシンプルな仕組みです。
その中で苦労したポイントをいくつかピックアップしてみます。

センサー情報のデバッグが大変
当時使用していたApple WatchはSeries 3で開発機にすると非常にもっさりしてしまって、デバッガーにセンサーログが吐き出されない問題が発生していました。ブレークポイントも反応しなかったり。(機種の問題なのか、環境の問題なのか、はたまたXcodeのバグなのか)

そのため、今回の開発ではApple Watchのセンサー情報をアプリ内部で蓄積し、テキストにまとめたものをiPhoneに送信し、iPhoneからMacにファイルを送信するプラグインを実装しました。

スイングモーション検知ロジック構築
取得したセンサーデータをエクセルでグラフ化します。

スクリーンショット 2021-06-23 19.21.41

↑はゴルフクラブをスイング(2回)した時の各センサーの値とそのグラフです。センサー情報を扱う場合、特有のノイズがあったり周波数を合わせたりする必要があるのでフィルターをかけたりするのですが、iOS・WatchOSのライブラリ(Core Motion)は扱いやすいような形で出力されるのでありがたいです。
ここからスイングモーション検知に使えそうな特徴点をピックアップします。
ゴルフスイングには大きく分けて3つのモーションが存在します。テークバック・ダウンスイング・フォロースルーです。
それぞれで特徴点として有効そうな箇所を色付けしてみました。

グループ 78

青がテークバック、黄色がダウンスイング・緑がフォロースルーです。
テークバック時は重力加速度に大きな変があり、ダウンスイングでは加速度・角速度に大きな変化があり、フォロースルーでは重力加速度が元に戻るような動きがあります。
ダウンスイング時に角速度に大きく変化が出ているのが特徴的で、インパクト後にアームローテションと呼ばれる手首が返る動きがあるため、この値は使えそうです。
ダウンスイングで大きな特徴点が出ているので、これだけ見ればええやんとなりそうですが、走ったり、腕をふったりなどゴルフスイング以外でもこれくらいの動作をすることはあるので、単一の値だけ見てしまうと誤検知の原因になります。
そのため、今回の検知ロジックでは、テークバックで重力加速度が一定の値を超え、所定の時間経過を検出トリガーとして始動させ、その後ダウンスイングで加速度・角速度が一定値を超え、その後フォロースルーで重力加速度が一定値まで戻ったらスイングしたと見なすようなロジックを構築しました。
一定値はいわゆる閾値のため、この値を実際のラウンドを行なって検知されたりされなかったりをみながら調整を進めました。

本来であればいくつかの人のスイングデータをサンプルとして欲しかったのですが、ゴルフ友達がほぼいないので断念しましたw(誰かお友達になってくださいw)

iPhoneとApple Watch間のデータのやり取り
iPhoneとWatch間のデータのやり取りはWatch Connectivityという機能を使って行いますが、こいつが結構厄介でした。
まず、接続を確立するためにWCSessionを使ってセッションを作成します。ペアリングしているiPhoneがあればすぐにセッションを確立できるので特に困らないのですが、注意しなければならないのがセッションが確立しているからといって通信できるわけでは無いという点でした。
WCSessionにはactivationStateとisReachableというパラメータがあり、iPhoneの状態(バックグラウンド状態、アプリ非起動など)によって随時値が変化します。

とはいえ、アプリが立ち上がっていないと通信ができないかというとそうではなく、送れるけどレスポンスが無かったり、同期のタイミングがOS側で制御されてしまったりします。(逆にこれがややこしい)
Watch側では送れた!となってiPhoneアプリを起動してもデータは無く、再起動したら取れたり、時間の置いたら取れたり、同期のタイミングがかなり気まぐれなのです。

そのため、Watch側からデータを送りたい場合は、iPhone側にアップデートリクエストを要求するという形にしました。
データの更新があったから問い合わせてねというメッセージをiPhone側に都度送信し、iPhone側がそれを受け取ったらiPhoneからWatchにデータを頂戴って聞きにいくようにしました。(これでデータを送る、受け取るの操作はどちらもiPhone側が主体になるので、結構考えやすくなります)

ざっくり書いてもちょっと長くなってしまったので、ここではこれくらいにして、どこかで詳細記事でも書こうかと思います。

終わりに

今回は「Shot Memo」アプリの開発裏話を少しお話ししました。
この記事でこのアプリのことや、私自身のこと、ゴルフをされない方はゴルフについて興味を持っていただけるとうれしいです。

アプリはこちらからダウンロードできます。

今後もアップデートした時や新しいアプリを開発した時など面白そうな話があれば記事にできればと思います。

それでは!

この記事が気に入ったらサポートをしてみませんか?