但通过以下代码,可以得到更多类型的震动:
// 普通短震,3D Touch 中 Peek 震动反馈
AudioServicesPlaySystemSound(1519);
// 普通短震,3D Touch 中 Pop 震动反馈
AudioServicesPlaySystemSound(1520);
// 连续三次短震
AudioServicesPlaySystemSound(1521);
但以上 ID 均未在 Apple 的 Documents 中描述。显然,这是调用了一些私有一些属性 。
关于是否调用了私有 API,也有一些讨论,可以查看这里。
短震方法二 获取 _tapticEngine
这种方法是从这里搜集到的。
id tapticEngine = [[UIDevice currentDevice] performSelector: NSSelectorFromString(@"_tapticEngine")
withObject:nil];
[tapticEngine performSelector: NSSelectorFromString(@"actuateFeedback:")
withObject:@(0)];
或者:
id tapticEngine = [[UIDevice currentDevice] performSelector: NSSelectorFromString(@"_tapticEngine")
withObject:nil];
SEL selector = NSSelectorFromString(@"actuateFeedback:");
int32_t arg = 1001;
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[tapticEngine methodSignatureForSelector:selector]];
[inv setTarget:tapticEngine];
[inv setSelector:selector];
[inv setArgument:&arg atIndex:2];
[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。
它的调用方式是:
UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle: UIImpactFeedbackStyleLight];
[generator prepare];
[generator impactOccurred];
Others
观察 UIImpactFeedbackGenerator 你会发现它继承于 UIFeedbackGenerator。除了 UIImpactFeedbackGenerator 还有三种 FeedbackGenerator:
UIImpactFeedbackGenerator UISelectionFeedbackGenerator UINotificationFeedbackGenerator详情可参考 Apple 的 这篇 Reference 。
对于震动反馈的应用,Apple 也给出了示例场景:










