Xamarin.iOS の HealthKit

Health Kit には、ユーザーの正常性関連情報のためのセキュリティで保護されたデータストアが用意されています。 Health Kit アプリは、ユーザーの明示的なアクセス許可があれば、このデータストアの読み取りと書き込みを行い、関連データが追加されたときに通知を受け取ることができます。 アプリでこのデータを表示できます。また、ユーザーは Apple が提供する正常性アプリを使ってすべてのデータのダッシュボードを表示できます。

健康関連のデータは非常に機密性が高く重要であるため、Health Kit は厳密に型指定され、測定単位と、記録される情報の種類 (たとえば、血糖値や心拍数) との明示的な関連付けがあります。 さらに、Health Kit アプリは明示的な権利を使用する必要があり、特定の種類の情報へのアクセスを要求する必要があります。また、ユーザーはアプリにこれらの種類のデータへのアクセス権を明示的に付与する必要があります。

この記事では、以下について説明します。

  • Health Kit のセキュリティ要件(アプリケーションのプロビジョニングや Health Kit データベースへのアクセス許可の要求を含む)。
  • ヘルスキットのタイプシステム。データの誤適用や誤解釈の可能性を最小限に抑えます。
  • 共有のシステム全体の Health Kit データストアへの書き込み。

この記事では、データベースのクエリ、測定単位間の変換、新しいデータの通知の受信など、より高度なトピックについては説明しません。

この記事では、ユーザーの心拍数を記録するサンプル アプリケーションを作成します。

A sample application to record the users heart rate

要件

この記事で説明する手順を完了するには、次のものが必要です。

  • Xcode 7 および iOS 8 (またはそれ以上) – Apple の最新の Xcode および iOS API を開発者のコンピューターにインストールして構成する必要があります。
  • Visual Studio for Mac または Visual Studio – 最新バージョンの Visual Studio for Mac を開発者のコンピューターにインストールして構成する必要があります。
  • iOS 8 (またはそれ以上) デバイス – テスト用に最新バージョンの iOS 8 以降を実行している iOS デバイス。

重要

ヘルスキットはiOS 8で導入されました。 現在、正常性キットは iOS シミュレーターでは使用できません。デバッグには物理 iOS デバイスへの接続が必要です。

Health Kit アプリの作成とプロビジョニング

Xamarin iOS 8 アプリケーションで HealthKit API を使用するには、事前に適切に構成してプロビジョニングする必要があります。 このセクションでは、Xamarin アプリケーションを適切にセットアップするために必要な手順について説明します。

Health Kit アプリには次のものが必要です。

  • 明示的な アプリ ID
  • その明示的なアプリ IDHealth Kit のアクセス許可に関連付けられているプロビジョニング プロファイル
  • Entitlements.plistのプロパティBooleancom.apple.developer.healthkit 〘に設定されている YesAn。
  • Info.plist値をUIRequiredDeviceCapabilities持つStringhealthkitエントリがキーに含まれているユーザー。
  • また、 Info.plist 適切なプライバシーの説明エントリ String が必要です。アプリがデータを書き込む場合はキー NSHealthUpdateUsageDescription の説明、 String アプリが Health Kit データを読み取る場合はキー NSHealthShareUsageDescription の説明です。

iOS アプリのプロビジョニングの詳細については、Xamarin の概要シリーズの Device Provisioning に関する記事で、開発者証明書、アプリ ID、プロビジョニング プロファイル、アプリエンタイトルメントの関係について説明しています。

明示的なアプリ ID とプロビジョニング プロファイル

明示的なアプリ ID と適切なプロビジョニング プロファイルの作成は、Apple の iOS デベロッパー センター内で行われます。

現在のアプリ ID は、デベロッパー センターの [証明書]、[識別子]、[プロファイル] セクションの一覧に表示されます。 多くの場合、この一覧には ID 値が*表示され、任意の数のサフィックスでアプリ ID - 名を使用できることを示します。 このようなワイルドカードアプリ ID は Health Kit では使用できません。

