Health and Fitness with Core Motion
session 713
這次主要包含一下3個方面的內(nèi)容:
- Historical Accelerometer
- Pedometer events
- Device Motion on apple watch
在Core Motion 運動處理API自從iOS4開始就已經(jīng)存在了。這部分相關(guān)的API介紹呢?請參照WWDC2011,WWDC2012的相關(guān)內(nèi)容。
一、Historical Accelerometer
在WWDC2015時,我們更新一個API,名稱是CM Sensor Recoder API。
-
iOS方面
- 這個api主要作用就是持續(xù)不斷的獲取你的設(shè)備的加速度信息。并且它是低能耗的。
- CM Sensor Recoder 主要是和傳感器直接交互,便于直接檢索和處理運動數(shù)據(jù)。
- 即使是當你的應(yīng)用處于不活躍狀態(tài)時,recoder 仍可以繼續(xù)處理運動數(shù)據(jù)。
- 當你的應(yīng)用需要使用運動數(shù)據(jù)是,可以直接通過recoder 進行獲取。
-
WatchOS方面
- 優(yōu)化力度也是顯而易見的,如圖

Snip20160731_7.png
分別在待機時間上面,處理數(shù)據(jù)的延遲度上面都有著提高。
- 在iOS10以及watchOS3中,你在使用senorrecoder時,就不僅僅長期觀察用戶運動,可以寫分到類別,例如監(jiān)測用的體育活動,記錄用戶的健身運動情況,更可以輔助醫(yī)學的健康診斷。
- 當你帶著apple watch 的時候,手臂。手腕的晃動。都可以試試的被監(jiān)測到。通過用戶的活動,可以準確的分析用戶的運動行為,從而給出更加專業(yè)性的建議。
二、Pedometer events
- 在說這個Pedometer event之前,我們還是要先了解下CMPedometer。
- CMPedometer是非常豐富的API。 可以記錄步數(shù),距離,樓層等。通過它創(chuàng)建一個全天性的監(jiān)測活動。你也可以為這些活動設(shè)置一些有趣的目標讓用戶去實現(xiàn)。
- 現(xiàn)在CMPedometer,在用戶鍛煉方面也有出色的表現(xiàn)。

Snip20160731_8.png

Snip20160731_9.png
- 例如:現(xiàn)在提供了運動速度指標(走路或者跑步)。不管GPS是否管用,都可以準確的記錄用戶的步數(shù)和運動距離。
pedometer events(ios10 新增API)就是實現(xiàn)這個的關(guān)鍵。

Snip20160731_12.png
-
這用用這個api設(shè)計一些健康運動的APP。
Snip20160731_13.png 我們來討論下典型的運動鍛煉類app。通常你會遇到一個問題那就是,在記錄用戶運動情況的時候,用戶在過馬路時出現(xiàn)等紅綠燈情況。此時你如何計算定義用戶開始與停止走路的狀態(tài)。
pedometer event 可以做到 智能預測停止和繼續(xù);計算準確的距離和速度;GPS不適用的情況
實現(xiàn)原理:API為了保持數(shù)據(jù)的精確性,更加低能耗。通過分析用戶運動數(shù)據(jù)的預測算法實現(xiàn)。我們需要指出的是這個預測算法會持續(xù)監(jiān)測用戶運動情況。會準確地告知你 是否暫?;蛘呃^續(xù)的事件。通過預測算法和實時更新監(jiān)測狀態(tài),來保證數(shù)據(jù)的準確性
下圖是Pedometer event 的使用設(shè)備范圍
iphon6/6+都不支持

Snip20160731_15.png
部分代碼展示
@interface ViewController ()
@property (nonatomic, assign) CGFloat relaticeAltitudeNow;
@property (nonatomic, assign) CGFloat relaticeAltitudeAtResume;
@property (nonatomic, strong) CMPedometer * eventManager;
@property (nonatomic, strong) CMAltimeter * elevationManager;
@property (nonatomic, strong) NSOperationQueue * queue;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.eventManager = [[CMPedometer alloc]init];
self.elevationManager = [[CMAltimeter alloc]init];
self.relaticeAltitudeNow = 0.0;
self.relaticeAltitudeAtResume = 0.0;
self.queue = [NSOperationQueue currentQueue];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)startMyTrail {
if ([CMPedometer isPedometerEventTrackingAvailable]) {
[self.elevationManager startRelativeAltitudeUpdatesToQueue:self.queue withHandler:^(CMAltitudeData * _Nullable altitudeData, NSError * _Nullable error) {
self.relaticeAltitudeNow = [altitudeData.relativeAltitude doubleValue];
}];
}
if ([CMPedometer isPedometerEventTrackingAvailable]) {
[self.eventManager startPedometerEventUpdatesWithHandler:^(CMPedometerEvent * _Nullable pedometerEvent, NSError * _Nullable error) {
if (pedometerEvent.type == CMPedometerEventTypeResume) {
self.relaticeAltitudeAtResume = self.relaticeAltitudeNow;
}else if (pedometerEvent.type == CMPedometerEventTypePause) {
if (self.relaticeAltitudeNow - self.relaticeAltitudeAtResume > 0.0 ) {
}else if (self.relaticeAltitudeNow - self.relaticeAltitudeAtResume <0.0) {
}
}
}];
}
}
- (void)stopTrail {
[self.eventManager stopPedometerEventUpdates];
[self.elevationManager stopRelativeAltitudeUpdates];
}
三、Device Motion on apple watch

Snip20160731_24.png
- 自從ios5 就出現(xiàn)了device motion,所有iOS系統(tǒng)都是支持的,現(xiàn)在watchOS3 中我們也將這部分移植了。
- 在watchOS3中關(guān)于Device Motion 的主要有四個API
- Attitude
用戶處置擺動手臂
- Attitude

Snip20160731_25.png
- Graity 重力感應(yīng)

Snip20160731_26.png
- Rotation rate 旋轉(zhuǎn)角度

Snip20160731_28.png
- User Acceleration 用戶水平運動

Snip20160731_29.png
他們的使用場景 :

Snip20160731_27.png
