美文网首页虾写前端我不是程序猿,请叫我攻城狮
iOS开发-微信 摇一摇(CoreMotion/CoreMoti

iOS开发-微信 摇一摇(CoreMotion/CoreMoti

作者: Mr_某某某 | 来源:发表于2016-05-24 16:15 被阅读613次

    做IOS开发也一年了,接触的的项目有三个左右,最近接触了个项目,需求是摇一摇。在网上找了很多此类的帖子,实验了很多次。例如 调用系统加速器(UIAccelerometer)结果一直给警告,原来IOS5之后这个方法就被苹果弃用了。

弃用的写法:

//获得单例对象

UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];

//设置代理

accelerometer.delegate = self;

//设置采样间隔 1/60.0 就是 1秒采集60次

accelerometer.updateInterval = 1 / 60.0;

//实现代理:

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{

NSLog(@"x加速度%f--y加速度%f--z加速度%f",acceleration.x,acceleration.y,acceleration.z);

}

    或者可以用以下方法,但是不推荐,因为可能会失效。

//ViewController 加入以下两方法

-(BOOL)canBecomeFirstResponder  {

    //让当前controller可以成为firstResponder,这很重要returnYES; 

 }  

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event

{

    if(event.subtype==UIEventSubtypeMotionShake) {

        //做你想做的事

     } 

 }

//在viewDidView中调用以下消息,主动让当前controller成为firstResponder[self becomeFirstResponder];

//已经不需要其它多余代码了

它失效的时候,系统所有摇一摇撤销重做都会不起作用,从而导致包括所有关联的Shake事件也不起作用。失效原因或在什么情况下失效,目前还没有相关资料。据这两天个人观察,大多发生在手机放在裤袋中走10多分钟路之后(iPhone5S iOS 7.05).是否因为摇得太久了,系统为了省电就关闭此功能呢?希望大家也拿自己手机来试一试,我们一起来看看这到底是什么问题。

    要恢复,最直接的是连接iTunes,否则,就要让手机平放一段时间,但时候平放一天都没有恢复。所以说此方式不太稳定,微信及其它有摇一摇功能的应用,他们的摇一摇并不受此影响,而且微信的摇一摇动作比ShakeToEdit要轻,可以讲手动动一下就激活了。于是我认为,这些应用都放弃了ShakeToEdit,使用了加速仪,自己重新实现。

    使用加速仪与使用相机,声音之类不同,不需要经过用户允许,也没有访问限制,当然也没什么危害,是个基本配备。那要怎么做?

下面费话不多说,直接开始吧:

第一步,为项目TARGET添加CoreMotion.framework

第二步,引入头文件

#import <CoreMotion/CoreMotion.h>

第三步,使用CMMotionManager

注意,当前应用只能有一个CMMotionManager实例,多个实例会影响接收速率

第四步,实例并初始化加速仪

self.motionManager = [[CMMotionManageralloc] init];//一般在viewDidLoad中进行self.motionManager.accelerometerUpdateInterval = .1;//加速仪更新频率,以秒为单位

第五步,开始接收加速仪数据(startAccelerometerUpdatesToQueue:withHandler:

-(void)viewDidAppear:(BOOL)animated{

[self startAccelerometer];

}

-(void)startAccelerometer{

    //以push的方式更新并在block中接收加速度

    [self.motionManagerstartAccelerometerUpdatesToQueue:[[NSOperationQueue alloc]init]withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) 

  {

    [self outputAccelertionData:accelerometerData.acceleration];

    if(error){

    NSLog(@"motion error:%@",error);

    }

  }];

}

-(void)outputAccelertionData:(CMAcceleration)acceleration{

    //综合3个方向的加速度

     doubleaccelerameter =sqrt( pow( acceleration.x ,2) + pow( acceleration.y ,2)+ pow( acceleration.z ,2) );

     //当综合加速度大于2.3时,就激活效果(此数值根据需求可以调整,数据越小,用户摇动的动作就越小,越容易激活,反之加大难度,但不容易误触发)

    if(accelerameter>2.3f) {

    //立即停止更新加速仪(很重要!)

    [self.motionManager stopAccelerometerUpdates];

    dispatch_async(dispatch_get_main_queue(), ^{

    //UI线程必须在此block内执行,例如摇一摇动画、UIAlertView之类});

    }

}

-(void)viewDidDisappear:(BOOL)animated{

    //停止加速仪更新(很重要!)

    [self.motionManager stopAccelerometerUpdates];

}

最后一步

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

//viewDidAppear中加入[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(receiveNotification:)name:UIApplicationDidEnterBackgroundNotificationobject:nil];

[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(receiveNotification:)name:UIApplicationWillEnterForegroundNotificationobject:nil];

//viewDidDisappear中取消监听

[[NSNotificationCenter defaultCenter] removeObserver:selfname:UIApplicationDidEnterBackgroundNotificationobject:nil];[[NSNotificationCenter defaultCenter] removeObserver:selfname:UIApplicationWillEnterForegroundNotificationobject:nil];

//对应上面的通知中心回调的消息接收

-(void)receiveNotification:(NSNotification *)notification{if([notification.name        isEqualToString:UIApplicationDidEnterBackgroundNotification])   {           

       [self.motionManager stopAccelerometerUpdates];    

   }else{       

       [selfstartAccelerometer];

   }

}

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

一些可改进的地方:

1)摇一摇动作捕捉——如果仅是以加速度大小来判定,有可能用户突然快速移动手机时就激活了摇动,但用户比较稍稍慢一些来回晃动手机却不会激活,可能与用户期望的稍微有出入。系统的ShakeToEdit就能做得比较到位。

我们可以结合定时器与加速度的正反方向来更精确判定用户的摇一摇动作,例如:综合加速度改为带方向的向量,然后当1.5秒内有相反两个方向大于某个数值的加速度,才算为一个摇动行为。这个1.5秒时间需要通过实际测试来取值,当某次取得的加速度值大于某个值开始统计下一个加速度向量,此值也需要实测来取值,可能1.5左右就够了。

2)App状态更改——如果激活的摇一摇是个长时间等待行为,例如弹出ActionSheet让用户选择操作。在用户进行下一步操作前,ActionSheet没消失前,不应该启动下一次监听,包括应用从后台回到当前状态后,也要判断用户是否有过下一步行为。

参考文献:

https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html#//apple_ref/doc/uid/TP40009541-CH6-SW1

相关文章

  • iOS开发-微信 摇一摇(CoreMotion/CoreMoti

    做IOS开发也一年了,接触的的项目有三个左右,最近接触了个项目,需求是摇一摇。在网上找了很多此类的帖子,实验了...

  • ios 摇一摇实现

    原文地址:iOS使用CoreMotion实现摇一摇功能 现在网上介绍的iOS摇一摇功能,基本是以借助系统的Shak...

  • 【iOS】传感器

    距离传感器 摇一摇 计步器 CoreMotion框架 CoreMotion是一个专门处理Motion的框架,其中包...

  • 小细节大体验-微信摇一摇

    微信摇一摇-性别为女时 微信摇一摇-性别为男时

  • iOS摇一摇功能实现

    看到微信的摇一摇功能是不是感觉很神奇呢?其实在iOS里想要实现摇一摇功能很简单,方法如下: 先在targets -...

  • 关于ios端,摇一摇页面音频无法播放

    最近在做微信网站,做到一个摇一摇页面时,安卓出现声音,但是在ios端没声音???查到说ios不把摇一摇为交互动作,...

  • 微信摇奖盒为什么能有效提高商家的营销效果

    理解微信摇奖盒概念的前提 很多人用过微信的“摇一摇”功能,微信的这个“摇一摇”,可谓是神通广大。其中,“摇人”功能...

  • OC:传感器

    距离传感器 加速计 coreMotion 摇一摇. 监听简单的手机摇动,利用系统的方法. 计步器,导入 :

  • 微信摇一摇

    最近有做到摇一摇, 发现还是很简单的, 随手一记主要实现的功能是: 开始要摇动的时候, 图片会向两边分开, 并且会...

  • 解密iBeacon物联网和火到爆的摇一摇

    春晚的微信摇一摇抢红包,让摇一摇功能又火了一把。如今微信开放的摇一摇周边接口可能在未来的很多年会一直融入到我们的日...

网友评论

  • RenXiangCode:谢谢你的文章, 想请教你一个问题,我要息屏之后要实现摇一摇功能,目前我只能实现亮屏摇一摇功能,息屏之后就不行了,初步估计是和摇一摇那几个代码写的位置有关系
    Mr_某某某:@晓恩二 这不一样。酷狗是音乐,是可以后台的。像蓝牙,定位,音乐,都是可以真后台的。
    RenXiangCode:@Mr_某某某 酷狗音乐实现了,因为业务需求,还必须这样,有什么方法吗我现在想在AppDelegate中监听一下摇一摇事件你觉得呢
    Mr_某某某:你这个不太好实现。或者说,根本不好实现。

本文标题:iOS开发-微信 摇一摇(CoreMotion/CoreMoti

本文链接:https://www.haomeiwen.com/subject/nquzrttx.html