明示的なアプリ ID を作成するには、右上のボタンをクリックして + [iOS アプリ ID の登録] ページに移動します。

Registering an app on the Apple Developer Portal

上の図に示すように、アプリの説明を作成した後、明示的なアプリ ID セクションを使用して、アプリケーションの ID を作成します。 [App Services] セクションで、[サービスの有効化] セクションの [正常性キット] をチェックします。

完了したら、[続行] ボタンを押して、アカウントにアプリ ID を登録します。 [証明書、識別子、プロファイル] ページに戻ります。 [プロビジョニング プロファイル] をクリックして現在のプロビジョニング プロファイルの一覧に移動し、右上隅にあるボタンをクリックして + [iOS プロビジョニング プロファイル追加] ページに移動します。 [iOS アプリ開発] オプションを選択し、[続行] をクリックして [アプリ ID の選択] ページに移動します ここで、前に指定した明示的な アプリ ID を 選択します。

Select the explicit App ID

[続行] をクリックし、再メイン画面で、開発者証明書、デバイス、およびこのプロビジョニング プロファイル名前を指定します。

Generating the Provisioning Profile

[生成] をクリックし、プロファイルの作成を待機します。 ファイルをダウンロードし、ダブルクリックして Xcode にインストールします。 Xcode > Preferences Accounts >> View Details...でインストールを確認できます。インストール済みのプロビジョニング プロファイルが表示され、Health Kit とその他の特別なサービスのアイコンが [エンタイトルメント] 行に表示されます。

Viewing the profile in Xcode

アプリ ID とプロビジョニング プロファイルと Xamarin.iOS アプリの関連付け

説明に従って適切な プロビジョニング プロファイル を作成してインストールしたら、通常は Visual Studio for Mac または Visual Studio でソリューションを作成します。 Health Kit のアクセスは、任意の iOS C# または F# プロジェクトで使用できます。

Xamarin iOS 8 プロジェクトを手動で作成するプロセスを説明するのではなく、この記事に添付されているサンプル アプリ (事前構築済みのストーリーボードとコードを含む) を開きます。 サンプル アプリを Health Kit 対応プロビジョニング プロファイルに関連付けるには、Solution Padプロジェクトを右クリックし、その [オプション] ダイアログを表示します。 iOS アプリケーション パネルに切り替え、前に作成した明示的なアプリ ID をアプリのバンドル識別子として入力します。

Enter the explicit App ID

次に、 iOS バンドル署名 パネルに切り替えます。 最近インストールしたプロビジョニング プロファイルと、明示的なアプリ ID との関連付けを使用して、プロビジョニング プロファイルとして使用できるようになります。

Select the Provisioning Profile

プロビジョニング プロファイルが使用できない場合は、iOS アプリケーション パネルでバンドル識別子をダブルチェックします。iOS デベロッパー センター指定されている場合と、プロビジョニング プロファイルがインストールされていること (Xcode > Preferences > アカウント ビュー>の詳細...)。

ヘルス キット対応プロビジョニング プロファイルが選択されている場合は、[OK] をクリックして [プロジェクト オプション] ダイアログを閉じます。

Entitlements.plist と Info.plist の値

サンプル アプリには、すべてのプロジェクト テンプレートに Entitlements.plist 含まれていないファイル (Health Kit 対応アプリに必要) が含まれています。 プロジェクトに権利が含まれていない場合は、プロジェクトを右クリックし、[File > New File... > iOS > Entitlements.plist] を選択して手動で追加します。

最終的には、 Entitlements.plist 次のキーと値のペアが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.developer.HealthKit</key>
    <true/>
</dict>
</plist>

同様に、アプリの Info.plisthealthkit はキーに関連付 UIRequiredDeviceCapabilities けられている必要があります。

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
    <string>healthkit</string>
</array>

