banner
Vinking

Vinking

你写下的每一个BUG 都是人类反抗被人工智能统治的一颗子弹

ブログにAppleのフィットネス記録を同期する

前言#

Shiro テーマには 「個人状態表示」 機能があり、カスタマイズされた状態を表示できます。

この機能を最大限に活用するために、スマートフォンのフィットネスリングのデータを個人状態に同期して表示したいと思います。効果は以下の通りです:

効果図

最初は JavaScript スクリプトを作成し、Scriptable アプリを利用してこのアイデアを実現する予定でした。しかし、試してみた結果、Scriptable は HealthKit をサポートしておらず、健康データを取得できないことがわかりました。Apple デバイスでは、アプリが HealthKit の API を通じて健康データにアクセスする必要がありますが、Scriptable は HealthKit を統合しようとしましたが、Apple ストアに拒否されました。したがって、代わりに Apple のショートカットを使用してこの機能を実現することにしました。

状態表示の設定#

手動で個人状態表示を設定することで、コンソールに POST メソッドで https://{バックエンドサーバー}/api/v2/serverless/shiro/status にリクエストを送信したことが表示されます:

個人状態表示リクエスト

リクエストのリクエストボディには、以下の形式の JSON が含まれています:

{
	"emoji": "😴", // アバターの右下角の Emoji
	"desc": "消費0キロカロリー 運動0分 立っている0時間", // 展開された説明
	"ttl": 60 // 状態の持続時間、単位は秒
}

個人状態を更新する操作を完了するためには、まずアクセストークンを取得し、リクエストヘッダー Authorization: bearer {token} を構築してユーザー権限を検証する必要があります。

アクセストークンを取得する方法は二つあります。第一の方法は、状態を設定する前にログインリクエストを発行し、ログインリクエストの返却された JSON から xxxxx.xxxxxxxx 形式のアクセストークンを取得することです。

もう一つの方法は、バックエンドの 設定 -> セキュリティ -> API トークン で新しい xxxxxxxxxxxxxx 形式のアクセストークンを作成することです。この方法をお勧めします。

アクセストークンを取得した後、コンソールで検証します:

const token = "xxxxxxxxx";
fetch("https://server.vinking.top/api/v2/serverless/shiro/status", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: token,
  },
  body: JSON.stringify({
    emoji: "✌️",
    desc: "テスト",
    ttl: 60,
  }),
})
  .then((response) => {
    if (response.ok) {
      return response.text().then(() => {
        console.log(`ユーザー状態設定成功、状態コード: ${response.status}`);
      });
    }
  })
  .catch((error) => console.error("ユーザー状態設定エラー:", error));

状態が正常に設定されました。

設定成功

ショートカットの設計#

健康データを自動的に個人状態表示に同期するためには、健康データを取得し、リクエストを構築し、API を呼び出すショートカットを設計する必要があります。設計の考え方は以下の通りです:

考え方

フローチャートをショートカットに変換する過程で、いくつか注意すべきポイントがあります:

  1. 特定のデータがその日に記録されていない場合(運動していないなど)、ショートカットは空の値を返し、0 ではありません。後続の説明文の結合に問題が発生しないように、事前に初期値 0 を設定する必要があります。
  2. データを Apple 健康のフィットネス記録パネルのデータと一致させたい場合、「立っている x 時間」(Stand Hours)の統計方法に特に注意が必要です。これは達成回数を反映しており、実際の立っている時間ではありません。計算ロジックは次の通りです:各時間内に、累積立っている時間が 1 分以上に達した場合、1 時間の達成と見なされます。例えば、08:00 - 08:01 に立っている、09:30 - 09:31 に立っている場合、2 時間の達成として記録されます。それに対して、ショートカットが取得する「立っている分数」(Stand Time)は、各立っている時間の実際の分数です。したがって、「立っている x 時間」を統計するには、カウントの方法で各時間が達成されたかどうかを統計する必要があり、立っている分数を直接加算するのではありません。指示は次のように表現されます:

達成回数の統計

  1. インターフェースが状態を正常に設定した場合、204 状態コードのみを返し、何も返さないため、ショートカット自体が HTTP 状態コードを直接詳細に判断することをサポートしていないため、返されたファイルのサイズが 0 であるかどうかを判断することで設定が成功したかどうかを確認する必要があります。

ショートカットが非常に長いため、最初にショートカットを示します:

ショートカットの完全なフローは以下の通りです(超長い画像警告):

::: masonry
image
:::

この記事は Mix Space によって xLog に同期更新されました
元のリンクは https://www.vinking.top/posts/codes/sync-fitness-records-to-blog-status


読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。