ランニングアプリを大晦日ハッカソンで作った
毎度の紹介ですが、ランニングにハマっています。
どれくらいかというと、打ち合わせ中ずっと「もっと速く走れるようになれないかな」と考えているくらいです。
そんな自分ですが、大晦日に毎年参加している「大晦日ハッカソン」参加しました。
ハッカソンはマラソンとハックを混ぜたもので、まぁとにかくがーっと集中して開発するやつです。
大晦日ハッカソン2018 #大晦日ハッカソン : ATND
日中はやることが多かったので、結局開発しはじめたのは21時くらい。
だいたい3時間くらいでサクッと作りました。
おそすぎるけど参加登録しました! 大晦日ハッカソン2018 #大晦日ハッカソン https://t.co/nyEaovwkTy #atnd
— eishis / 今月 75.43 km (@kinnikujst) December 31, 2018
作ったアプリ
今回作ったのは「月間走行距離を集計し、Twitterのプロフィールを更新するアプリ」です。
iOSのヘルスケアにワークアウトの走行データを記録し、このアプリを立ち上げると月間走行距離を計算してくれて、APIサーバ経由でTwitterのプロフィールの後ろの月間走行距離も記録してくれます。
アイコンすら設定できていないですが!
立ち上げたあとはこんな感じでTwitterのプロフィールが更新されます。
できたー!React Nativeでヘルスケアのデータにアクセスしてサーバにデータを送り、Twitterのプロフィールの月間走行距離を自動アップデートするアプリを作った。#大晦日ハッカソン
— eishis / 今月 75.43 km (@kinnikujst) December 31, 2018
毎回アプリ立ち上げるんじゃなくてバックグラウンドで処理しろーという感じですが、何せ3時間の出来なのでしょうがない。
作った経緯
ランニングの記録にNike Run Clubを普段使っていますが、たまには違うアプリを使いたくなるんですよね。
具体的にはRun KeeperやRuntasticなどです。
ですが、個々のアプリで「月間走行距離」は記録できても、当然横断的に見れるアプリはありません。
ただだいたいのアプリはヘルスケアへの同期が可能です。
それに今までの走行データを色々と使いたいので、サーバ側のDBに保存しちゃいたいなーというのがありました。
なので、ヘルスケアを集計→サーバのAPIへPOST→サーバ側でDB保存&Twitterのプロフィール更新 というフローとすることにしました。
使用した技術
アプリ側:React Native サーバ側:Ruby on Rails(既にいろんな用途に使っている空きサーバがあったので...)
さくっと作りたかったので、アプリ側はExpoを使おうと考えていました。
ですが、残念ながらHealthKitの中でも走行距離データであるWorkOutは取得できなかったんですよね...
Pedometer - Expo Documentation
そこで普通にReact Nativeでやることに。
今回はWorkOutのデータを取得するためにこちらのパッケージを使いました。
GitHub - AFGhazy/rn-apple-healthkit: A React Native package for interacting with Apple HealthKit
まぁこんな感じで書いてあげればワークアウトのレコードを取ってこれます。
const options = { startDate: "0" }; return new Promise((resolve, reject) => { AppleHealthKit.getWorkout(options, (err, results) => { if (err) { reject(err); return; } const records = results.filter( result => result.activityName === "Running" ); resolve(records); }); });
あとはここのフィルタをちゃんとしてあげて、そのデータをAPIサーバに送ってあげればOKです。
サーバ側は普通に値をキャッチするだけです。 Twitterのプロフィール更新はここらへんを見ればわかります。
そんなこんなで、まぁ雑な作りですがアプリを横断して走行距離をちゃんと把握できる便利なものができました。
ここからGASに入れてすべてSpread Sheetとかで管理できたらいいかなと思ったりしています。
あとバックグラウンドジョブ...!
それにしても今月は故障の影響もあるけど、全然走ってなさすぎて辛い