2

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

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

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

xcode 首选项

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

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”

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

在设备上

我创造了:

  1. 我的应用的 AppId
  2. 为 HealthKit 激活 AppID
  3. 为该 AppID 创建了开发配置文件
  4. 一般激活的 HealthKit 功能
  5. 我看到 entitlements.plist 是用 com.apple.developer.healthkit = yes 创建的
  6. 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

4

1 回答 1

3

我昨天也有同样的崩溃。问题是您将数据类型的错误数据类型 ( 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:
于 2014-11-04T04:05:03.377 回答