提示用户授权应用程序共享 HealthKit 中的类型

Posted

技术标签:

【中文标题】提示用户授权应用程序共享 HealthKit 中的类型【英文标题】:Prompt the user to authorise the application to share types in HealthKit 【发布时间】:2014-09-10 14:43:21 【问题描述】:

当第一次调用 HKHealthStore 中的 requestAuthorizationToShareTypes:readTypes:completion: 时,我希望获得权限的 HKQuantityType 集,我可以看到这个模式视图请求用户授权以读取和共享应用程序可以读取和共享的每种类型的对象需要访问权限。

除了我第一次调用:requestAuthorizationToShareTypes:readTypes:completion: 之外,我正在尝试找出是否有办法提示用户这个模态视图。

我尝试每次都使用相同的集合调用requestAuthorizationToShareTypes:readTypes:completion:,但在第一次调用后它不再提示。在尝试使用不存在的新类型更改集合时,我可以成功提示此屏幕,但我不认为每次在集合中使用新的HKQuantityType 调用此方法是正确的方法(因为那里是存在类型数量的限制)。

有可能吗?

感谢您的任何帮助。

更新

我将添加一些调用的代码sn-p:

 [self.healthStore  requestAuthorizationToShareTypes:writeDataTypes readTypes:readDataTypes completion:^(BOOL success, NSError *error) 
        if (!success) 
            NSLog(@"You didn't allow HealthKit to access these read/write data types. The error was: %@.", error);
            return;
        

        dispatch_async(dispatch_get_main_queue(), ^
            // Update the user interface based on the current user's health information.
        );
    ];

其中writeDataTypeszreadDataTypes 是从以下方法返回的NSSet

// Returns the types of data that I want to write to HealthKit.
- (NSSet *)dataTypesToWrite

    HKQuantityType *heightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
    HKQuantityType *weightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];

    return [NSSet setWithObjects: heightType, weightType, nil];


// Returns the types of data that I want to read from HealthKit.
- (NSSet *)dataTypesToRead

    HKQuantityType *heightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
    HKQuantityType *weightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];
    HKCharacteristicType *birthdayType = [HKCharacteristicType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierDateOfBirth];
    HKCharacteristicType *biologicalSex = [HKCharacteristicType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierBiologicalSex];
    return [NSSet setWithObjects:heightType,weightType,birthdayType,biologicalSex, nil];

每次我调用 requestAuthorizationToShareTypes:readTypes:completion: 时将集合更改为包含 NEW 类型会导致打开此视图,其中包含我曾经请求权限的所有类型(不一定在此特定调用中):

【问题讨论】:

就像位置、联系人等一样。访问系统只会从您的应用程序中询问一次。在此之后,您必须自己检测授权状态并要求用户转到 settings.app 并根据需要进行更改。 @rckoenes 感谢您的宝贵时间!我不确定这是否完全相同,因为每次在提示此视图的集合中使用不同类型询问用户权限并允许用户更改他以前的选择以及(!)到新的选择时。我将使用此信息更新问题,因为可能不清楚... 是否可以从设置应用程序而不是 Healthkit.app 检测授权状态?我的意思是我可以在 settings.app 中显示 healthkit 授权 【参考方案1】:

根据设计,不可能重新提示用户进行授权。如果您希望用户考虑更改他们对您的应用的授权,请让他们转到“设置”或“健康”应用以执行此操作。

【讨论】:

【参考方案2】:

目前我们做不到。但是,能够这样做是有道理的,因为切换访问权限并不像点击“确定”或“取消”按钮那么简单。您可能会认为每个人都知道如何轻按开关并打开电源,但相信我,如果您这么认为,那您就错了。

我会在苹果的雷达中提交一个错误,让他们知道他们的设计并非完美无缺。我们应该能够再次提示用户。如果用户生气,他可以随时删除我们的应用程序,我觉得这比阅读很长的“如何在 Health.app 中启用访问”列表并感到困惑要好得多,这就是普通用户会做的事情。

【讨论】:

通过说“我们应该能够再次提示用户”。你正在反对苹果生态系统。如果用户否认。这应该是最终决定,开发商应该接受。虽然如果您真的无法在没有许可的情况下工作,请让用户从设置中允许并限制您提供的功能。 我想我已经说得很清楚了。我当然反对苹果在这件事上的决定,我是一名 ios 开发者并不代表我是一个盲目接受苹果所说的一切的苹果迷。

以上是关于提示用户授权应用程序共享 HealthKit 中的类型的主要内容,如果未能解决你的问题,请参考以下文章

HealthKit 授权状态始终为 1

HealthKit 授权状态始终为 1

如何检查 HealthKit 是不是已被授权

在用户关闭应用程序后请求 HealthKit 权限

在用户关闭应用程序后请求 HealthKit 权限

SwiftUI HealthKit 基础教程