iOS中是否有用于自定义振动的API?


72

从iOS 5开始,用户可以为警报和铃声创建自定义振动模式。以下屏幕快照显示了用于创建一个的UI(iOS 6中的“联系人”应用程序):

用于在iOS 6中创建自定义振动的UI的屏幕截图

我一直在搜索,包括文档,但找不到任何公开自定义振动的创建或回放的公共API。最接近的是使用该AudioToolbox框架来产生短而持续的振动:

有人知道是否有用于自定义振动的API吗?不一定必须是公共API。我很好奇知道Contacts应用程序使用什么。有人知道吗?

PS其他人_CTServerConnectionCreateCoreTelephony示例)中提出了建议。我尝试过,但是由于某种原因无法振动。

2015年10月更新:

iOS 9中有新的私有API,可与兼容设备中的Taptic Engine交互。有关更多信息,请参见iOS 9中的Taptic


1
Core Haptics即将在iOS 13中发布!目前处于测试阶段。有关更多信息,请参见此处的“创建自定义触觉模式” 。
Peacetype '19

Answers:


105

在联系应用程序中搜索了几个小时之后,我就知道了它是如何工作的。

ABNewPersonViewControlle调用ToneLibrary框架中的某个类来执行此操作。

调用堆栈如下所示:

0   CoreFoundation                  0x3359a1d4 CFGetTypeID + 0
1   CoreFoundation                  0x33596396 __CFPropertyListIsValidAux + 46
2   CoreFoundation                  0x33517090 CFPropertyListCreateData + 124
3   AudioToolbox                    0x38ac255a AudioServicesPlaySystemSoundWithVibration + 158
5   ToneLibrary                     0x35a7811a -[TLVibrationRecorderView vibrationComponentDidStartForVibrationRecorderTouchSurface:] + 38
6   ToneLibrary                     0x35a772b2 -[TLVibrationRecorderTouchSurface touchesBegan:withEvent:] + 342
7   UIKit                           0x3610f526 -[UIWindow _sendTouchesForEvent:] + 314
8   UIKit                           0x360fc804 -[UIApplication sendEvent:] + 376

在网上搜索“ AudioServicesPlaySystemSoundWithVibration”后,我什么也没找到。

因此,我决定亲自调查一下。它是AudioToolbox框架中的私有功能。

函数的声明就像

void AudioServicesPlaySystemSoundWithVibration(SystemSoundID inSystemSoundID,id arg,NSDictionary* vibratePattern)

“ inSystemSoundID”是SystemSoundID,就像“ AudioServicesPlaySystemSound”一样,传递“ kSystemSoundID_Vibrate”。

“ arg”并不重要,将nil传递给它,一切仍然可以正常工作。

“ vibratePattern”是“ NSDictionary”的指针,Contact App传递为{Intensity = 1; OffDuration = 1; OnDuration = 10; }记录用户输入。

但是仅调用此函数将使振动永不停止。所以我必须找到一些功能来停止它。

答案是“ AudioServicesStopSystemSound”。它也是AudioToolbox框架中的私有功能。

函数的声明就像

void AudioServicesStopSystemSound(SystemSoundID inSystemSoundID)

我想Contact App在touchesBegan方法中使用AudioServicesPlaySystemSoundWithVibration,在touchEnd方法中使用AudioServicesStopSystemSound达到此效果。

TLVibrationController将管理振动模式对象以记录您输入的过程。

最后,它生成一个字典以传递到AudioServicesPlaySystemSoundWithVibration以重播整个过程,如下所示:

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
NSMutableArray* arr = [NSMutableArray array ];

[arr addObject:[NSNumber numberWithBool:YES]]; //vibrate for 2000ms
[arr addObject:[NSNumber numberWithInt:2000]];

[arr addObject:[NSNumber numberWithBool:NO]];  //stop for 1000ms
[arr addObject:[NSNumber numberWithInt:1000]];

[arr addObject:[NSNumber numberWithBool:YES]];  //vibrate for 1000ms
[arr addObject:[NSNumber numberWithInt:1000]];

[arr addObject:[NSNumber numberWithBool:NO]];    //stop for 500ms
[arr addObject:[NSNumber numberWithInt:500]];

[dict setObject:arr forKey:@"VibePattern"];
[dict setObject:[NSNumber numberWithInt:1] forKey:@"Intensity"];


AudioServicesPlaySystemSoundWithVibration(4095,nil,dict);

因此,如果您想在iOS中自定义振动。使用AudioServicesPlaySystemSoundWithVibration和AudioServicesStopSystemSound。


5
注意:AudioServicesPlaySystemSoundWithVibration仅在iOS6上可用。
凯文·曹

2
@Jonny FOUNDATION_EXTERN“ AudioServicesPlaySystemSoundWithVibration(unsigned long,objc_object *,NSDictionary *)可以解决问题。别忘了还要与AudioToolbox.framework链接
JonasG 2013年

9
现在,Apple在提交离子时拒绝AudioServicesPlaySystemSoundWithVibration。
Max Tymchii

3
有什么方法可以实现自定义振动,而不会被苹果拒绝?
bobsacameno 2014年

2
这只会使您收到这样的一封好邮件:**我们发现您最近为“ Appname”发送的邮件中存在一个或多个问题。要处理您的交付,必须纠正以下问题:非公共API的使用:该应用在应用名称中引用了非公共符号:_AudioServicesPlaySystemSoundWithVibration **
Edoardo

4

有一个名为HapticKeyboard的项目可以执行此操作。请参阅:http : //code.google.com/p/zataangstuff/source/browse/trunk/HapticKeyboard/Classes/HapticKeyboard.m?r=93

具体来说,看看最后一组功能

_CTServerConnectionSetVibratorState(&x, connection, 0, 0, 0, 0, 0);

有两个问题:

  1. 我怀疑您会允许您的应用进入应用商店。苹果会将其视为消耗用户的电池,他们对用户体验非常严格
  2. 这可能需要越狱。自从我上次玩这个游戏以来,已经有多个新的iOS版本,因此很难说

感谢您的回答。在问问题之前,我确实已经看过HapticKeyboard(已有4年历史了)。我试图按照代码中的描述触发振动,但是它对我不起作用。我正在寻找Apple用于在通讯录中实现自定义振动的API,如屏幕截图所示。
安德鲁

1
苹果公司的HapticEngine以及其他设备上的所有振动响应实际上都在消耗电池电量。顺便说一句,代码链接已断开。
凯琳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.