gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:32:26 26 4
gpt4 key购买 nike

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

Screenshot of UI for creating custom vibrations in iOS 6

我一直在四处搜索,包括文档,但我找不到任何公开自定义振动的创建或播放的公共(public) API。最接近的是使用 AudioToolbox 框架来播放短促、持续的振动:

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

有人知道是否有自定义振动的 API 吗? 不一定非得是公共(public) API。我很想知道联系人应用程序使用什么。有人知道吗?

附言其他人建议在 CoreTelephony ( example ) 中使用 _CTServerConnectionCreate。我试过了,但出于某种原因无法获得任何振动。

October 2015 Update:

There are new private APIs in iOS 9 to interact with the Taptic Engine in compatible devices. See Taptic in iOS 9 for more.

最佳答案

在 Contact App 中钻研几个小时后,我弄明白了它是如何工作的。

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 框架中的私有(private)函数。

函数的声明是这样的

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

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

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

“vibratePattern”是“NSDictionary”的指针,Contact App传入 { 强度 = 1; 关闭持续时间 = 1; OnDuration = 10; } 用于记录用户输入。

但是只要调用这个函数,震动就会一直不停。所以我必须找到一些函数来阻止它。

答案是“AudioServicesStopSystemSound”。它也是 AudioToolbox 框架中的私有(private)函数。

函数的声明是这样的

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。

关于ios - iOS 中是否有用于自定义振动的 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com