ENGINEERING&RUN

26.2マイルを走る僕の旅

ランニングアプリを大晦日ハッカソンで作った

毎度の紹介ですが、ランニングにハマっています。
どれくらいかというと、打ち合わせ中ずっと「もっと速く走れるようになれないかな」と考えているくらいです。

そんな自分ですが、大晦日に毎年参加している「大晦日ハッカソン」参加しました。
ハッカソンはマラソンとハックを混ぜたもので、まぁとにかくがーっと集中して開発するやつです。
大晦日ハッカソン2018 #大晦日ハッカソン : ATND

日中はやることが多かったので、結局開発しはじめたのは21時くらい。
だいたい3時間くらいでサクッと作りました。

作ったアプリ

今回作ったのは「月間走行距離を集計し、Twitterのプロフィールを更新するアプリ」です。
iOSのヘルスケアにワークアウトの走行データを記録し、このアプリを立ち上げると月間走行距離を計算してくれて、APIサーバ経由でTwitterのプロフィールの後ろの月間走行距離も記録してくれます。

f:id:eishis:20190326222022p:plain
アイコンすら設定できていないですが!

立ち上げたあとはこんな感じでTwitterのプロフィールが更新されます。

毎回アプリ立ち上げるんじゃなくてバックグラウンドで処理しろーという感じですが、何せ3時間の出来なのでしょうがない。

作った経緯

ランニングの記録にNike Run Clubを普段使っていますが、たまには違うアプリを使いたくなるんですよね。

Nike Run Club

Nike Run Club

  • Nike, Inc
  • ヘルスケア/フィットネス
  • 無料

具体的にはRun KeeperやRuntasticなどです。

Runkeeper- GPS ランニングトラッカー

Runkeeper- GPS ランニングトラッカー

  • FitnessKeeper, Inc.
  • ヘルスケア/フィットネス
  • 無料

Runtastic ランニング&ウォーキング

Runtastic ランニング&ウォーキング

  • runtastic
  • ヘルスケア/フィットネス
  • 無料

ですが、個々のアプリで「月間走行距離」は記録できても、当然横断的に見れるアプリはありません。
ただだいたいのアプリはヘルスケアへの同期が可能です。
それに今までの走行データを色々と使いたいので、サーバ側のDBに保存しちゃいたいなーというのがありました。

なので、ヘルスケアを集計→サーバのAPIへPOST→サーバ側でDB保存&Twitterのプロフィール更新 というフローとすることにしました。

使用した技術

アプリ側:React Native サーバ側:Ruby on Rails(既にいろんな用途に使っている空きサーバがあったので...)

さくっと作りたかったので、アプリ側はExpoを使おうと考えていました。

expo.io

ですが、残念ながら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のプロフィール更新はここらへんを見ればわかります。

developer.twitter.com


そんなこんなで、まぁ雑な作りですがアプリを横断して走行距離をちゃんと把握できる便利なものができました。
ここからGASに入れてすべてSpread Sheetとかで管理できたらいいかなと思ったりしています。

あとバックグラウンドジョブ...!

それにしても今月は故障の影響もあるけど、全然走ってなさすぎて辛い