苹果微信运动刷步数教程每天最高可刷上万步!!

思路
糯米粉基于逆向工程的应用的方案中,是直接在微信头文件中发现,WCDeviceStepObject这个类里面有很显眼的属性m7StepCount,hkStepCount,一猜就是用来记录运动步数的属性,

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

  • 非越狱苹果手机(当然,越狱的也行),iOS 8 以上,因为iOS8以上才有苹果健康应用.

  • 苹果证书,创建app id的时候必须Enable HealthKit,告诉苹果,你要使用healthKit.

HealthKit
什么是HealthKit
简单的说,HealthKit就是iOS8
以后出现的,苹果用来生成,存储,查询各种健康数据的一个API,包括iPhone本身创建的健身数据,或者第三方app创建的健康数据,都可以通过这个API进行读取和查询.也可以把HealthKit看成iPhone的健康数据的一个统一的数据库,同一个手机上的不用app的健康数据的读取都是直接面向healthKit,由HealthKit统一管理,来实现iOS上不同应用之间的健康数据的交互.所以说,微信(包括qq或者其他第三方app)上的运动步数,本质上也是通过HealthKit来读取的,所以,我们只需要新建一个app(当然,我这里只做开发环境),请求对HealthKit数据的写入权限,添加运动步数后,微信(包括qq或者其他第三方app)通过HealthKit读取我们手机上的健康数据中的运动步数后,自然读取后的运动步数就可以由我们随心所欲来修改了.当然,healthKit里面包含各种各种的健康数据,包括步数,睡眠,运动距离,卡路里,血压等等.想要查看这些数据非常简单,打开iPhone里面苹果自带的健康应用,非常直观的展示了我们的健康数据.

iPhone健康应用

  • HealthKit框架

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

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

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

常见HKQuantityType

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

  • HKCharacteristicType:一般用来表示那些通常并不会随着时间而变化的健康数据类型,苹果提供了三种:biological
    sex, blood type and birthdate,这类数据第三方app不能去创建,只能从HealthKit store中读取.

  • HKCategoryType:用来表示类别,在iOS中,只有一种,sleep analysis,表示睡眠的质量类别.

  • HKQuantityType:除了上面两种类型的其他健康数据类型.

HKQuantityType

  • HKObjectType一般都根据identifier来创建的+(nullable HKQuantityType )quantityTypeForIdentifier:(NSString )identifier;
    +(nullable HKCategoryType )categoryTypeForIdentifier:(NSString )identifier;
    +(nullable HKCharacteristicType )characteristicTypeForIdentifier:(NSString )identifier;

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

HKObject

  • 下面代码是一个如何创建运动步数的HKObject的例子   NSDate endDate = [NSDate date];
      NSDate
    startDate = [NSDate dateWithTimeInterval:-300 sinceDate:endDate];
      HKQuantity stepQuantityConsumed = [HKQuantity quantityWithUnit:[HKUnit countUnit] doubleValue:stepNum];
      HKQuantityType
    stepConsumedType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTyPEIDentifierStepCount];

5.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;
6.HKQuery:healthKit数据的查询/!
@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;
HKQuery的方法可以见上面,包括各种查询数据的类型,条件,筛选,排序,次数等等,这里就不详细说了,有需要的可以自己多了解,简单写一个查询运动数量的示例:[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];
        });
    }];
– (void)fetchSumOfSamplesTodayForType:(HKQuantityType
)quantityType unit:(HKUnit )unit completion:(void (^)(double, NSError ))completionHandler {
    NSPredicate predicate = [self predicateForSamplesToday];
    HKStatisticsQuery
query = [[HKStatisticsQuery alloc]
initWithQuantityType:quantityType quantitySamplePredicate:predicate
options:HKStatisticsOptionCumulativeSum
completionHandler:^(HKStatisticsQuery query, HKStatistics result, NSError error) {
        HKQuantity
sum = [result sumQuantity];
        if (completionHandler) {
            double value = [sum doubleValueForUnit:unit];
            completionHandler(value, error);
        }
    }];
    [self.healthStore executeQuery:query];
}动手改运动步数
前面简单介绍了healthKit的整个框架,要修改微信或者其他第三方app的健康数据,只需要修改苹果中HKHealthStore的数据即可,应该第三方app均是读取HKHealthStore的数据的.说一下简单步骤:
首先获取读取权限,获得读取权限后,将运动步数的数据写入HKHealthStore.第三方应用就会自动去利用HKHealthStore去更新数据了,就是这么简单.打包到真机,授权权限后添加步数

添加成功

未经允许不得转载:中华懒人网 » 苹果微信运动刷步数教程每天最高可刷上万步!!

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址