如何在点击自定义键盘button时播放声音

我一直在为iOS 8制作一个自定义键盘,一切都很顺利,但是我仍然无法摆脱这种敲击声。

我search这个问题的高低,并尝试了几种方法,包括

  1. 使用AudioToolbox
  2. 使用AVFoundation
  3. 将tock.caf放入我的包中,然后播放它

其中一些在模拟器中工作,但是没有一个在我的设备中工作。 任何一个在自定义键盘按键上敲击都能成功播放声音的人都会在意分享一些工作代码吗? 如果代码可以遵守声音设置,那么这是最好的。

正如上面提到的Farzad Nazifi在全新安装后Allow openAcesess ,解决了我的问题。 我推荐一个更简单的解决scheme来playing system keyboard tap sound

Swift和Objective-C都是一样的 `我们不需要导入任何自定义的声音文件就可以播放系统的tap声音。

导入AudioToolbox框架:

#import <AudioToolbox/AudioToolbox.h>

 AudioServicesPlaySystemSound(1104) 

这个代码是在iOS 8 beta 5中testing的,我希望苹果能够修正GM版本中的bug(如果是bug的话)。

导入框架:

 #import <AudioToolbox/AudioToolbox.h> 

并使用:

 AudioServicesPlaySystemSound(1104); 

最后我从其他SO 线索得到答案。

 - (void)playSound { NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"Tock" ofType:@"caf"]; SystemSoundID soundID; AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); AudioServicesPlaySystemSound (soundID); } 

我已经实现并validation了此方法在iOS8 Beta 2上的模拟器和设备上都可以工作。

播放声音需要OpenAccess,我不知道苹果为什么这样做,但现在是这样。 这也将解决播放声音后不工作的滞后和问题。

您可以通过在键盘的info.plist中为RequestsOpenAccess Key的值设置YES来获得OpenAccess。

接下来,您应该将AudioToolbox导入到您的项目中,然后使用以下代码:

 - (void)playSound{ NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"Tock" ofType:@"caf"]; SystemSoundID soundID; AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); AudioServicesPlaySystemSound (soundID); 

现在安装您的键盘,并将其添加到您的键盘Openaccess,它应该工作。

你可以使用playInputClick()方法。

迅速:

 UIDevice.currentDevice().playInputClick() 

Objective-C的:

 [[UIDevice currentDevice] playInputClick]; 

详细信息请参阅文档 。

这里的关键是iOS只能播放这里描述的文件types。 iOS无法播放.caf文件types。 下面的代码应该在iOS上正常工作。 您可以使用此网站将您的.caf文件转换为他们在网站上提供的兼容的任何文件。 我已经testing过了,而.caf转换工作,即使没有指定任何地方。

 -(void)buttonPressed:(UIButton *)theButton { [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil]; AVAudioPlayer *av = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"Tock" ofType:@"mp3"]] error:nil]; [av setVolume:1.0]; [av setNumberOfLoops:0]; [av prepareToPlay]; [av play]; }