HeathKitがユーザーのデータの読み取りを許可されているかどうかを確認したいのですが、ワークアウトのセグエが許可されている場合は、アラートを表示しません。しかし、requestAuthorizationToShareTypesは常にtrueを返すように見えますか?ユーザーが私を承認したかどうかの参照を取得するにはどうすればよいですか?
override func viewDidLoad() {
super.viewDidLoad()
//1. Set the types you want to read from HK Store
let healthKitTypesToRead: [AnyObject?] = [
HKObjectType.workoutType()
]
//2. If the store is not available (for instance, iPad) return an error and don't go on.
if !HKHealthStore.isHealthDataAvailable() {
let error = NSError(domain: "com.myndarc.myrunz", code: 2, userInfo: [NSLocalizedDescriptionKey: "HealthKit is not available in this Device"])
print(error)
let alertController = UIAlertController(title: "HealthKit Not Available", message: "It doesn't look like HealthKit is available on your device.", preferredStyle: .Alert)
presentViewController(alertController, animated: true, completion: nil)
let ok = UIAlertAction(title: "Ok", style: .Default, handler: { (action) -> Void in })
alertController.addAction(ok)
}
//3. Request Healthkit Authorization
let sampleTypes = Set(healthKitTypesToRead.flatMap { $0 as? HKSampleType })
healthKitStore.requestAuthorizationToShareTypes(sampleTypes, readTypes: nil) {
(success, error) -> Void in
if success {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.performSegueWithIdentifier("segueToWorkouts", sender: nil)
});
} else {
print(error)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.showHKAuthRequestAlert()
});
}
}
}
または、authorizationStatusForTypeを試し、その列挙値をオンにしましたが、常に許可されているという同じ問題がありました。
このコンテキストでsuccess
フラグが何を意味するかを誤解しています。 success
がtrueの場合、それはiOSがヘルスキットへのアクセスについてユーザーに正常に要求したことを意味します。彼らがその質問に「はい」で答えたという意味ではありません。
彼らが「はい/いいえ」と言ったかどうかを判断するには、より具体的にして、関心のある特定の種類のデータを読み書きする権限があるかどうかをヘルスキットに尋ねる必要があります。Apple = HealthKitのドキュメント:
承認をリクエストすると、アプリはHealthKitストアにアクセスできるようになります。アプリにデータ型を共有する権限がある場合、その型のサンプルを作成して保存できます。サンプルを保存する前に、authorizationStatusForType:を呼び出して、アプリにデータを共有する権限があることを確認する必要があります。
注:
authorizationStatus
は、書き込みのみを行い、読み取りは行わないアクセスステータスを決定します。アプリに読み取りアクセス権があるかどうかを知るオプションはありません。参考までに、 https://stackoverflow.com/a/29128231/1996294
HealthKitStore
で権限アクセスをリクエストして確認する例を次に示します。
// Present user with items we need permission for in HealthKit
healthKitStore.requestAuthorization(toShare: typesToShare, read: typesToRead, completion: { (userWasShownPermissionView, error) in
// Determine if the user saw the permission view
if (userWasShownPermissionView) {
print("User was shown permission view")
// ** IMPORTANT
// Check for access to your HealthKit Type(s). This is an example of using BodyMass.
if (self.healthKitStore.authorizationStatus(for: HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bodyMass)!) == .sharingAuthorized) {
print("Permission Granted to Access BodyMass")
} else {
print("Permission Denied to Access BodyMass")
}
} else {
print("User was not shown permission view")
// An error occurred
if let e = error {
print(e)
}
}
})
現在、ユーザーが健康データを読み取る権限を付与しているかどうかをアプリが判断する方法はありません。
以下はApple from authorizationStatus(for:) :からの説明です。
機密性の高い健康情報の漏洩を防ぐために、アプリはユーザーがデータの読み取りを許可したかどうかを判断できません。許可が与えられていない場合は、HealthKitストアに要求されたタイプのデータがないように見えます。アプリに共有権限が付与されているが読み取り権限が付与されていない場合、アプリがストアに書き込んだデータのみが表示されます。他のソースからのデータは非表示のままです。