9593


iOS8で、HealthKitを使って開発をしております。  
基本的なHealthKitでの読み込み等は実装がうまく出来ました。

そこで、権限が許可されているかどうかの処理を入れるために、  
HKHealthStore.authorizationStatusForType  
を使って、許可されているかどうかのチェックを行い、処理を分岐しようと考えています。

ただ、HKHealthStore.authorizationStatusForTypeの返却値が、  
端末の[設定]＞[プライバシー]＞[ヘルスケア]の設定を変更しても、変わらずに"SharingDenied"が返ってきてしまいます。

何か、根本的に勘違いをしている箇所等ございましたら、ご指摘頂けますと幸いです。

下記のrequestAuthorization() をViewControllerのviweWillAppearで呼び出してチェックしています。

[code]

    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) )
    }
    
[/code]

以下が実行した結果になります。  
■端末の[設定]＞[プライバシー]＞[ヘルスケア]の設定で許可にした場合

[code]

    Success!
    isHealthDataAvailable true
    stepCountStatus
    SharingAuthorized=false
    SharingDenied=true
    NotDetermined=false
    flightsClimbedStatus
    SharingAuthorized=false
    SharingDenied=true
    NotDetermined=false
    
[/code]

■端末の[設定]＞[プライバシー]＞[ヘルスケア]の設定で許可をはずした場合

[code]

    Success!
    isHealthDataAvailable true
    stepCountStatus
    SharingAuthorized=false
    SharingDenied=true
    NotDetermined=false
    flightsClimbedStatus
    SharingAuthorized=false
    SharingDenied=true
    NotDetermined=false
    
[/code]

xcode6.3  
swift1.2  
で実装をしております。

宜しくお願い致します。


CC BY-SA 3.0
2015-04-27T04:52:42.430
9584
2015-06-28T00:35:54.677
2015-06-28T00:35:54.677
8000
8755
question
swift ios8 health-kit
swiftのHealthKitでHKHealthStore.authorizationStatusForTypeの挙動について


> This method checks the authorization status for saving data.

とあるとおり、`HKAuthorizationStatus`が示すのは書き込みの権限だけです。

読み取りの権限についてはプライバシー保護の観点から、読み取りが許可されてるどうかの状態も開発者にはわからないようになっています。

読み取りが許可されてない場合にデータを読み出そうとすると、単にデータが無いときと同じ状態が返されるようになっています。

<https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HKHealthStore_Class/index.html#//apple_ref/occ/instm/HKHealthStore/authorizationStatusForType>:

> To help prevent possible leaks of sensitive health information, your app
> cannot determine whether or not a user has granted permission to read data.
> If you are not given permission, it simply appears as if there is no data of
> the requested type in the HealthKit store. If your app is given share
> permission but not read permission, you see only the data that your app has
> written to the store. Data from other sources remains hidden.


CC BY-SA 3.0
2015-04-27T08:30:01.917
9593
2015-04-27T08:30:01.917
5519
9584
answer