一 傳感器
什么是傳感器
傳感器是一種感應(yīng)\檢測(cè)周圍環(huán)境的一種裝置
傳感器的作用
用于感應(yīng)\檢測(cè)設(shè)備周邊的信息
不同類型的傳感器, 檢測(cè)的信息也不一樣
iPhone內(nèi)置的傳感器有
運(yùn)動(dòng)傳感器\加速度傳感器\加速計(jì)(Motion/Accelerometer Sensor)
環(huán)境光傳感器(Ambient Light Sensor)
距離傳感器(Proximity Sensor)
磁力計(jì)傳感器(Magnetometer Sensor)
內(nèi)部溫度傳感器(Internal Temperature Sensor)
濕度傳感器(Moisture Sensor)
… …
二 距離傳感器
默認(rèn)情況下,每一個(gè)應(yīng)用程序距離傳感器都是關(guān)閉狀態(tài)
如果需要,需要通過(guò)代碼將其打開(kāi)
// 過(guò)期代碼 [UIApplication sharedApplication].proximitySensingEnabled
[UIDevice currentDevice].proximityMonitoringEnabled = YES;123
三 加速計(jì)信息獲取##
UIAccelerometer方法,該方法已過(guò)期
- (void)viewDidLoad {
[super viewDidLoad];
// 1.獲取單例對(duì)象
UIAccelerometer *acceleromter = [UIAccelerometer sharedAccelerometer];
// 2.設(shè)置代理
acceleromter.delegate = self;
// 3.設(shè)置采樣間隔
acceleromter.updateInterval = 1.0 / 5;
}12345678910
#pragma mark - 實(shí)現(xiàn)UIAccelerometer的代理方法
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
NSLog(@“x:%f y:%f z:%f”, acceleration.x, acceleration.y, acceleration.z);
}12345
四 CoreMotion方法##
Core Motion獲取數(shù)據(jù)的兩種方式
push:實(shí)時(shí)采集所有數(shù)據(jù)(采集頻率高)
pull:在有需要的時(shí)候,再主動(dòng)去采集數(shù)據(jù)
加速計(jì)信息獲取(pull/push)
// 1.創(chuàng)建運(yùn)動(dòng)管理者對(duì)象
CMMotionManager *mgr = [[CMMotionManager alloc] init];
// 2.判斷加速計(jì)是否可用
if (!self.mgr.isAccelerometerAvailable) {
NSLog(@“加速計(jì)不可用,請(qǐng)更換手機(jī)”);
return;
}
// 3.設(shè)置采樣間隔
self.mgr.accelerometerUpdateInterval = 1.0;
// 4.開(kāi)始采樣
[self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
if (error) {
NSLog(@“%@”, error);
return;
}
// 獲取加速計(jì)的值
CMAcceleration acceleration = accelerometerData.acceleration;
NSLog(@“x:%f y:%f z:%f”, acceleration.x, acceleration.y, acceleration.z);
}];123456789101112131415161718192021
// 開(kāi)始采樣
[self.mgr startAccelerometerUpdates];12
陀螺儀信息獲取(pull/push)
// push方式獲取陀螺儀信息
// 1.判斷陀螺儀是否可用
if (!self.mgr.isGyroAvailable) {
NSLog(@“設(shè)備小于iPhone4,或者陀螺儀損壞”);
return;
}
// 2.設(shè)置采樣
self.mgr.gyroUpdateInterval = 1.0 / 10;
// 3.開(kāi)始采樣
[self.mgr startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
if (error) {
NSLog(@“%@”, error);
return;
}
// 獲取陀螺儀的信息
CMRotationRate rotationRate = gyroData.rotationRate;
NSLog(@“x:%f y:%f z:%f”, rotationRate.x, rotationRate.y, rotationRate.z);
}];123456789101112131415161718
// 開(kāi)始采樣
[self.mgr startGyroUpdates];12
五 搖?搖功能##
監(jiān)控?fù)u一搖的方法
方法1:通過(guò)分析加速計(jì)數(shù)據(jù)來(lái)判斷是否進(jìn)行了搖一搖操作(比較復(fù)雜)
方法2:iOS自帶的Shake監(jiān)控API(非常簡(jiǎn)單)
判斷搖一搖的步驟:實(shí)現(xiàn)3個(gè)搖一搖監(jiān)聽(tīng)方法
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 檢測(cè)到搖動(dòng) */
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 搖動(dòng)取消(被中斷) */
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 搖動(dòng)結(jié)束 */12345
六 計(jì)步器##
CMStepCounter方法,已過(guò)期
// 1.判斷計(jì)步器是否可用
if (![CMStepCounter isStepCountingAvailable]) {
NSLog(@“計(jì)步器不可用”);
return;
}
// 2.開(kāi)始計(jì)步
// 2.1.創(chuàng)建計(jì)步器
CMStepCounter *stepCounter = [[CMStepCounter alloc] init];
// 2.2.開(kāi)始計(jì)步
// updateOn : 用戶走了多少步之后,更新block
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[stepCounter startStepCountingUpdatesToQueue:queue updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
if (error) return;
NSString *stepString = [NSString stringWithFormat:@“您一共走了%ld步”, numberOfSteps];
[self.stepLabel performSelectorOnMainThread:@selector(setText:) withObject:stepString waitUntilDone:YES];
}];123456789101112131415161718
新方法CMPedometer
// 1.判斷計(jì)步器是否可用
if (![CMPedometer isStepCountingAvailable]) {
return;
}
// 2.開(kāi)始計(jì)步
// 2.1.創(chuàng)建計(jì)步對(duì)象
CMPedometer *pedometer = [[CMPedometer alloc] init];
// 2.2.開(kāi)始計(jì)步
// FromDate : 從什么時(shí)間開(kāi)始計(jì)步
NSDate *date = [NSDate date];
[self.pedometer startPedometerUpdatesFromDate:date withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
if (error) {
NSLog(@“%@”, error);
return;
}
NSLog(@“您一共走了%@步”, pedometerData.numberOfSteps);
}];
12345678910111213141516171819
案例:計(jì)算7天一共走了多少步
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @“yyyy-MM-dd”;
NSDate *fromDate = [fmt dateFromString:@“2015-9-26”];
NSDate *toDate = [fmt dateFromString:@“2015-9-28”];
[self.pedometer queryPedometerDataFromDate:fromDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
NSLog(@“%@”, pedometerData.numberOfSteps);
}];