【问题标题】:How to play system sound on iOS without vibration?如何在没有振动的情况下在 iOS 上播放系统声音?
【发布时间】:2013-03-19 23:50:18
【问题描述】:

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,但结果是一样的。我想禁用振动的原因是因为我正在制作一个应用程序,用户必须将她的手机放在很远的地方,并且手机不应该因振动而翻倒。

【问题讨论】:

  • 你查了吗this
  • @RDC 您发布的链接中的解决方案也使用AudioServicesPlaySystemSound。它有同样的问题,在某些声音 ID 上振动,例如 1000(电子邮件接收音效)。
  • 我在文档中看到的唯一公开的常量是kSystemSoundID_Vibrate。您是如何想出“1000”作为通过AudioServicesPlaySystemSound() 的合法事物的? (它也适用于我,但这似乎很脆弱。)Apple 似乎有可能将振动硬编码为特殊的声音。由于这些是私人声音,Apple 不需要它们遵循您上面引用的文档似乎是合理的。
  • @JonBrooks 整个系统声音常量集合在这里:iphonedevwiki.net/index.php/AudioServices
  • @JoJo 你知道 Digisocial 使用的一些特定声音吗?

标签: iphone ios cocoa-touch


【解决方案1】:

我用我的 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

【讨论】:

  • 注意: 阅读此问题/答案后,我担心这些看似没有正式记录/公开支持的系统声音是否会导致应用程序无法通过审核流程。从那以后,我发现并记录了开发人员使用系统声音并且他们的应用程序已通过审核流程的案例。一个例子here.
  • 这行得通。我建议在某个时候致电AudioServicesDisposeSystemSoundID 以释放资源。我还会创建一个我已经播放过的声音的哈希映射,所以我不会一遍又一遍地重新创建相同的声音资源。
【解决方案2】:

您是否尝试过播放自己的音效而不是 Apple 的内置音效?

如果您在应用中上传音频文件,您可以通过 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);

【讨论】:

  • 过去我用自己的声音做到了这一点,没有振动,但这次我想播放内置的系统声音。你知道有什么方法可以抢到system sound files吗?我知道流行的应用程序 Digisocial 从某个地方得到了他们。他们使用了很多没有振动的系统声音。
  • 我明白了。我会再做一些测试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2021-11-22
  • 2019-11-03
相关资源
最近更新 更多