我最近研究了当您切换静音开关或连接到电源时 SpringBoard 如何播放它的振动。它只使用AudioServicesPlaySystemSound
相同的参数(0x452 用于充电,0x453 用于静音开关)与静音开关无关。我见过通话的唯一地方AudioServicesPlaySystemSoundWithVibration
是添加公告时。
这适用于 iOS 5-7。唯一的区别在于 iOS 5 公告的使用AudioServicesPlaySoundWithBehavior
,因为AudioServicesPlaySystemSoundWithVibration
仅从 iOS 6 开始可用。
更新
首选项应用程序使用AudioServicesPlaySystemSound
0x547 或 0x546 作为参数。您看不到 MobileSubstrate 的原因是因为 Preferences 应用程序AudioToolbox
在运行时使用加载框架,dlopen
然后获取指向AudioServicesPlaySystemSound
with 的指针dlsym
。要在这种情况下挂钩该函数,您需要等到 Preferences 应用程序获得指针,然后才挂钩它。
更新 2
SpringBoard 还使用 CoreMedia.framework API 来播放振动。这里的所有论点都只是从反汇编中的猜测。我对 C 结构参数和浮点指令没有太多经验。
FigVibratorPlayVibrationWithDictionary(CFDictionaryRef pattern, BOOL, float)
. 最后两个参数我不知道——它们被设置为 NO 和 1.0f。
FigVibratorPlayVibration(float, CMTime, CMTime, CTime)
.
上面的函数最有可能被 iOS 使用,但还有一些其他函数值得挂钩:
FigVibratorStartOneShot(float, CMTime)
FigVibratorStartRepeating
. 第一个参数可能是一个浮点数,但对其他人不知道 - 它是一些 CMTime 参数。