前回までに歩数収集APIの開発が終わったので、今回からはiPhoneから歩数収集APIに歩数をアップロードする部分の開発を行いたいと思います。

でもiPhoneで開発っていうとxcodeだよね?
有償だし、できたアプリを利用するのにアップルストアに
年会費払うのってどうなんだろう。。。
さてどう実現していこうか
歩数自体はiPhone標準のヘルスケアAppで管理していて、データの書き出しを行うことができます。
iPhoneのヘルスケアAppとは?
※appleのホームページより
ヘルスケア App は、iPhone や Apple Watch、普段使っているほかの App からヘルスケアデータを集めてくれるので、一か所ですべての進捗を確認できて便利です。
中略
https://support.apple.com/ja-jp/HT203037
ヘルスケア App は、歩数や歩行距離、走行距離を自動的に数えてくれます。さらに、Apple Watch を持っていれば、Apple Watch がアクティビティデータを自動的に記録してくれます。ヘルスケアのカテゴリに関して情報を入力したり、ヘルスケア App に対応した普段使う App やデバイスからデータを取り込むこともできます。
ちょっと見てみましょう。ヘルスケアアプリをタップします。

概要に歩数が表示されています。さらに歩数をタップすると時間毎の歩数がグラフ表示されているので、週をタップすると過去1週間の日毎歩数が表示されます。
月、年もタップできるので過去1年間は歩数を保持しているようです。
データの書き出しもできます。
概要画面 右上の人のアイコンをタップし、移動した先の画面下の”すべてのヘルスケアデータを書き出す”をタップすると、ヘルスケアデータを書き出すのダイアログが表示されるので、書き出すをクリックすると”書き出したデータ.zip”という名前のファイルを取得することができます。

zipファイルを解凍するとxml形式でデータが保存されています。
1レコードを抜き出したものです。
<Record type="HKQuantityTypeIdentifierStepCount" sourceName="ヘルスケア" unit="count" creationDate="2014-09-22 22:04:02 +0900" startDate="2014-09-22 22:03:41 +0900" endDate="2014-09-22 22:03:44 +0900" value="6"/>これをPCに送ってPCから歩数収集APIに送信することはできそうですが、ものぐさなママがやらせることを考えると、ボタン一つでできないと長続きしないでしょう。

iPhoneでExcelマクロみたいな自動化ツールって無いのかな?
ググってみたらショートカットって機能があるぞ?
Google先生にお伺いしてみたら、ショートカットという機能が使えそうです。
iPhoneのショートカット機能とは?
※appleのホームページより
ショートカットは、Appでの1つまたは複数の作業を素早く完了するための機能です。「ショートカット」Appでは、複数の手順を組み合わせた独自のショートカットを作成できます。
ショートカット機能の例です。※appleのホームページより

いくつかのステップを組み合わせて処理の流れを作っています。
一つ一つのステップをアクションと呼びます。
※appleのホームページより
アクションはショートカットの構成要素です。各ショートカットは一連のアクションで構成され、各アクションは特定の機能を実行する単一ステップです。例えば、アニメーションGIFを共有するショートカットには、3つの連続するアクションが含まれる可能性があります: 「最新の写真を取得」でデバイス上にある撮影済みの最新の写真を取得し、「GIFを作成」でそれらの写真を使ってアニメーションGIFを構築し、「メッセージを送信」でそのGIFを宛先に自動で送信します。アクションは、Appleデバイス上にあるAppの最高の機能を小さなパーツに分解したものです。何百もあるアクションには、ショートカットを構築するために連携させることができる多様なステップがあります。
アクションとしてはiPhoneにインストールされているアプリや、様々なコマンドを利用・組み合わせることが可能です。

要件定義
歩数はiPhone標準のヘルスケアアプリに登録されているものを用います。
歩数の取得と歩数収集APIへのアップロードはiPhone標準のショートカット機能で実装します。
※iPhoneでガチアプリ開発は流石に手に余る。。。
iOSは14.7.1以上とします。※私が使っているiPhoneのバージョンです。
設計
今までの話をまとめるとこんな感じになります。

