开发者社区> 玄学酱> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

关于Taptic Engine震动反馈

简介:
+关注继续查看

What has Happened?

上周,leader 拿着 iPhone 7 打开了网易新闻,问我:『你看,你这里的下拉刷新是短震动,我们的手机数周遥控电视的时候只有长震动,产品那边问能不能用短震动』。

然后博主就去查看了一下关于短震动的方式,整个过程可以描述为——『资料真少!』。

不过最后通过一下午的搜集,最终还是总结整理出来了这份文档,也补充了自己对 iPhone 6s 之后对 Taptic Engine 的了解。

关于 Taptic Engine 震动反馈

Taptic Engine

先了解一个概念——Taptic Engine

Taptic Engine 是苹果产品上推出的全新震动模块,该元件最早出现在 Apple Watch 中。iPhone 6s 和 iPhone 6s Plus 中,也同样内置了Taptic Engine,在设计上有所升级。

Taptic Engine 振动模块为 Apple Watch 以及 iPhone 6s、iPhone 7 提供了 Force Touch 以及 3D Touch,不同的屏幕操作,可以感受到不同的振动触觉效果,带来更好的用户体验。

短震方法一 AudioServicesPlaySystemSound

常用调用:


  1. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); 

以上代码在各个型号手机中反应为长震

API 系统版本支持:


  1. __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0); 

APPLE 公开的 SystemSoundID 有:


  1. CF_ENUM(SystemSoundID) 
  2. kSystemSoundID_UserPreferredAlert = 0x00001000, 
  3. kSystemSoundID_FlashScreen = 0x00000FFE, 
  4. // this has been renamed to be consistent 
  5. kUserPreferredAlert = kSystemSoundID_UserPreferredAlert 
  6. }; 
  7.   
  8. CF_ENUM(SystemSoundID) 
  9. kSystemSoundID_Vibrate = 0x00000FFF 
  10. };  

以上类型 没有短震动 。

但通过以下代码,可以得到更多类型的震动:


  1. // 普通短震,3D Touch 中 Pop 震动反馈 
  2. AudioServicesPlaySystemSound(1520);  

  1. // 普通短震,3D Touch 中 Peek 震动反馈 
  2. AudioServicesPlaySystemSound(1519);  

  1. // 连续三次短震 
  2. AudioServicesPlaySystemSound(1521);  

但以上 ID 均未在 Apple 的 Documents 中描述。显然,这是调用了一些私有一些属性 。