この記事で提供されるサンプル アプリケーションには、必要なすべてのキーを含む構成済 Entitlements.plist みのものが含まれています。

プログラミングヘルスキット

Health Kit データストアは、アプリ間で共有されるプライベートなユーザー固有のデータストアです。 正常性情報は非常に機密性が高いため、ユーザーはデータ アクセスを許可するために肯定的な手順を実行する必要があります。 このアクセスは部分的なアクセス (書き込みでも読み取りではなく、一部の種類のデータにはアクセスできますが、他のデータにはアクセスできない) 可能性があり、いつでも取り消される可能性があります。 Health Kit アプリケーションは、多くのユーザーが自分の健康関連の情報を格納することをためらうという理解を持って、防御的に記述する必要があります。

Health Kit のデータは、Apple で指定された種類に制限されます。 これらの型は厳密に定義されています。血液型など、Apple が提供する列挙体の特定の値に制限されているものもあれば、大きさと測定単位 (グラム、カロリー、リットルなど) を組み合わせたものがあります。 互換性のある測定単位を共有するデータは、そのHKObjectType単位によって区別されます。たとえば、型システムは、両方が測定単位を使用しているにもかかわらず、フィールドにHKQuantityTypeIdentifier.FlightsClimbed値を格納HKQuantityTypeIdentifier.NumberOfTimesFallenしようとする誤った試行をHKUnit.Countキャッチします。

Health Kit データストアに格納できる型は、すべて HKObjectType. HKCharacteristicType オブジェクトは、生物学的性別、血液型、および生年月日を格納します。 ただし、より一般的なのは HKSampleType 、特定の時間または一定期間にわたってサンプリングされるデータを表すオブジェクトです。

HKSampleType objects chart

HKSampleType は抽象であり、4 つの具象サブクラスを持っています。 現在、スリープ分析であるデータの HKCategoryType 種類は 1 つだけです。 Health Kit のデータの大部分は種類 HKQuantityType が多く、そのデータをオブジェクトに HKQuantitySample 格納します。これは、使い慣れたファクトリ設計パターンを使用して作成されます。

The large majority of data in Health Kit are of type HKQuantityType and store their data in HKQuantitySample objects

HKQuantityType 型の範囲は次 HKQuantityTypeIdentifier.ActiveEnergyBurned の値です HKQuantityTypeIdentifier.StepCount

ユーザーにアクセス許可を要求する

エンド ユーザーは、アプリで Health Kit データの読み取りまたは書き込みを行えるように、肯定的な手順を実行する必要があります。 これは、iOS 8 デバイスにプレインストールされている Health アプリを介して行われます。 Health Kit アプリを初めて実行すると、ユーザーにシステム制御 の正常性アクセス ダイアログが表示されます。

The user is presented with a system-controlled Health Access dialog

後で、ユーザーは Health アプリの [ソース ] ダイアログを使用してアクセス許可を変更できます。

The user can change permissions using Health apps Sources dialog

正常性情報は非常に機密性が高いため、アプリ開発者は、アプリの実行中にアクセス許可が拒否され、変更されることを期待して、プログラムを防御的に記述する必要があります。 最も一般的なイディオムは、メソッドでアクセス許可を UIApplicationDelegate.OnActivated 要求し、必要に応じてユーザー インターフェイスを変更することです。

アクセス許可のチュートリアル

Health Kit でプロビジョニングされたプロジェクトで、ファイルを AppDelegate.cs 開きます。 ステートメントでは、ファイルの先頭にある ;を使用 HealthKitしていることに注意してください。

次のコードは、Health Kit のアクセス許可に関連しています。

private HKHealthStore healthKitStore = new HKHealthStore ();

public override void OnActivated (UIApplication application)
{
        base.OnActivated(application);
        ValidateAuthorization ();
}

