// // //

大钟威武

从白痴到大师的点滴积累

学习iOS传感器的使用

| Comments

iOS涉及到的传感器

不用查资料,用过iPhone的同学都知道。iphone中有加速度传感器,可以感知手机在哪个方向上有加速度,比如屏幕的翻转、飞行控制游戏等都是利用这个特征做的;有指南针(貌似叫陀螺仪?),可以知道你的方向;还有定位装置,可以知道你现在的位置在哪里。

加速度传感器相关功能是由CoreMotion提供;指南针、定位信息相关功能由CoreLocation提供。

CoreMotion

在CoreMotion.framework中,有下面这些类:

1
2
3
4
5
6
7
CMAccelerometerData
CMAttitude
CMDeviceMotion
CMGyroData
CMLogItem
CMMagnetometerData
CMMotionManager

每个是做什么的,可以在官方文档中阅读,就不在这翻译了。其中实现对设备加速度的识别,主要是使用CMMotionManager。

CMMotionManager

如何使用CMMotionManager?

Step1:产生一个CMMotionManager的实例mManager。

Step2:实例使用方法isAccelerometerAvailable判断加速度传感器是否可用。

Step3:如果可用,则通过方法setAccelerometerUpdateInterval设定采样频率。

Step4:最后使用startAccelerometerUpdatesToQueue:withHandler开始采样及对采样进行处理。

示例代码

我在下面的代码中,实现了一个小球在一个框中运动,运动的轨迹是根据手机的倾斜角度计算,运动的方向同倾斜的角度一致,并且倾斜角度越大运动速度越快。 代码下载 在代码的实现过程中,对view的层次有了更深的体会。此外,在给label供数的时候,发现刚好使用代理的方式,算是也对代理做了联系。

编码过程中遇到七七八八问题的记录

Code Sign error:

着手时,借鉴了这个代码,在编译时遇到了这个问题:

Code Sign error: The identity 'iPhone Developer: Haomian Wang (33P29785DD)' doesn't match any valid certificate/private key pair in the default keychain

原因:

CodeSigning签署的不是你的provisioning,没法在真机上使用。

解决办法:

在TARGETS中的Build Settings里,找Code Signing Identity,里面把不是自己的developer改成自己的provisioning。

注:

借鉴的这份代码是使用acceleroImeter:didAccelerate方法来处理扑捉到的加速度信息,但这个方法已经在iOS5废弃了,现在都使用CoreMotion框架来实现。

未添加CoreMotion.framework

编译自己代码时,首先出现了如下错误:

原因:

原因是代码中使用了CoreMotion,但工程中没有添加CoreMotion.framework。这很常见:在使用CoreLocation等framework时,也要想着在工程中添加framework。

解决办法: 在下图处添加CoreMotion.framework

给工程改名字导致编译不过

这是个题外话,当时想给工程改个名字,结果改了之后,编译不过。 原因:

原因都是名字、路径更改导致的找不到文件。

解决办法:

改名字注意三点:

  1. 修改了Project的名字后,Xcode会提示你一些其他地方也需要修改,你就按着提示修改;
  2. 也修改本地文件夹的名字后,注意xcode工程中的文件列表文件名是否会变为红色,如果是红色,需要你再想办法重新加一下路径;
  3. 工程中的BuildSettings,这里最好搜一下你原来的名字,进行更改。我遇到的编译不过都是这里的路径还保留着原来的名字,未作更改。

Comments