关于是否调用了私有 API,也有一些讨论,可以查看这里(https://forums.developer.apple.com/thread/45628)。

短震方法二 获取 _tapticEngine

这种方法是从这里(https://unifiedsense.com/development/using-taptic-engine-on-ios.html)搜集到的。


  1. id tapticEngine = [[UIDevice currentDevice] performSelector: NSSelectorFromString(@"_tapticEngine"
  2. withObject:nil]; 
  3. [tapticEngine performSelector: NSSelectorFromString(@"actuateFeedback:"
  4. withObject:@(0)];  

或者:


  1. id tapticEngine = [[UIDevice currentDevice] performSelector: NSSelectorFromString(@"_tapticEngine"
  2. withObject:nil]; 
  3.   
  4. SEL selector = NSSelectorFromString(@"actuateFeedback:"); 
  5. int32_t arg = 1001; 
  6.   
  7. NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[tapticEngine methodSignatureForSelector:selector]]; 
  8. [inv setTarget:tapticEngine]; 
  9. [inv setSelector:selector]; 
  10. [inv setArgument:&arg atIndex:2]; 
  11. [inv invoke];  

显然, 这是调用了私有 API 。

这些方法,在实际测试的时候发现,在 iPhone 7 上调用没有震动反馈,在 iPhone 6S Plus 上调用有震动反馈,在 iPhone 6 上调用 无反馈。

短震方法三 UIImpactFeedbackGenerator

iOS10 引入了一种新的、产生触觉反馈的方式, 帮助用户认识到不同的震动反馈有不同的含义 。这个功能的核心就是由 UIFeedbackGenerator 提供。Apple 对于 UIImpactFeedbackGenerator 有一篇介绍文档。

UIFeedbackGenerator 可以帮助你实现 haptic feedback。它的要求是:

  • 支持 Taptic Engine 机型 (iPhone 7 以及 iPhone 7 Plus).
  • app 需要在前台运行
  • 系统 Haptics setting 需要开启

Apple 曾表示公开了 Taptic Engine 的 API,但是鲜有文档。在搜罗了各种资料后,可以认为 UIImpactFeedbackGenerator 即 Taptic Engine 的 公开 API。

它的调用方式是:


  1. UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle: UIImpactFeedbackStyleLight]; 
  2. [generator prepare]; 
  3. [generator impactOccurred];  

Others

观察 UIImpactFeedbackGenerator 你会发现它继承于 UIFeedbackGenerator。除了 UIImpactFeedbackGenerator 还有三种 FeedbackGenerator:

  1. UIImpactFeedbackGenerator
  2. UISelectionFeedbackGenerator
  3. UINotificationFeedbackGenerator

详情可参考 Apple 的 这篇 Reference(https://developer.apple.com/reference/uikit/uifeedbackgenerator?language=objc) 。

对于震动反馈的应用,Apple 也给出了示例场景:


  1. - (IBAction)gestureHandler:(UIPanGestureRecognizer *)sender { 
  2.   
  3. switch (sender.state) { 
  4. case UIGestureRecognizerStateBegan: 
  5.   
  6. // Instantiate a new generator. 
  7. self.feedbackGenerator = [[UISelectionFeedbackGenerator alloc] init]; 
  8.   
  9. // Prepare the generator when the gesture begins. 
  10. [self.feedbackGenerator prepare]; 
  11.   
  12. break; 
  13.   
  14. case UIGestureRecognizerStateChanged: 
  15.   
  16. // Check to see if the selection has changed... 
  17. if ([self myCustomHasSelectionChangedMethodWithTranslation:[sender translationInView: self.view]]) { 
  18.   
  19. // Trigger selection feedback. 
  20. [self.feedbackGenerator selectionChanged]; 
  21.   
  22. // Keep the generator in a prepared state. 
  23. [self.feedbackGenerator prepare]; 
  24.   
  25.   
  26. break; 
  27.   
  28. case UIGestureRecognizerStateCancelled: 
  29. case UIGestureRecognizerStateEnded: 
  30. case UIGestureRecognizerStateFailed: 
  31.   
  32. // Release the current generator. 
  33. self.feedbackGenerator = nil; 
  34.   
  35. break; 
  36.   
  37. default
  38.   
  39. // Do nothing. 
  40. break; 
  41.  

三种方法在测试机上不同的反馈结果

AUDIOSERVICESPLAYSYSTEMSOUND 1519 1520 1521
iPhone 7(iOS 10) peek 触感 pop 触感 三次连续短振
iPhone 6s Puls(iOS 9) peek 触感 pop 触感 三次连续短振
iPhone 6(iOS 10) 无振动 无振动 无振动
获取 _TAPTICENGINE  
iPhone 7(iOS 10) 无振动
iPhone 6s Puls(iOS 9) 长振
iPhone 6(iOS 10) 无振动
UIIMPACTFEEDBACKGENERATOR .LIGHT .MEDIUM .HEAVY
iPhone 7(iOS 10) 微弱短振 中等短振 明显短振
iPhone 6s Puls(iOS 9) 长振 长振 长振
iPhone 6(iOS 10) 无振动 无振动 无振动

总结一下,希望同样的代码能在更多的机型上实现短振,建议使用 AudioServicesPlaySystemSound(1519)。不过可能会涉及到调用私有 API。安全起见,可以使用 UIImpactFeedbackGenerator。




本文作者:佚名
来源:51CTO

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
代码显示苹果 iOS 16.2 将允许 iPhone 更频繁刷新“实时活动”,但也更加耗电
代码显示苹果 iOS 16.2 将允许 iPhone 更频繁刷新“实时活动”,但也更加耗电
0 0
华为主动找我合作,我放弃了!前端实现拍照识别垃圾分类最简单的方法!
2019年7月,上海作为第一个试运行垃圾分类的城市。当时的微信指数居高不下,引发了非常热烈的社会讨论,原因是上海当时执行得很坚决,社区垃圾桶旁都有带着红袖标的大爷大妈在看着,扔错了现场罚200元。 当时人心惶惶,有很多人担心自己分类不准确被罚款。上海市政府在宣传垃圾分类的时候就在推一个垃圾分类查询的小程序。我当时捕捉到了这个热点,花了一天时间使用uni-app快速搭建了一个拍照识别垃圾所属分类的小程序《垃圾分类精灵》(现在还在线,大家可以搜来用)。在短短半个月里获取到了6w多用户。
0 0
libvlc视频播放器: 补偿播放进度时间-更加精细
在上几个章节,介绍了如何使用libvlc开发一款视频播放器,libvlc除了具备普通播放器该有的功能,还有很多其他强大的功能,比如:播放rtsp\rtmp流媒体视频、录制画面为视频、各种滤镜等等;
0 0
BT发表线上影音软体Popcorn Time,新旧媒体又要头痛了!
随着一系列原创剧,特别是《纸牌屋》获得的成功,Netflix 走在挑战传统电视的大道上。这自然触动相关利益者的神经。最近,Comcast 开始对Netlfix 发起了攻势。作为一家内容提供商,Netflix 向消费者提供服务的时候,必须通过Comcast 这样的ISP业者 ,但Comcast 同时也是一个竞争者,因为它是电视和电影巨头NBCUniversal 的母公司。在这种情况下,Comcast 具有显而易见的优势地位。
0 0
彩色条形码轻松解决盲人购物难题!无需对焦,识别速度快12倍,还能发出过敏警告
彩色条形码轻松解决盲人购物难题!无需对焦,识别速度快12倍,还能发出过敏警告
0 0
Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态
原文地址:http://android.xsoftlab.net/training/monitoring-device-state/index.html 引言 作为一款优秀的APP应用,应该总是想方设法的降低电量的消耗。
659 0
IOS成长之路-使用系统默认声音、震动
<p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; font-family:Arial; font-size:14px; line-height:26px"> 导入框架:</p> <p style="margin-top:0px; margin-bottom:0px; pad
1729 0
论策略网游画面细节
论策略网游画面细节   在用户选择国家时,比如魏国,点魏国详情时,国旗可以做成飘动的,更有感觉
360 0
+关注
玄学酱
这个时候,玄酱是不是应该说点什么...
文章
问答
文章排行榜
最热
最新
相关电子书
更多
手机京东Crash自动分析处理系统
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载