private void ValidateAuthorization ()
{
        var heartRateId = HKQuantityTypeIdentifierKey.HeartRate;
        var heartRateType = HKObjectType.GetQuantityType (heartRateId);
        var typesToWrite = new NSSet (new [] { heartRateType });
        var typesToRead = new NSSet ();
        healthKitStore.RequestAuthorizationToShare (
                typesToWrite, 
                typesToRead, 
                ReactToHealthCarePermissions);
}

void ReactToHealthCarePermissions (bool success, NSError error)
{
        var access = healthKitStore.GetAuthorizationStatus (HKObjectType.GetQuantityType (HKQuantityTypeIdentifierKey.HeartRate));
        if (access.HasFlag (HKAuthorizationStatus.SharingAuthorized)) {
                HeartRateModel.Instance.Enabled = true;
        } else {
                HeartRateModel.Instance.Enabled = false;
        }
}

これらのメソッド内のすべてのコードはインラインで OnActivated実行できますが、サンプル アプリでは、意図をより ValidateAuthorization() 明確にするために個別のメソッドを使用します。書き込まれる特定の型へのアクセスを要求するために必要な手順 (アプリが必要な場合は読み取り) と ReactToHealthCarePermissions() 、ユーザーが Health.app のアクセス許可ダイアログを操作した後にアクティブ化されるコールバックです。

そのジョブ ValidateAuthorization() は、アプリが HKObjectTypes 書き込むセットをビルドし、そのデータを更新するための承認を要求することです。 サンプル アプリでは、 HKObjectType キー KHQuantityTypeIdentifierKey.HeartRate用です。 この型はセット typesToWriteに追加されますが、セット typesToRead は空のままです。 これらのセットとコールバックへのReactToHealthCarePermissions()参照が .HKHealthStore.RequestAuthorizationToShare()

コールバックは ReactToHealthCarePermissions() 、ユーザーがアクセス許可ダイアログを操作した後に呼び出され、2 つの情報 bool が渡されます true 。ユーザーがアクセス許可ダイアログを操作した場合の値と NSError 、null 以外の場合は、アクセス許可ダイアログの表示に関連する何らかのエラーを示します。

重要

この関数の引数について明確にするために、 成功 パラメーターと エラー パラメーターは、ユーザーが Health Kit データへのアクセス許可を付与したかどうかを示すものではありません。 ユーザーにデータへのアクセスを許可する機会が与えられていることを示すだけです。

アプリがデータにアクセスできるかどうかを確認するために、 HKHealthStore.GetAuthorizationStatus() そのデータが使用され、渡されます HKQuantityTypeIdentifierKey.HeartRate。 返された状態に基づいて、アプリはデータを入力する機能を有効または無効にします。 アクセス拒否に対処するための標準的なユーザー エクスペリエンスはなく、多くのオプションが考えられます。 このサンプル アプリでは、状態がシングルトン オブジェクトに HeartRateModel 設定され、関連するイベントが発生します。

モデル、ビュー、コントローラー

シングルトン オブジェクトを HeartRateModel 確認するには、ファイルを HeartRateModel.cs 開きます。

using System;
using HealthKit;
using Foundation;

namespace HKWork
{
        public class GenericEventArgs<T> : EventArgs
        {
                public T Value { get; protected set; }
                public DateTime Time { get; protected set; }

                public GenericEventArgs (T value)
                {
                        this.Value = value;
                        Time = DateTime.Now;
                }
        }

        public delegate void GenericEventHandler<T> (object sender,GenericEventArgs<T> args);

        public sealed class HeartRateModel : NSObject
        {
                private static volatile HeartRateModel singleton;
                private static object syncRoot = new Object ();

                private HeartRateModel ()
                {
                }

                public static HeartRateModel Instance {
                        get {
                                //Double-check lazy initialization
                                if (singleton == null) {
                                        lock (syncRoot) {
                                                if (singleton == null) {
                                                        singleton = new HeartRateModel ();
                                                }
                                        }
                                }

                                return singleton;
                        }
                }

                private bool enabled = false;

