iOS使用CoreMotion实现摇一摇功能

2020-01-21 06:15:48王振洲

最后一步

至此,摇一摇核心已经实现,但还差最后一步:当App退到后台时必须停止加速仪更新,回到当前时重新执行。否则应用在退到后台依然会接收加速度更新,可能会与其它当前应用冲突,产生不好的体验。所以,分别在viewDidAppear和viewDidDisappear中加入如下监听:


//viewDidAppear中加入 
[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(receiveNotification:) 
     name:UIApplicationDidEnterBackgroundNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(receiveNotification:) 
     name:UIApplicationWillEnterForegroundNotification object:nil]; 

//viewDidDisappear中取消监听 
[[NSNotificationCenter defaultCenter] removeObserver:self 
     name:UIApplicationDidEnterBackgroundNotification object:nil]; 
[[NSNotificationCenter defaultCenter] removeObserver:self 
     name:UIApplicationWillEnterForegroundNotification object:nil]; 

//对应上面的通知中心回调的消息接收 
-(void)receiveNotification:(NSNotification *)notification 
{ 
  if ([notification.name  
    isEqualToString:UIApplicationDidEnterBackgroundNotification]) 
  { 
    [self.motionManager stopAccelerometerUpdates]; 
  }else{ 
    [self startAccelerometer]; 
 }} 

至此,所有使用加速仪实现摇一摇功能的实现方式已介绍完毕。

一些可改进的地方:

  1) 摇一摇动作捕捉——如果仅是以加速度大小来判定,有可能用户突然快速移动手机时就激活了摇动,但用户比较稍稍慢一些来回晃动手机却不会激活,可能与用户期望的稍微有出入。系统的ShakeToEdit就能做得比较到位。
   我们可以结合定时器与加速度的正反方向来更精确判定用户的摇一摇动作,例如:综合加速度改为带方向的向量,然后当1.5秒内有相反两个方向大于某个数值的加速度,才算为一个摇动行为。这个1.5秒时间需要通过实际测试来取值,当某次取得的加速度值大于某个值开始统计下一个加速度向量,此值也需要实测来取值,可能1.5左右就够了。