如何在iOS上播放系统声音而不震动?

20
AudioServicesPlayAlertSound的文档中,它说我可以在播放声音时禁用震动:

iPhone-播放指定的声音。如果用户已将设置应用程序配置为在响铃时振动,则还会调用震动功能。然而,如果您的应用程序音频会话类别为AVAudioSessionCategoryPlayAndRecord或AVAudioSessionCategoryRecord,则设备不会震动

但是,即使将我的类别设置为“播放和录制”,我仍然可以感受到我的iPhone 4S(iOS 5.1.1)上的震动。它同时响铃和震动。

#import <AudioToolbox/AudioServices.h>
#import <AVFoundation/AVAudioSession.h>

NSError* error;
[[AVAudioSession sharedInstance]
    setCategory:AVAudioSessionCategoryPlayAndRecord
    error:&error];
if (error == nil) {
    AudioServicesPlayAlertSound(1000);
}

我也尝试了AudioServicesPlaySystemSound,但结果是一样的。我想禁用震动的原因是,我正在开发一个应用程序,在这个应用程序中,用户必须把手机放得很远,而手机不应因为震动而倾斜。


你有没有查看这个 - swiftBoy
@RDC 你发布的链接中的解决方案也使用了 AudioServicesPlaySystemSound。 它存在与某些声音ID(例如1000:电子邮件接收提示音效)震动的相同问题。 - JoJo
我在文档中看到的唯一公开的常量是kSystemSoundID_Vibrate。你怎么想到将"1000"作为要传递给AudioServicesPlaySystemSound()的合法值呢?(虽然这也对我起作用,但这似乎很脆弱。)苹果可能会硬编码振动到特殊声音中。由于这些是私有声音,所以苹果不需要遵循您引用的文档。 - Jon Brooks
@JonBrooks 这里是所有系统声音常量的完整集合:http://iphonedevwiki.net/index.php/AudioServices - JoJo
@JoJo,你知道Digisocial正在使用哪些特定的声音吗? - Carl Veazey
显示剩余3条评论
2个回答

8

我用我的iPhone 4s测试过了,它可以完全满足你的需求。

   NSError* error;
    [[AVAudioSession sharedInstance]
     setCategory:AVAudioSessionCategoryPlayAndRecord
     error:&error];
    if (error == nil) {
        SystemSoundID myAlertSound;
        NSURL *url = [NSURL URLWithString:@"/System/Library/Audio/UISounds/new-mail.caf"];
        AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &myAlertSound);

        AudioServicesPlaySystemSound(myAlertSound);

    }

使用AudioServicesCreateSystemSoundID通过系统音效的文件名创建一个SystemSoundID。然后使用AudioServicesPlaySystemSound()播放声音,不会有振动效果。可以在下面的链接中找到其他系统音效的文件名。

http://iphonedevwiki.net/index.php/AudioServices


1
注意:阅读这个问题/答案时,我担心这些看似未经官方文档/公开支持的系统声音是否会导致应用程序无法通过审核。我后来发现并记录了一些开发者使用系统声音并且他们的应用程序已经通过了审核的情况。一个例子在这里 - Elliott
1
这个可以用。我建议在某个时候调用AudioServicesDisposeSystemSoundID以释放资源。我还会创建一个声音哈希映射表,记录已经播放过的声音,这样就不会一遍又一遍地重新创建相同的声音资源了。 - JoJo

3

你尝试过播放自己的声音效果吗?而不是使用内置的苹果音效?

如果在应用中上传了一个音频文件,你可以很容易地使用AudioToolBox框架来使用它,而且你不必再担心震动问题了。

#import <AudioToolbox/AudioServices.h>    

//Initialise your soundID (your app delegate is a good place for this)    
SystemSoundID soundToPlay;

NSString *path  = [[NSBundle mainBundle] pathForResource:@"<YourFileName>" ofType:@"aif"];
NSURL *pathURL = [NSURL fileURLWithPath : path];
AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &soundToPlay);

//playback
AudioServicesPlaySystemSound(soundToPlay);

我以前用我的自己的声音但是没有振动做过类似的事情,但这一次我想播放内置系统声音。你知道获取系统声音文件的任何方法吗?我知道流行的应用程序 Digisocial 取得了它们。他们正在使用许多没有振动的系统声音。 - JoJo
我明白了。我会再做几个测试! - Eric Genet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接