网上有一些基于逆向工程的应用的方案中,是直接在微信头文件中发现,WCDeviceStepObject这个类里面有很显眼的属性: m7StepCount, hkStepCount, 一猜就是用来记录运动步数的属性, 然后直接编写Tweak.xm,修改m7StepCount的get方法,直接返回一个运动步数,就可以修改自己微信的运动步数了。
由于本人对逆向工程了解的不多,所以这篇文章主要是学习苹果的healthKit框架,打通各种第三方app和苹果本身健康应用之间的数据通道,实现各种健康数据在第三方应用和苹果健康应用之间的读写。
HealthKit框架:
1.HKUnit: 由于健康数据包括各种各样数据类型,HealthKit对这些数据进行了统一规范,HKUnit包括了Mass,Length,Volume,Pressure,Time,Energy,Temperature,Electrical Conductance,Scalar等各种数据类型.
[HKUnit countUnit]
2.HKQuantity: 通过数据类型HKUnit,把我们数学意义上的数量转换成HealthKit的数据.
HKQuantity *stepQuantityConsumed = [HKQuantity quantityWithUnit:[HKUnit countUnit] doubleValue:stepNum];quantityWithUnit:poundUnit doubleValue:weight];
3.HKObjectType: 健康数据的类型,包括运动步数,心率,卡路里等等.
HKObjectType一般都根据identifier来创建的
+(nullable HKQuantityType)quantityTypeForIdentifier:(NSString)identifier;
+(nullable HKCategoryType)categoryTypeForIdentifier:(NSString)identifier;
+(nullable HKCharacteristicType)characteristicTypeForIdentifier:(NSString)identifier;
创建运动步数的HKObject的例子:
NSDate endDate = [NSDate date];
NSDatestartDate = [NSDate dateWithTimeInterval:-300 sinceDate:endDate];
HKQuantitystepQuantityConsumed = [HKQuantity quantityWithUnit:[HKUnit countUnit] doubleValue:stepNum];
HKQuantityType stepConsumedType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
4.HKHealthStore: healthKit的管理器,用来链接到数据库,保存和查询数据,在app中必须一直被持有(should be long lived).类似下面的操作均是HKHealthStore的对象方法.
- (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;
5.HKQuery: healthKit数据的查询
-(instancetype)initWithSampleType:(HKSampleType)sampleType predicate:(nullable NSPredicate)predicate limit:(NSUInteger)limit sortDescriptors:(nullable NSArray)sortDescriptors resultsHandler:(void(^)(HKSampleQueryquery, NSArray<__kindof HKSample *>__nullable results, NSError__nullable error))resultsHandler;
修改运动步数: 要修改微信或者其他第三方app的健康数据,只需要修改苹果中HKHealthStore的数据即可,有些第三方app是读取HKHealthStore的数据的.(有些对数据来源做了限制,例如:微信)
根据日期读取数据: