IOSiOS开发技术部落ios小功能

iOS 教你修改运动步数(基于Healthkit)

2016-05-02  本文已影响91945人  我系哆啦

近日,看到糯米粉写的文章iOS 教你如何修改微信运动步数 ,趁着五一放假,也想来玩一下改微信运动步数,占领一下朋友圈封面,装装逼,奈何看到作者用的都是基于逆向工程的一些比较深入的知识,而且要满足iphone手机越狱的条件,像我这种小菜鸟,自己手里的iphone总是第一时间更新系统暂时没办法越狱.俗话说条条大路通罗马,自己就倒腾了下下苹果的healthkit,能不能改微信步数结尾再说😄😄

思路

糯米粉基于逆向工程的应用的方案中,是直接在微信头文件中发现,WCDeviceStepObject这个类里面有很显眼的属性m7StepCount,hkStepCount,一猜就是用来记录运动步数的属性, 然后直接编写Tweak.xm,修改m7StepCount的get方法,直接返回一个运动步数,就可以修改自己微信的运动步数了.当然,糯米粉写这篇文章的本意只是通过一个热点,把大家带入逆向工程这个领域.而我写这篇文章,虽然也是用的同样的概念,但是和糯米粉的侧重点不一样,因为我手上没有越狱的手机,对逆向工程了解也不够深,所以我这篇文章主要是学习苹果的healthKit框架,打通各种第三方app和苹果本身健康应用之间的数据通道,实现各种健康数据(包括但不限于运动步数)在第三方应用和苹果健康应用之间的读写.

条件

HealthKit

  1. HKUnit: 由于健康数据包括各种各样数据类型,HealthKit对这些数据进行了统一规范,HKUnit包括了Mass,Length,Volume,Pressure,Time,Energy,Temperature,Electrical Conductance,Scalar等各种数据类型.
    <pre>
    [HKUnit countUnit]
    </pre>

2.HKQuantity:通过数据类型HKUnit,把我们数学意义上的数量转换成HealthKit的数据.
<pre>
HKQuantity *stepQuantityConsumed = [HKQuantity quantityWithUnit:[HKUnit countUnit] doubleValue:stepNum];quantityWithUnit:poundUnit doubleValue:weight];
</pre>

3.HKObjectType:健康数据的类型,包括运动步数,心率,卡路里等等(参考下图).


常见HKQuantityType

另外,按照类型, HKQuantityType又可以细分为以下几种:

4.HKObject:有数据类型,自然有对应数据对象

HKObject

5.HKHealthStore:healthKit的管理器,用来链接到数据库,保存和查询数据,在app中必须一直被持有(should be long lived).类似下面的操作均是HKHealthStore的对象方法.
<pre>
-(void)saveObject:(HKObject *)object withCompletion:(void(^)(BOOL success, NSError * __nullable error))completion;
-(void)executeQuery:(HKQuery *)query;
-(void)deleteObject:(HKObject *)object withCompletion:(void(^)(BOOL success, NSError * __nullable error))completion;
</pre>

6.HKQuery:healthKit数据的查询
<pre>
/*!
@method initWithSampleType:predicate:limit:sortDescriptors:resultsHandler:
@abstract Returns a query that will retrieve HKSamples matching the given predicate.

@param sampleType The type of sample to retrieve.
@param predicate The predicate which samples should match.
@param limit The maximum number of samples to return. Pass HKObjectQueryNoLimit for no limit.
@param sortDescriptors The sort descriptors to use to order the resulting samples.
@param resultsHandler The block to invoke with results when the query has finished executing.
*/
-(instancetype)initWithSampleType:(HKSampleType *)sampleType
predicate:(nullable NSPredicate *)predicate
limit:(NSUInteger)limit
sortDescriptors:(nullable NSArray<NSSortDescriptor *> *)sortDescriptors
resultsHandler:(void(^)(HKSampleQuery *query, NSArray<__kindof HKSample *> * __nullable results, NSError * __nullable error))resultsHandler;
</pre>

HKQuery的方法可以见上面,包括各种查询数据的类型,条件,筛选,排序,次数等等,这里就不详细说了,有需要的可以自己多了解,简单写一个查询运动数量的示例:
<pre>
[self fetchSumOfSamplesTodayForType:stepType unit:[HKUnit countUnit] completion:^(double stepCount, NSError *error) {
NSLog(@"%f",stepCount);
dispatch_async(dispatch_get_main_queue(), ^{
_readStepLabel.text = [NSString stringWithFormat:@"%.f",stepCount];
});
}];

动手改运动步数

前面简单介绍了healthKit的整个框架,要修改微信或者其他第三方app的健康数据,只需要修改苹果中HKHealthStore的数据即可,应该第三方app均是读取HKHealthStore的数据的.说一下简单步骤:
首先获取读取权限,获得读取权限后,将运动步数的数据写入HKHealthStore.第三方应用就会自动去利用HKHealthStore去更新数据了,就是这么简单.

B9995FE24C397449EFB07F50D3AEE479.png IMG_3795.PNG

结语

虽然并没有成功实现更改微信的运动步数,但是,我觉得,结果并不重要,重要的是我们学习了HealthKit,有所收获,懂得原理.

最后,虽然这个很简单,我还是把Demo地址放一下吧,Demo实在苹果Healthkit原先的Demo基础上添加修改步数的功能.HealthKitDemo

上一篇下一篇

猜你喜欢

热点阅读