                public event GenericEventHandler<bool> EnabledChanged;
                public event GenericEventHandler<String> ErrorMessageChanged;
                public event GenericEventHandler<Double> HeartRateStored;

                public bool Enabled { 
                        get { return enabled; }
                        set {
                                if (enabled != value) {
                                        enabled = value;
                                        InvokeOnMainThread(() => EnabledChanged (this, new GenericEventArgs<bool>(value)));
                                }
                        }
                }

                public void PermissionsError(string msg)
                {
                        Enabled = false;
                        InvokeOnMainThread(() => ErrorMessageChanged (this, new GenericEventArgs<string>(msg)));
                }

                //Converts its argument into a strongly-typed quantity representing the value in beats-per-minute
                public HKQuantity HeartRateInBeatsPerMinute(ushort beatsPerMinute)
                {
                        var heartRateUnitType = HKUnit.Count.UnitDividedBy (HKUnit.Minute);
                        var quantity = HKQuantity.FromQuantity (heartRateUnitType, beatsPerMinute);

                        return quantity;
                }
                        
                public void StoreHeartRate(HKQuantity quantity)
                {
                        var bpm = HKUnit.Count.UnitDividedBy (HKUnit.Minute);
                        //Confirm that the value passed in is of a valid type (can be converted to beats-per-minute)
                        if (! quantity.IsCompatible(bpm))
                        {
                                InvokeOnMainThread(() => ErrorMessageChanged(this, new GenericEventArgs<string> ("Units must be compatible with BPM")));
                        }

                        var heartRateId = HKQuantityTypeIdentifierKey.HeartRate;
                        var heartRateQuantityType = HKQuantityType.GetQuantityType (heartRateId);
                        var heartRateSample = HKQuantitySample.FromType (heartRateQuantityType, quantity, new NSDate (), new NSDate (), new HKMetadata());

                        using (var healthKitStore = new HKHealthStore ()) {
                                healthKitStore.SaveObject (heartRateSample, (success, error) => {
                                        InvokeOnMainThread (() => {
                                                if (success) {
                                                        HeartRateStored(this, new GenericEventArgs<Double>(quantity.GetDoubleValue(bpm)));
                                                } else {
                                                        ErrorMessageChanged(this, new GenericEventArgs<string>("Save failed"));
                                                }
                                                if (error != null) {
                                                        //If there's some kind of error, disable 
                                                        Enabled = false;
                                                        ErrorMessageChanged (this, new GenericEventArgs<string>(error.ToString()));
                                                }
                                        });
                                });
                        }
                }
        }
}

最初のセクションは、汎用イベントとハンドラーを作成するための定型コードです。 クラスの最初の HeartRateModel 部分は、スレッド セーフなシングルトン オブジェクトを作成するための定型句でもあります。

次に、 HeartRateModel 3 つのイベントを公開します。

  • EnabledChanged - 心拍数ストレージが有効または無効になっていることを示します (ストレージは最初に無効になっていることに注意してください)。
  • ErrorMessageChanged - このサンプル アプリでは、非常に単純なエラー処理モデル (最後のエラーを含む文字列) があります。
  • HeartRateStored - 心拍数が Health Kit データベースに格納されたときに発生します。

これらのイベントが発生するたびに、サブスクライバーが UI を更新できるように、イベントが実行 NSObject.InvokeOnMainThread()されることに注意してください。 また、イベントはバックグラウンド スレッドで発生していると文書化し、互換性を確保する責任をハンドラーに任せる可能性があります。 アクセス許可要求などの多くの関数は非同期であり、メイン以外のスレッドでコールバックを実行するため、Health Kit アプリケーションではスレッドに関する考慮事項が重要です。

Heath Kit 固有の HeartRateModel コードは、2 つの関数 HeartRateInBeatsPerMinute()StoreHeartRate().

