Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

Healthデータのアクセス権限チェック

Healthデータのアクセス権限の取得

iOSではHealthデータのアクセス権限の取得にはHKHealthStoreクラスのrequestAuthorization(toShare:read:completion:)メソッドを使います。 Healthデータに書込する権限を取得する場合にはtoShare引数、また、読込権限を取得する場合にはread引数にデータタイプを指定します。

Healthデータへのアクセス権限チェック

書込や読込をする場合、まずはアクセス権限があるのかチェックした後で、実行するというように実装することがあると思います。

HealthKitではアクセス権限チェックのため、HKHealthStoreクラスにauthorizationStatus(for:)メソッドが用意されています。

結果はHKAuthorizationStatus列挙型で返ってきます。

  • notDetermined
  • sharingDenied
  • sharingAuthorized

Healthデータへのアクセス権限チェックの注意点

アクセス権限チェックする際の注意なのですが、上記authorizationStatus(for:)メソッドは下記3つの状態しかチェックできません。

  • まだ許可も拒否もしていない(notDetermined)
  • 書込権限と読込権限の片方しか許可していない(sharingDenied)
  • 書込権限と読込権限の両方を許可しているか(sharingAuthorized)

注意すべきは書込権限だけ許可されている、読込権限だけ許可されているというのがチェックできないことです。

Healthデータの読込が必要なアプリについて

ユーザーに読込権限だけを許可してもらい、authorizationStatus(for:)メソッドを実行した場合、常にsharingDeniedが返されます。authorizationStatus(for:)メソッドでは権限があるのかチェックできないのです。

もし権限がない状態でデータフェッチした場合、どうなるのか?その場合、エラー等発生せず、空配列が返されます。そのため、データが無いのか、権限がないのか区別できません。

Healthデータの読込だけが必要なアプリでの権限チェック対応

下記2つの対応が考えました。他にもあるかもしれません。

  • 対応方法としてはデータフェッチして空配列が返されたら、「権限拒否していませんか?」というアラートなどを表示して、設定画面に遷移させる
  • 読込権限だけが必要であっても、ユーザーに書込権限も許可してもらう。その上で、HKAuthorizationStatusを使って権限チェックする。(必要がない書込権限をユーザーに求めることになるので、AppStoreの審査に通るかは不明です)

Healthデータの書き込みが必要なアプリについて

調べていません。必要になったら調べます。