iOS8 应用程序使用 HealthKit 在 Xcode6.0.1 上崩溃

Posted

技术标签:

【中文标题】iOS8 应用程序使用 HealthKit 在 Xcode6.0.1 上崩溃【英文标题】:iOS8 app crashes on Xcode6.0.1 using HealthKit 【发布时间】:2014-10-02 18:27:41 【问题描述】:

我实际上是在尝试将 Apple 的示例代码转换为 swift。

我在开发中心为它创建了一个应用程序和一个 APPID。我检查了 HealthKit 的权利(IAP 和 GC 的权利是灰色的并自动检查)。

当我为其创建的配置文件下载到 Xcode 并进入 Xcode 中的“首选项”并查看我帐户的配置文件时,我可以看到配置文件的名称加上到期日期,然后有一些权利图标。但是我使用 HealthKit 创建的配置文件没有任何图标,只有 2 个默认图标,这是正常的吗:

因为由于某种原因,应用程序在请求授权时崩溃并出现此错误:

2014-10-02 12:16:13.241 SwimFit[549:8824] -[__NSCFConstantString _allowAuthorizationForSharingWithEntitlements:]:无法识别的选择器发送到实例 0x107dc1ce0 2014-10-02 12:16:13.251 SwimFit[549:8824] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFConstantString _allowAuthorizationForSharingWithEntitlements:]:无法识别的选择器发送到实例 0x107dc1ce0”

如果我尝试在设备上运行它,我会得到:

我已经创建了:

    我的应用的 AppId 为 HealthKit 激活了该 AppID 为该 AppID 创建了 Dev 配置文件 已激活 HealthKit 的一般功能 我看到 entitlements.plist 是使用 com.apple.developer.healthkit = yes 创建的 info.plist 确实具有所需功能的 healthkit 值

这次我做的唯一一件奇怪的事情是,当我点击构建/运行某个点时,我让 Xcode 创建了一个 AppID,然后我从 devcenter 获得了它......我不能上传图片,但基本上我以前所有的 AppID 都是以应用程序命名的。这个是因为它是由 xcode 制作的,所以被命名为:Xcode ios App ID com santiapps SwimFit 但它的包标识符是正确的:com.santiapps.SwimFit。开发配置文件也是如此:iOS Team Provisioning Profile: com.santiapps.SwimFit 及其在我的构建设置中的配置文件。最初我有 SwimFit,因为那是应用程序的名称,所以 Xcode 为它创建了一个自动 AppID,并为它创建了一个 ProvProfile。然后我想也许我应该创建 appID 和 provprofile,所以我手动完成并尝试将其命名为 SwimFit2。两者都给出相同的错误。

我还能错过什么?

代码如下:

//1. Add healthstore property

    var healthStore: HKHealthStore? //error if not optionally unwrapped
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
        //2.  Ask for permissions

        if (HKHealthStore.isHealthDataAvailable() == true) 
            self.healthStore = HKHealthStore() //needs to be var for it to work?
            var writeDataTypes = self.dataTypesToWrite()
            var readDataTypes = self.dataTypesToRead()
            self.healthStore!.requestAuthorizationToShareTypes(writeDataTypes, readTypes: readDataTypes, completion:  (success: Bool, error: NSError!) -> Void in
                if (!success) 
                        NSLog("You didn't allow HealthKit to access these read/write data types. In your app, try to handle this error gracefully when a user decides not to provide access. The error was: %@. If you're using a simulator, try it on a device.", error)
                    return
                     else 
                        NSLog("success")
                    
                // Handle success in your app here.
                self.setupHealthStoreForTabBarControllers()
            )
        
        return true
    

这是一个带有屏幕截图的链接:http://youtu.be/BBagkNTpfQA

【问题讨论】:

【参考方案1】:

我昨天也遇到了同样的崩溃。问题是您将数据类型的错误数据类型 (NSString) 放入方法中。

requestAuthorizationToShareTypes 方法要求您传递一组 HKBaseType 对象,在我的例子中是 HKQuantityType 对象。

所以而不是:

[_healthStore requestAuthorizationToShareTypes:[NSSet setWithObject:HKQuantityTypeIdentifierBodyMassIndex]
                                             readTypes:[NSSet setWithArray:inputDataTypes]
                                            completion:

使用这个:

HKQuantityType* type = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMassIndex];
[_healthStore requestAuthorizationToShareTypes:[NSSet setWithObject:type]
                                             readTypes:[NSSet setWithArray:inputDataTypes]
                                            completion:

【讨论】:

以上是关于iOS8 应用程序使用 HealthKit 在 Xcode6.0.1 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

iOS8在iPad Air上使用HealthKit时如何修复“此设备上的健康数据不可用”

如何使用 HealthKit 后台交付?

有关HealthKit的那些事

提交到应用商店时出现 UIRequiredDeviceCapabilities 错误

iOS8 新特性

从另一个应用程序打开 HealthKit 应用程序