2014-06-30 77 views
4

我一直在爲iOS 8開發自定義鍵盤一段時間,目前爲止一切都很順利,但我仍然無法繞過這種敲擊聲音的東西。如何在敲擊自定義鍵盤按鈕時播放聲音

我搜索高和低這個問題,並嘗試了幾種方法,包括

  1. 使用AudioToolbox
  2. 使用AVFoundation
  3. 把我的包裏面的tock.caf,只是發揮它

其中一些工作,在模擬器中,但他們都沒有在我的設備中工作。 任何一個在點擊自定義鍵盤按鈕時成功播放聲音的人都可以分享一些工作代碼嗎?如果代碼能夠遵守聲音設置,這是最好的。

+0

http://stackoverflow.com/a/10299080/2446155 –

回答

7

最後我從其他SO thread得到了答案。

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

我已經實現並驗證該方法是基於對iOS8上的測試版都模擬器和設備2

+0

當我使用AudioServicesPlaySystemSound時,出現此錯誤:bootstrap_look_up失敗,代碼爲1100,等待重試連接到系統聲音服務器。這是否適用於測試版3? – sheraza

+0

這也適用於Beta 3和Beta 4。 –

+3

在物理設備中,當我按下鍵時,它是滯後的。 –

0

這裏的關鍵是iOS只能播放描述爲here的文件類型。 iOS無法播放文件類型.caf。下面的代碼應該可以在iOS上正常工作。您可以使用this網站將您的.caf文件轉換爲他們在網站上提供的兼容文件。我已經測試過它,並且.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]; 

} 
+0

不幸的是,這不適用於我,我應用了你的實現,它不適用於模擬器,也不適用於設備。同樣,在設備上,點擊任何按鈕都會引起顯着的延遲。但我仍然感激你的意見。謝謝。 –

+0

@EvanChu是無聲的設備? – Milo

+0

是的,我確定我可以聽到系統鍵盤的敲擊聲,然後嘗試自己的聲音。 –

1

播放聲音需要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的同時將它添加到您的鍵盤,它應該工作。

14

正如Farzad Nazifi在全新安裝後提到的Allow openAcesess之後,解決了我的問題。 我推薦playing system keyboard tap sound

斯威夫特和Objective-C一個簡單的解決方案都是一樣的'我們不需要導入任何自定義聲音文件只是發揮系統的踢踏聲。

進口AudioToolbox框架:

#import <AudioToolbox/AudioToolbox.h>

AudioServicesPlaySystemSound(1104) 

該代碼在運行iOS 8的測試版測試5,我希望蘋果會修正錯誤(如果它是一個bug)的GM版本。

8

導入框架:

#import <AudioToolbox/AudioToolbox.h> 

及用途:

AudioServicesPlaySystemSound(1104); 
1

可以使用playInputClick()方法。

斯威夫特:

UIDevice.currentDevice().playInputClick() 

的Objective-C:

[[UIDevice currentDevice] playInputClick]; 

詳見documentation

+1

這是否可以在自定義鍵盤擴展中工作? – Joey

相關問題