苹果健康使用HealthKit接收数据的提交和读取,很多时候,我们从程序编写的角度,把两者看做同一个东西,下文简称HK。

HK在权限管理方面,有个很特(guai)别(yi)的地方,也是一个坑,即:读权限和写权限是完全分离的,存在可写但不可读的情况。由于权限控制权完全在用户手中,即使程序同时请求读写权限,也可能只是获得到写权限,而无读权限。这就造成一个问题:程序无法直接知道HK里已经存有哪些数据,如果不想办法规避这个坑,同一条数据有可能被重复写入HK。

为了避免重复写入数据,我们需要在APP端甚至云端的数据存储中,对每条需要同步到HK的数据,进行标记。这样,才能将HK的数据同步做到最佳。

我个人对HK本身的设计有个想法:HK应该自动把同一个数据源提交来的相同数据进行合并。如果几个数据,它们的起止时间,数值等,都是相同的,把它们看做同一个数据,是完全合理的。其实HK对于重复数据,是有一个融合算法的,并不会把数据进行累加。但是,用户点开“显示所有数据”时,看到有数据重复的情况,多多少少心里会有些膈应,会怪罪APP端。苹果对HK的数据隐私,看得格外重要,才设计出如此怪异的权限机制,牺牲了不少的可用性。