HeartRateInBeatsPerMinute() は、その引数を厳密に型指定された Health Kit HKQuantityに変換します。 数量の種類は、数量で HKQuantityTypeIdentifierKey.HeartRate 指定され、数量の単位が除算されます HKUnit.CountHKUnit.Minute (つまり、単位は 1 分あたりのビート数です)。

この関数は StoreHeartRate() (サンプル アプリでは、作成されたものHeartRateInBeatsPerMinute()) を受け取りますHKQuantity。 データを検証するために、このメソッドを HKQuantity.IsCompatible() 使用します。このメソッドは、オブジェクトの単位を引数の単位に変換できるかどうかを返 true します。 これで数量が作成 HeartRateInBeatsPerMinute() された場合は明らかに戻 trueりますが、数量が作成された場合も返 true されます(例: Beats Per Hour)。 より一般的には、 HKQuantity.IsCompatible() 質量、距離、エネルギーを検証するために使用できます。これは、ユーザーまたはデバイスが 1 つの測定システム (インペリアル単位など) で入力または表示する可能性がありますが、別のシステム (メトリック単位など) に格納される可能性があります。

数量の互換性が検証されると、ファクトリ メソッドを HKQuantitySample.FromType() 使用して厳密に型指定されたオブジェクトが heartRateSample 作成されます。 HKSample オブジェクトには開始日と終了日があります。瞬時読み取りの場合、これらの値は例のように同じである必要があります。 このサンプルでは、引数に HKMetadata キー値データも設定しませんが、次のコードなどのコードを使用してセンサーの場所を指定することもできます。

var hkm = new HKMetadata();
hkm.HeartRateSensorLocation = HKHeartRateSensorLocation.Chest;

