如何为我们的app各种事件增加震动反馈
第一种方法
1. 利用<AudioToolbox>
框架完成
AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service)。System Sound Service是一种简单、底层的声音播放服务,但是它本身也存在着一些限制:
- 播放短的声音文件(支持振动)
- 你可以用它来播放一个短的声音(30秒以下)
- 这个接口不支持等级,位置,循环,时间的控制,同时播放功能。在同一时间,你只能播放一个声音。
-----------注意:数据必须是PCM或者IMA4格式
-----------注意:音频文件必须打包成.caf、.aif、.wav中的一种(注意这是官方文档的说法,实际测试发现一些.mp3也可以播放)
具有震动效果的函数有两个:
void AudioServicesPlayAlertSound ( SystemSoundID inSystemSoundID );
void AudioServicesPlaySystemSound ( SystemSoundID inSystemSoundID );
注:方法在iOS2.0后开始可以使用,在这个框架中还有许多其他的回馈方法可以自行尝试。
- 系统自带效果示例 :
// `Peek` 震动反馈 (weak boom)
AudioServicesPlaySystemSound(1519);
// `Pop` 震动反馈 (strong boom)
AudioServicesPlaySystemSound(1520);
//
AudioServicesPlaySystemSound(1521);
CF_ENUM(OSStatus)
{
kAudioServicesNoError = 0,
kAudioServicesUnsupportedPropertyError = 'pty?',
kAudioServicesBadPropertySizeError = '!siz',
kAudioServicesBadSpecifierSizeError = '!spc',
kAudioServicesSystemSoundUnspecifiedError = -1500,
kAudioServicesSystemSoundClientTimedOutError = -1501,
kAudioServicesSystemSoundExceededMaximumDurationError = -1502
};
// 可以尝试其他数值我试过例如1000、1005会有长震动效果
- 2 我们也可以自定义播放一些字及的声音震动效果
主要涉及函数-
创建对象:
OSStatus AudioServicesCreateSystemSoundID ( CFURLRef __nonnull inFileURL,SystemSoundID * __nonnull outSystemSoundID );
-
销毁对象:
OSStatus AudioServicesDisposeSystemSoundID ( SystemSoundID inSystemSoundID);
-
播放声音:(一共2个)
带有振动效果的播放:
void AudioServicesPlayAlertSound ( SystemSoundID inSystemSoundID );
void AudioServicesPlaySystemSound ( SystemSoundID inSystemSoundID );
-
播放完成之后执行的操作:(其中弟四个参数是一个C语言的函数)
OSStatus AudioServicesAddSystemSoundCompletion ( SystemSoundIDinSystemSoundID, CFRunLoopRef __nullable inRunLoop, CFStringRef __nullableinRunLoopMode, AudioServicesSystemSoundCompletionProc __nonnullinCompletionRoutine, void * __nullable inClientData );
-
具体使用示例:
- (void)playSoundAndShake {
//1.获得音效文件的全路径
NSURL *url=[[NSBundle mainBundle] URLForResource:@"*****.wav" withExtension:nil];
//2.加载音效文件,创建音效ID(SoundID,一个ID对应一个音效文件)
SystemSoundID soundID = 12345;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &soundID);
// 完成播放之后执行的soundCompleteCallback函数
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, soundCompleteCallback, NULL);
//3.播放音效文件
//下面的两个函数都可以用来播放音效文件,第一个函数伴随有震动效果
AudioServicesPlayAlertSound(soundID);
//AudioServicesPlaySystemSound(<#SystemSoundID inSystemSoundID#>)
}
#pragma mark - 播放完成之后执行的函数
void soundCompleteCallback()
{
NSLog(@"播放完成");
}
- (void)deallocSound:(SystemSoundID) soundID {
//把需要销毁的音效文件的 soundID 传递给它既可销毁
//AudioServicesDisposeSystemSoundID(soundID);
}
2. 利用<UIKit>框架的“UIImpactFeedbackGenerator”类完成
在查看系统 API 时你会发现类名前标注着UIKIT_CLASS_AVAILABLE_IOS_ONLY(10_0)
这个类是在iOS10之后才可用
使用示例:
UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle: UIImpactFeedbackStyleLight];
[generator prepare];
[generator impactOccurred];
其中涉及枚举很容易理解
typedef NS_ENUM(NSInteger, UIImpactFeedbackStyle) {
UIImpactFeedbackStyleLight,
UIImpactFeedbackStyleMedium,
UIImpactFeedbackStyleHeavy
};
sssssssss