2015-04-28 4 views
2

Я пытаюсь получить доступ к HK в приложении iOS. У меня все настроено, или так я думал, правильно. Но когда он запускается, я получаю сообщение об ошибке «- [__ NSArrayI _allowAuthorizationForReadingWithEntitlements:]: непризнанный селектор, отправленный в экземпляр 0x7f99badc54f0», и я не уверен, почему. Я следил за Рей Рендерлихом, и даже его приложение не работает, когда я повторно даю ему право и запускаю его.Swift 1.2 HealthKit

Вот мой код в случае, если кто имеет какие-либо идеи, я пытался просматривал отладки и не могу понять его

import Foundation 
import HealthKit 

class HealthManager { 

let healthKitStore : HKHealthStore = HKHealthStore() 

func authorizeHealthKit(completion: ((success:Bool, error:NSError!) -> Void)!) { 
    // What we want to read 
    let healthKitTypesToRead = Set(arrayLiteral:[ 
     HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBiologicalSex), 
     HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth), 
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex), 
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight), 
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning), 
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned), 
     HKObjectType.workoutType() 
     ]) 
    // What we want to write 
    let healthKitTypesToWrite = Set(arrayLiteral: [ 
     HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBiologicalSex), 
     HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth), 
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex), 
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight), 
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning), 
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned), 
     HKObjectType.workoutType() 
     ]) 

    // Checking if healthkit is available 
    if !HKHealthStore.isHealthDataAvailable() { 
     let error = NSError(domain: "com.mpc.Health", code: 2, userInfo: [NSLocalizedDescriptionKey:"HealthKit is not available in this Device"]) 
     if(completion != nil) 
     { 
      completion(success:false, error:error) 
     } 
     return; 
    } 

    //Requesting the authorization 
    healthKitStore.requestAuthorizationToShareTypes(nil, readTypes: healthKitTypesToRead) { (success, error) -> Void in 
     if(completion != nil) 
     { 
      completion(success:success,error:error) 
     } 
    } 
} 

} 

ответ

2

Для обоих healthKitTypesToRead и healthKitTypesToWrite, вы создаете NSSet, который содержит массив HKObjectTypes. Это должен быть NSSet HKObjectTypes без массива.

Также обратите внимание, что ваш фрагмент кода не использует healthKitTypesToWrite. Если бы это было так, этот набор не должен содержать HKCharacteristicTypes. HealthKit не позволяет приложениям изменять характеристики пользователя, поэтому вы не можете запрашивать авторизацию для записи этих типов (при попытке вызывается исключение).

+0

Спасибо! Скобки испортили все это, вытащили их, и моя проблема была исправлена! – trever

1

Только в случае, если кто-то ищет код, следующие работал для меня

let healthKitTypesToRead = Set(arrayLiteral: 
    HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBiologicalSex)!, 
    HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth)!, 
    HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex)!, 
    HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight)!, 
    HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)!, 
    HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)!, 
    HKObjectType.workoutType() 
)