heartRateSample作成されると、コードは using ブロックを使用してデータベースへの新しい接続を作成します。 そのブロック内で、メソッドは HKHealthStore.SaveObject() データベースへの非同期書き込みを試みます。 ラムダ式の結果の呼び出しによって、関連するイベント (または HeartRateStoredErrorMessageChanged.

モデルがプログラミングされたので、コントローラーがモデルの状態を反映する方法を確認します。 ファイル HKWorkViewController.cs を開きます。 コンストラクターは単にシングルトンを HeartRateModel イベント処理メソッドに結び付けます (ここでも、ラムダ式を使用してインラインで行うことができますが、個別のメソッドによって意図が少し明確になります)。

public HKWorkViewController (IntPtr handle) : base (handle)
{
     HeartRateModel.Instance.EnabledChanged += OnEnabledChanged;
     HeartRateModel.Instance.ErrorMessageChanged += OnErrorMessageChanged;
     HeartRateModel.Instance.HeartRateStored += OnHeartBeatStored;
}

関連するハンドラーを次に示します。

void OnEnabledChanged (object sender, GenericEventArgs<bool> args)
{
        StoreData.Enabled = args.Value;
        PermissionsLabel.Text = args.Value ? "Ready to record" : "Not authorized to store data.";
        PermissionsLabel.SizeToFit ();
}

void OnErrorMessageChanged (object sender, GenericEventArgs<string> args)
{
        PermissionsLabel.Text = args.Value;
}

void OnHeartBeatStored (object sender, GenericEventArgs<double> args)
{
        PermissionsLabel.Text = String.Format ("Stored {0} BPM", args.Value);
}

明らかに、単一のコントローラーを持つアプリケーションでは、別のモデル オブジェクトの作成と制御フローのイベントの使用を避けることができますが、モデル オブジェクトの使用は実際のアプリに適しています。

サンプル アプリの実行

iOS シミュレーターはヘルス キットをサポートしていません。 デバッグは、iOS 8 を実行している物理デバイスで行う必要があります。

適切にプロビジョニングされた iOS 8 開発デバイスをシステムに接続します。 Visual Studio for Mac でデプロイ ターゲットとして選択し、メニューから [デバッグの実行>] を選択します。

重要

プロビジョニングに関する間違いは、この時点で表面化します。 エラーのトラブルシューティングを行うには、上記の「Health Kit アプリの作成とプロビジョニング」セクションを確認してください。 コンポーネントは次のとおりです。

  • iOS デベロッパー センター - 明示的なアプリ ID と正常性キットが有効なプロビジョニング プロファイル。
  • プロジェクト オプション - バンドル識別子 (明示的なアプリ ID) & プロビジョニング プロファイル。
  • ソース コード - Entitlements.plist & Info.plist

プロビジョニングが適切に設定されていると仮定すると、アプリケーションが起動します。 メソッド OnActivated に達すると、Health Kit の承認が要求されます。 これがオペレーティング システムによって初めて検出されると、ユーザーに次のダイアログが表示されます。

The user will be presented with this dialog

アプリで心拍数データを更新できるようにすると、アプリが再び表示されます。 コールバックは ReactToHealthCarePermissions 非同期的にアクティブ化されます。 これにより、プロパティが HeartRateModel’sEnabled 変更され、イベントが発生 EnabledChanged し、イベント ハンドラーが HKPermissionsViewController.OnEnabledChanged() 実行され、ボタンが StoreData 有効になります。 次の図は、シーケンスを示しています。

This diagram shows the sequence of events

[記録] ボタンを押します。 これによりハンドラーがStoreData_TouchUpInside()実行され、テキスト フィールドの値をheartRate解析し、前に説明HeartRateModel.HeartRateInBeatsPerMinute()した関数を介して a にHKQuantity変換し、その数量を HeartRateModel.StoreHeartRate(). 前に説明したように、これはデータの格納を試み、イベントまたはErrorMessageChangedイベントをHeartRateStored発生させます。

デバイスの [ホーム] ボタンをダブルクリックし、正常性アプリを開きます。 [ソース] タブをクリックすると、サンプル アプリが一覧表示されます。 これを選択し、心拍数データを更新する権限を禁止します。 [ホーム] ボタンをダブルクリックし、アプリに切り替えます。 もう一度 ReactToHealthCarePermissions() 呼び出されますが、今回はアクセスが拒否されるため、 StoreData ボタンは無効になります (これは非同期的に発生し、ユーザー インターフェイスの変更がエンド ユーザーに表示される可能性があることに注意してください)。

高度なトピック

Health Kit データベースからのデータの読み取りは、データの書き込みとよく似ています。1 つは、アクセスしようとしているデータの種類を指定し、承認を要求します。承認が許可されている場合は、互換性のある測定単位への自動変換を使用してデータを使用できます。

関連するデータが更新されたときに更新を実行する述語ベースのクエリとクエリを可能にする、より高度なクエリ関数がいくつかあります。

Health Kit アプリケーションの開発者は、Apple のアプリ レビュー ガイドラインの Health Kit セクションを確認する必要があります。

セキュリティモデルとタイプシステムモデルが理解されると、共有ヘルスキットデータベースにデータを格納して読み取るのはとても簡単です。 Health Kit 内の関数の多くは非同期的に動作し、アプリケーション開発者はプログラムを適切に記述する必要があります。

この記事の執筆時点では、現在、Android または Windows 電話の Health Kit に相当するものはありません。

まとめ

この記事では、Health Kit を使用して、アプリケーションが正常性に関連する情報を格納、取得、共有できるようにする一方で、ユーザーがこのデータにアクセスして制御できるようにする標準の Health アプリを提供する方法について説明しました。

また、Health Kit を使用する正常性関連の情報とアプリのプライバシー、セキュリティ、およびデータの整合性によって、アプリケーション管理の側面 (プロビジョニング)、コーディング (Health Kit の種類システム)、ユーザー エクスペリエンス (システム ダイアログと正常性アプリによるアクセス許可のユーザー制御) の複雑さの増加に対処する必要があることも確認しました。

最後に、Health Kit ストアにハートビート データを書き込み、非同期対応の設計を備える、付属のサンプル アプリを使用して Health Kit の簡単な実装を見てきました。