swiftのHealthKitでHKHealthStore.authorizationStatusForTypeの挙動について
iOS8で、HealthKitを使って開発をしております。
基本的なHealthKitでの読み込み等は実装がうまく出来ました。
そこで、権限が許可されているかどうかの処理を入れるために、
HKHealthStore.authorizationStatusForType
を使って、許可されているかどうかのチェックを行い、処理を分岐しようと考えています。
ただ、HKHealthStore.authorizationStatusForTypeの返却値が、
端末の[設定]>[プライバシー]>[ヘルスケア]の設定を変更しても、変わらずに"SharingDenied"が返ってきてしまいます。
何か、根本的に勘違いをしている箇所等ございましたら、ご指摘頂けますと幸いです。
下記のrequestAuthorization() をViewControllerのviweWillAppearで呼び出してチェックしています。
override func viewWillAppear(animated: Bool) {
if(self.healthWeek.isAuthorization()) {
// データ取得処理など
}else{
self. requestAuthorization()
}
}
func requestAuthorization() {
// 読み込みを許可する型.
let typeOfRead = [
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount),
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierFlightsClimbed)
]
let typeOfReads = NSSet(array: typeOfRead)
// 書き込みを許可する型.
let typeOfWrite = []
let typeOfWrites = NSSet(array: typeOfWrite as [AnyObject])
// HealthStoreへのアクセス承認をおこなう.
self.myHealthStore.requestAuthorizationToShareTypes(typeOfWrites as Set<NSObject>, readTypes: typeOfReads as Set<NSObject>, completion: {
(success: Bool, error: NSError!) in
if success {
println("Success!")
} else {
println("Error!")
}
})
}
/*
* HealthStoreの共有領域にアクセスする権限があるかを確認します
* @return true:あり
*/
func isAuthorization() -> Bool {
println("isHealthDataAvailable \(HKHealthStore.isHealthDataAvailable())")
let stepCountStatus = self.myHealthStore.authorizationStatusForType(HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount))
let flightsClimbedStatus = self.myHealthStore.authorizationStatusForType(HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierFlightsClimbed))
println("stepCountStatus")
println("SharingAuthorized=\(stepCountStatus == .SharingAuthorized)")
println("SharingDenied=\(stepCountStatus == .SharingDenied)")
println("NotDetermined=\(stepCountStatus == .NotDetermined)")
println("flightsClimbedStatus")
println("SharingAuthorized=\(flightsClimbedStatus == .SharingAuthorized)")
println("SharingDenied=\(flightsClimbedStatus == .SharingDenied)")
println("NotDetermined=\(flightsClimbedStatus == .NotDetermined)")
return ( (stepCountStatus == .SharingAuthorized) && (flightsClimbedStatus == .SharingAuthorized) )
}
以下が実行した結果になります。
■端末の[設定]>[プライバシー]>[ヘルスケア]の設定で許可にした場合
Success!
isHealthDataAvailable true
stepCountStatus
SharingAuthorized=false
SharingDenied=true
NotDetermined=false
flightsClimbedStatus
SharingAuthorized=false
SharingDenied=true
NotDetermined=false
■端末の[設定]>[プライバシー]>[ヘルスケア]の設定で許可をはずした場合
Success!
isHealthDataAvailable true
stepCountStatus
SharingAuthorized=false
SharingDenied=true
NotDetermined=false
flightsClimbedStatus
SharingAuthorized=false
SharingDenied=true
NotDetermined=false
xcode6.3
swift1.2
で実装をしております。
宜しくお願い致します。