这是一个我知道答案的问题,因为我看到了执行此功能的应用程序。我试过(直接写,使用后台提取)但没有任何作用。我在应用程序商店中找到了一个应用程序,其中包含我正在寻找的功能。背景提取设置为OFF,主应用程序不在后台运行。我去了Widget并添加了一个项目。我打开HealthKit,我按预期看到了数据。
我想为我的应用做同样的事情。即使应用程序没有在后台运行,我也希望我的今天扩展(widget)和/或WatchKit扩展能够写入HealthKit存储。 就像我说的那样,我已经测试了一个能够实现这一功能的应用程序,即使在Apple文档中也说明了这一点:
HealthKit商店只能由授权的应用访问。您 无法从扩展程序(如今日视图)或从扩展程序访问HealthKit 一个WatchKit应用程序。
由于HealthKit商店已加密,因此您的应用无法读取数据 手机锁定时从商店出来。这意味着您的应用可能不会 能够在后台启动时访问商店。 但是,即使在手机上,应用仍然可以将数据写入商店 锁住了。商店暂时缓存数据并将其保存到 电话解锁后立即加密存储。
任何答案或见解都表示赞赏。谢谢大家。
答案 0 :(得分:1)
在设备锁定时,Health Data Store确实已加密。锁定被定义为需要设备上的密码并且屏幕已关闭(因此在您返回主屏幕之前需要密码或触摸ID)。虽然商店已加密,但无论应用程序是否在后台运行,都无法从中读取任何数据。即使在应用程序运行时设置观察者查询也不允许继续读取它。我想这种保护级别只需使用NSFileProtectionComplete选项的数据保护功能即可完成。
您在其他应用中观察到了哪些HealthKit功能?如果它显示步长和距离数据,则他们可能直接从计步器(CMPedometer)获取此数据,这在设备被锁定时不受限制。
答案 1 :(得分:0)
Lehn0058关于授权的评论是正确的。即使已经在应用程序中提供了授权,我也必须明确地从WatchKit和Today Extension请求授权。之后两人都可以写信给健康商店。以上Apple的评论仅涉及从健康商店阅读而不是写入健康商店。以下是其他任何遇到同样问题的示例代码。再次感谢。
在WatchKit InterfaceController.m中
- (void)awakeWithContext:(id)context {
[super awakeWithContext:context];
// Configure interface objects here.
[[HealthKitManager sharedManager] requestHealthKitAccess];
}
今天扩展TodayViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
[[HealthKitManager sharedManager] requestHealthKitAccess];
}