ショートカット機能を用いてヘルスケアアプリから歩数を取得し、歩数収集APIに一件づつPOSTします。どこまでPOSTしたか管理することは難しいので、一日一回ショートカットを起動してもらうことを
前提にしますが、多少ずれはあると思うので、1日前からの歩数を取得するようにします。
※重複した場合はAPI側でエラーを返してくれます。
エラーについては念のためログとして保存しておきます。
まずは試しにショートカットでAPIをたたいてみる。
歩数収集APIをたたくだけのショートカットを作ってみましょう。

ホーム画面よりショートカットをタップします。
すべてのショートカット画面が表示されるので、右上の+をタップします。

新規ショートカットの画面が表示されるので、+アクションを追加をタップします。
アクションを選択する画面が表示されるので、Webをタップします。
ショートカット機能でWEB-APIの接続するには、接続先をURLに記載し、接続方法をURLの内容を取得に設定します。

一覧からURLをタップします。
URLを入力する画面が表示されるので、歩数収集APIのURLを入力して、URLの下の+をタップします。

再びアクションの一覧が表示されるので、WebからURLの内容を取得をタップします。
URLの下にネットワークと表示されたボックスが追加されます。ここで追加されたボックスに記載されたURLですが、URLのボックスに入力された値を引き継いでいます。
表示を増やすをタップします。

方法のGETをタップします。
使用するHTTPメソッドの一覧が表示されるので、POSTをタップして選択します。

本文を要求はフォームを選択し、+新規フィールドを追加をタップします。
どの種類の値を追加しますか?と聞かれるので、テキストをタップして選択します。

キーとテキストの組み合わせを入力できるようになるので、キー:username、テキスト:【あなたの名前】を入力します。
さらに2回新規フィールドを追加し、(キー:stepdate、テキスト:2021/10/13 10:11:12)と(キー:stepcount、テキスト:10)を入力します。
入力完了したらネットワークのボックスの下の+をタップします。
歩数収集APIの実行結果を確認するため、戻り値をアラートとして表示できるようにします。

アクションを選択する画面が表示されるので、スクリプティをタップします。
※Webが表示されたら横の×をタップするとアクションを選択する画面が表示されます。
一覧からアラートを表示をタップします。

スクリプティングのボックスが追加されるので、続けますか?をタップします。
続けますか?の文字を削除して、URLの内容をタップして設定します。
ここで選択できる「URLの内容」はショートカット機能でマジック変数と呼ばれるものです。
先に出てきた「URL」もそうです。
※Appleのホームページより
すべてのショートカットで、各アクションの出力をマジック変数として使用できます。 手動変数(後述)とは異なり、マジック変数はアクションの出力をあとで使用するために保存する必要がありません。 アクションの出力を選択するだけで、変数として後続のアクションで使用できます。
https://support.apple.com/ja-jp/guide/shortcuts/apdd2b316022/ios

右上の次へをタップ
ショートカット名に 歩数をアップロードと入力して右上の完了をタップします。

すべてのショートカットに追加されたことを確認して、右上の・・・をタップします。
アクションを編集する画面が表示されるので、再度右上の・・・をタップします。
詳細が表示されるので、インターネットの横のスライドボタンをスライドして有効化します。
右上の完了をタップします。
アクションを編集する画面が表示されるので、再度右上の完了をタップします 。

それではショートカットを実際に動かしてみます。
歩数をアップロードをタップします。
アラートの最後にOKと表示されたら正常に動作しています。
OKをクリックして終了してください。
※再度ショートカットを起動すると重複エラーとなります。もう一度試したい場合は、POSTのパラメータのうちusernameかstepdateの値を変更してください。
ちゃんと値が登録されたか確認しましょう。
Heroku Postgresに接続して、テーブルの中身も確認します。
【アプリ名】::DATABASE=> select * from step_hist_row;
id | user_name | step_date | step_count
----+-----------+---------------------+------------
1 | tanupapa | 2021-10-12 00:00:00 | 5
2 | tanupapa | 2020-10-13 10:11:12 | 10
(2 行)
【アプリ名】::DATABASE=>ちゃんと書き込めたことが確認できました。
次回はヘルスケアの値を読み込むところを作ってみます。




コメント