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

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

思路

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

条件

  • 非越狱苹果手机(当然,越狱的也行),iOS 8 以上,因为iOS8以上才有苹果健康应用.
  • 苹果证书,创建app id的时候必须Enable HealthKit,告诉苹果,你要使用healthKit.


    healthkit.png

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框架

  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又可以细分为以下几种:

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

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

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


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

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

HKObject
  • 下面代码是一个如何创建运动步数的HKObject的例子
    <pre>
    NSDate *endDate = [NSDate date];
    NSDate *startDate = [NSDate dateWithTimeInterval:-300 sinceDate:endDate];

    HKQuantity *stepQuantityConsumed = [HKQuantity quantityWithUnit:[HKUnit countUnit] doubleValue:stepNum];

    HKQuantityType *stepConsumedType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
    </pre>

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];
});
}];

  • (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];
    }
    </pre>

动手改运动步数

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

  • 打包到真机,授权权限后添加步数


    IMG_3796.PNG
  • 添加成功


    IMG_3794.PNG
  • 实时同步到qq的健康排行榜

B9995FE24C397449EFB07F50D3AEE479.png
  • qq的健康每走满1万步,可以捐1万步抵一块钱做公益,最多可以一天捐3快,这是我做这个小玩意最大的收获,如果你有幸看到了,也想为公益做点事,没事就多在qq这里捐步数做做公益吧😄


    IMG_3798.PNG
  • 然而,我发现微信并不是直接读取HKHealthStore中步数的总数这么简单,我自己添加的步数微信并不会同步,我研究了下,iOS9 中,添加数据的时候,iOS会自动帮我们添加数据来源,我们自己也可以添加设备信息.如下图:
    我觉得应该是最近刷微信运动步数的情况比较严重,微信采取了一些措施,最大的可能是微信并不是直接读取运动步数总数,而且会先判定数据来源,不是微信认可的设备以及iPhone自身运动处理器记录的步数,微信不会同步,所以,这种我们自己的app随便写的数据,去改微信步数以失败告终,看来想改微信的话,还是需要往逆向工程方向去操作.

IMG_3795.PNG

结语

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容