前几天项目中用到了一下CoreMotion框架,觉得iOS中的传感器还是挺好玩的,又花了点时间去了解了一下iOS中其他一些常用的传感器应用,今天简单做下总结。
iOS中的传感器大致有以下几种:
- 运动传感器\加速度传感器\加速计(Motion/Accelerometer Sensor)
- 环境光传感器(Ambient Light Sensor)
- 距离传感器(Proximity Sensor)
- 磁力计传感器(Magnetometer Sensor)
- 内部温度传感器(Internal Temperature Sensor)
- 湿度传感器(Moisture Sensor)
- 陀螺仪(Gyroscope)
… …
网上找到这个图片,可以做下参考:
接下来针对常用的一些传感器,做下解释:
一 , 距离传感器的使用
//打开传感器
[UIDevice currentDevice].proximityMonitoringEnabled =YES;
//监听有物品靠近还是离开
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(Change:) name:UIDeviceProximityStateDidChangeNotification object:nil];
-(void)Change:(NSNotificationCenter*)center{
if ([UIDevice currentDevice].proximityState) {
NSLog(@"物品靠近");
}else{
NSLog(@"物品离开");
}
}
二,加速计,陀螺仪,磁力仪(CoreMotion)
1 加速计 : 可以理解为物体所受外力沿着三个轴的分量 (在物体静止或者匀速直线运动的情况下,外界的力指的地球牵引力,利用x y z三个方向的分量可以知道手机在三维空间内的一个状态,从而实现一些功能。 例如, 屏幕中有个箭头一直指向下方(重力投影在屏幕上的方向)。
获取x y z数据方式有两种:主动获取(pull),基于代码块获取(push)。
主动获取: 需要的时候调用系统方法去获取
// 创建CMMotionManager对象
self.motionManager = [[CMMotionManager alloc] init]; // ①
// 如果CMMotionManager的支持获取加速度数据
if (self.motionManager.accelerometerAvailable)
{
[self.motionManager startAccelerometerUpdates];
self.motionManager.accelerometerUpdateInterval= 0.1; //设定每0.1秒更新一次数据
}
else
{
NSLog(@"该设备不支持获取加速度数据!");
}
//当需要x y z数据的时候,调用方法获取
CMAcceleration acceleration=_motionManager.accelerometerData.acceleration;
NSLog(@"%f---%f---%f",acceleration.x,acceleration.y,acceleration.z);
代码块获取: 设定更新时间,每次更新后主动返给我们
// 创建CMMotionManager对象
self.motionManager = [[CMMotionManager alloc] init]; // ①
// 如果CMMotionManager的支持获取加速度数据
if (self.motionManager.accelerometerAvailable)
{
[self.motionManager startAccelerometerUpdates];
self.motionManager.accelerometerUpdateInterval= 0.1; //设定每0.1秒更新一次数据
}
else
{
NSLog(@"该设备不支持获取加速度数据!");
}
//此方法每0.1秒就会返回一次 x y z数据
[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
//重力再各个轴上的分量
NSLog(@" 加速度%@", [NSString stringWithFormat:@"加速计:X:%.3f,Y:%.3f,Z:%.3f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z] );
}
2 陀螺仪
陀螺仪与加速计类似,存在pull 与Push获取方法, 直接贴代码
// 如果CMMotionManager的支持获取陀螺仪数据
if (self.motionManager.gyroAvailable)
{
[self.motionManager startGyroUpdates];
}
else
{
NSLog(@"该设备不支持获取陀螺仪数据!");
}
//主动获取:
CMGyroData* gyroData = self.motionManager.gyroData;
self.gyroLabel.text = [NSString stringWithFormat:
@"绕各轴的转速为\n--------\nX轴: %+.2f\nY轴: %+.2f\nZ轴: %+.2f",
gyroData.rotationRate.x,
gyroData.rotationRate.y,
gyroData.rotationRate.z];
//自动获取:
[self.motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMGyroData *gyroData, NSError *error) {
NSLog(@"gyro === %@", [NSString stringWithFormat:@"旋转角度:X:%.3f,Y:%.3f,Z:%.3f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData.rotationRate.z] );
}
3 磁力仪
// 如果CMMotionManager的磁场数据可用
if (self.motionManager.magnetometerAvailable)
{
// 主动请求获取磁场数据
CMMagnetometerData* magnetometerData = self.motionManager.magnetometerData;
self.magnetometerLabel.text = [NSString stringWithFormat:
@"磁场数据为\n--------\nX轴: %+.2f\nY轴: %+.2f\nZ轴: %+.2f",
magnetometerData.magneticField .x,
magnetometerData.magneticField .y,
magnetometerData.magneticField .z];
自动更新
self.motionManager startMagnetometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMMagnetometerData * _Nullable magnetometerData, NSError * _Nullable error) {
@"磁场数据为\n--------\nX轴: %+.2f\nY轴: %+.2f\nZ轴: %+.2f",
magnetometerData.magneticField .x,
magnetometerData.magneticField .y,
magnetometerData.magneticField .z];
}
}
}
手机摇一摇(比较简单, 直接贴代码)
//开始摇一摇
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"用户摇一摇");
}
-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
//摇一摇被打断(比如摇的过程中来电话)
}
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
//摇一摇结束的时候操作
}
三, 计步器
要获取计步信息, 可以直接调用系统的健康数据,基于HealthKit框架的。 可以参考
http://www.jianshu.com/p/42e913588380
那么, 不用HealthKit如何实现计步那?
参考 http://www.jianshu.com/p/8f896172fb3d
简单实现方法如下
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *stepLabel;
@property(nonatomic,strong)CMPedometer *step;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
if (![CMPedometer isStepCountingAvailable ]) {
NSLog(@"不可用");
return;
}
//开始计步
[self.step startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
NSLog(@"%@",pedometerData.numberOfSteps);
self.stepLabel.text =[NSString stringWithFormat:@"%@",pedometerData.numberOfSteps];
}];
}