一、什麼是傳感器
傳感器是一種感應\檢測周圍環境的一種裝置, 目前已經普遍應用於智能手機上算法
傳感器的做用
用於感應\檢測設備周邊的信息
不一樣類型的傳感器, 檢測的信息也不同編程
iPhone中的下面現象都是由傳感器完成的
在地圖應用中, 能判斷出手機頭面向的方向
一關燈, iPhone會自動調整屏幕的亮度
打電話時, 人臉貼近iPhone屏幕時, 屏幕會自動鎖屏
... ...框架
一、傳感器的類型
iPhone內置的傳感器有
運動傳感器\加速度傳感器\加速計(Motion/Accelerometer Sensor)
環境光傳感器(Ambient Light Sensor)
距離傳感器(Proximity Sensor)
磁力計傳感器(Magnetometer Sensor)
內部溫度傳感器(Internal Temperature Sensor)
溼度傳感器(Moisture Sensor)
陀螺儀(Gyroscope)
... ...dom
二、環境光傳感器(Ambient Light Sensor)
是iPhone和Mac設備中最爲古老的傳感器成員測試
它可以讓你在使用 Mac、iPhone、iPad時,眼睛更爲溫馨
從一個明亮的室外走入相對黑暗的室內後,iOS設備會自動調低亮度,讓屏幕顯得再也不那麼光亮刺眼
當你使用iPhone拍照時,閃光燈會在必定條件下自動開啓
幾乎全部的Mac 都帶有背光鍵盤,當週圍光線弱到必定條件時,會自動開啓鍵盤背光 atom
三、距離傳感器(Proximity Sensor)
用於檢測是否有其餘物體靠近設備屏幕
當你打電話或接電話時將電話屏幕貼近耳邊,iPhone會自動關閉屏幕 ,好處是
節省電量
防止耳朵或面部不當心觸摸屏幕而引起一些不想要的意外操做
題外話:利用距離傳感器,能找出不少電視劇的穿幫鏡頭spa
四、磁力計傳感器(Magnetometer Sensor)
能夠感應地球磁場, 得到方向信息, 使位置服務數據更精準
能夠用於電子羅盤和導航應用
iPad的Smart Cover盒蓋睡眠操做就是基於磁力計傳感器3d
五、內部溫度傳感器(Internal Temperature Sensor)
從 iPad一代開始,iOS設備都加入了一個內部溫度傳感器,用於檢測內部組件溫度,當溫度超過系統設定的閾值時,會出現如下提示 代理
六、溼度傳感器(Moisture Sensor)
溼度傳感器跟其餘基於微電子的傳感器不一樣,是一個簡單的物理傳感器orm
簡單來講,溼度傳感器就是一張遇水變紅的試紙
Apple的維修人員就是經過檢測試紙是否變紅,來判斷設備是否進水
(設備進水不在保修範圍以內)
七、陀螺儀(Gyroscope)
陀螺儀是隨着iPhone4的上市首次出如今iOS設備上的傳感器
陀螺儀的原理是檢測設備在X、Y、Z軸上所旋轉的角速度
陀螺儀在賽車類遊戲中有重大做用:
模擬汽車駕駛時方向盤旋轉的動做
使得這類遊戲的操控體驗更爲真實
八、加速計傳感器(Motion/Accelerometer Sensor)
最先出如今iOS設備上的傳感器之一
加速計用於檢測設備在X、Y、Z軸上的加速度 (哪一個方向有力的做用)
加速計能夠用於檢測設備的搖晃,經典應用場景
搖一搖
計步器
小結:
默認狀況下,每個應用程序距離傳感器都是關閉狀態
若是須要,須要經過代碼將其打開
// 開啓距離感應功能 [UIDevice currentDevice].proximityMonitoringEnabled = YES; // 監聽距離感應的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityChange:) name:UIDeviceProximityStateDidChangeNotification object:nil]; - (void)proximityChange:(NSNotification *)notification { if ([UIDevice currentDevice].proximityState == YES) { NSLog(@"某個物體靠近了設備屏幕"); // 屏幕會自動鎖住 } else { NSLog(@"某個物體遠離了設備屏幕"); // 屏幕會自動解鎖 } }
一、加速計原理
檢測設備在X、Y、Z軸上的加速度 (哪一個方向有力的做用,哪一個方向運動了)
根據加速度數值,就能夠判斷出在各個方向上的做用力度
二、UIAccelerometer
1)加速計程序的開發
在iOS4之前:使用UIAccelerometer,用法很是簡單(到了iOS5就已通過期)
從iOS4開始:CoreMotion.framework
雖然UIAccelerometer已通過期,但因爲其用法極其簡單,不少程序裏面都還有殘留
2)UIAccelerometer的使用步驟
得到單例對象 UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; 設置代理 accelerometer.delegate = self; 設置採樣間隔 accelerometer.updateInterval = 1.0/30.0; // 1秒鐘採樣30次 實現代理方法 - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration // acceleration中的x、y、z三個屬性分別表明每一個軸上的加速度
三、Core Motion
1)Core Motion
在iOS4以前,加速度計由UIAccelerometer類來負責採集數據
隨着iPhone4的推出加速度計全面升級,並引入了陀螺儀與Motion(運動)相關的編程成爲重頭戲蘋果特意在iOS4中增長了專門處理Motion的框架-CoreMotion.framework
Core Motion不只可以提供實時的加速度值和旋轉速度值,更重要的是,蘋果在其中集成了不少牛逼的算法
2)Core Motion獲取數據的兩種方式
獲取加速計信息
push
實時採集全部數據(採集頻率高)
建立運動管理者對象 CMMotionManager *mgr = [[CMMotionManager alloc] init]; 判斷加速計是否可用(最好判斷) if (mgr.isAccelerometerAvailable) { // 加速計可用 } 設置採樣間隔 mgr.accelerometerUpdateInterval = 1.0/30.0; // 1秒鐘採樣30次 開始採樣(採樣到數據就會調用handler,handler會在queue中執行) - (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler;
pull
在有須要的時候,再主動去採集數據
建立運動管理者對象 CMMotionManager *mgr = [[CMMotionManager alloc] init]; 判斷加速計是否可用(最好判斷) if (mgr.isAccelerometerAvailable) { // 加速計可用 } 開始採樣 - (void)startAccelerometerUpdates; 在須要的時候採集加速度數據 CMAcceleration acc = mgr.accelerometerData.acceleration; NSLog(@"%f, %f, %f", acc.x, acc.y, acc.z);
獲取陀螺儀信息
- (void)pullGyro { // pull方式獲取陀螺儀信息 // 1.判斷陀螺儀是否可用 if (!self.mgr.isGyroAvailable) { NSLog(@"設備小於iPhone4,或者陀螺儀損壞"); return; } // 2.開始採樣 [self.mgr startGyroUpdates]; } - (void)pushGyro { // push方式獲取陀螺儀信息 // 1.判斷陀螺儀是否可用 if (!self.mgr.isGyroAvailable) { NSLog(@"設備小於iPhone4,或者陀螺儀損壞"); return; } // 2.設置採樣 self.mgr.gyroUpdateInterval = 1.0 / 10; // 3.開始採樣 [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); }]; }
四、Core Motion框架結構示意圖
監控搖一搖的方法
方法1:經過分析加速計數據來判斷是否進行了搖一搖操做(比較複雜)
方法2:iOS自帶的Shake監控API(很是簡單)
判斷搖一搖的步驟:實現3個搖一搖監聽方法
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 檢測到搖動 */ - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 搖動取消(被中斷) */ - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 搖動結束 */
計步器是從iOS7開始引入(內部原理仍是加速計)
iOS7 : CMStepCounter --> iOS8過時
// 1.判斷計步器是否可用 if (![CMStepCounter isStepCountingAvailable]) { NSLog(@"計步器不可用"); return; } // 2.開始計步 // 2.1.建立計步器 CMStepCounter *stepCounter = [[CMStepCounter alloc] init]; // 2.2.開始計步 // updateOn : 用戶走了多少步以後,更新block NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [stepCounter startStepCountingUpdatesToQueue:queue updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) { if (error) return; // 1.GCD方式 // dispatch_sync(dispatch_get_main_queue(), ^{ // self.stepLabel.text = [NSString stringWithFormat:@"您一共走了%ld步", numberOfSteps]; // }); NSString *stepString = [NSString stringWithFormat:@"您一共走了%ld步", numberOfSteps]; [self.stepLabel performSelectorOnMainThread:@selector(setText:) withObject:stepString waitUntilDone:YES]; }];
iOS8用法
/** 計步器對象 */ @property (nonatomic, strong) CMPedometer *pedometer; #pragma mark - 懶加載代碼 - (CMPedometer *)pedometer { if (_pedometer == nil) { self.pedometer = [[CMPedometer alloc] init]; } return _pedometer; } // 1.判斷計步器是否可用 if (![CMPedometer isStepCountingAvailable]) { return; } // 2.開始計步 // 2.1.建立計步對象 // 2.2.開始計步 // FromDate : 從什麼時間開始計步 NSDate *date = [NSDate date]; [self.pedometer startPedometerUpdatesFromDate:date withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) { if (error) { NSLog(@"%@", error); return; } NSLog(@"您一共走了%@步", pedometerData.numberOfSteps); }];
計算前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); }];