首页 文章

如何禁用iOS系统声音

提问于
浏览
8

我正在开发一款iPad应用程序,可与播放声音的配件连接 . 当iPad连接到配件时,我想将所有系统声音静音但允许其他声音(iPod) .

造成这种情况的部分原因是附件是在现场演出期间使用的 . 显然,让电子邮件,警报或任何其他系统声音通过并放大(疯狂大声)会很烦人 .

我已经看过使用AVAudioSession(阅读Audio Sessions了解更多)并尝试了所有的AudioSessionCategories . 这些类别都不会使系统声音静音,而是只允许您静音应用程序声音(iPod) - 对我的目的无用 .

我还在“System Sound Services”上找到了文档,但这只允许你播放系统声音 . 这里没有api可以在你的应用程序运行时禁用系统声音 .

最后一点,我们通过包含MPVolumeView轻松调整iPad级别(音量),但我们希望用户想要播放iPod音乐 . 如果在播放iPod音乐(或来自其他应用程序的音乐)和电子邮件时,您会惊讶地发现,当通过我们的配件时,电子邮件突然变成了LOUD / ANNOYING . 甚至可能会损坏设备 . :d

3 回答

  • 3

    使用AVSystemController可以改变系统声音,结果是铃声btw . 但是,AVSystemController存在于私有Celestial框架中 . 由于UIKit引用了这个框架,因此仍然可以在不直接引用它的情况下使用该类 .

    Apple禁止使用私有API,因此仅此一点就是个坏主意 . 鉴于我的情况,我认为他们可能会例外,但我可能会放弃这个课程,因为我认为它没有解决我的问题 . 它确实使声音静音,但是当我插入我的配件时,即使振铃音量设置为0,系统也会以最大音量发出声音 . 这让我相信解决问题的答案就在于MFI文件 .

    无论如何,这里是如何使用私有框架/ api更改铃声(这将使你的应用程序在没有某种特殊许可的情况下被拒绝) .

    简答:

    [[AVSystemController sharedAVSystemController] setVolumeTo:0 forCategory:@"Ringtone"];
    

    无需直接引用Celestial frameork / AVSystemController.h即可回答:

    - (void) setSystemVolumeLevelTo:(float)newVolumeLevel
    {   
        Class avSystemControllerClass = NSClassFromString(@"AVSystemController");
        id avSystemControllerInstance = [avSystemControllerClass performSelector:@selector(sharedAVSystemController)];
    
        NSString *soundCategory = @"Ringtone";
    
        NSInvocation *volumeInvocation = [NSInvocation invocationWithMethodSignature:
                                          [avSystemControllerClass instanceMethodSignatureForSelector:
                                           @selector(setVolumeTo:forCategory:)]];
        [volumeInvocation setTarget:avSystemControllerInstance];
        [volumeInvocation setSelector:@selector(setVolumeTo:forCategory:)];
        [volumeInvocation setArgument:&newVolumeLevel atIndex:2];
        [volumeInvocation setArgument:&soundCategory atIndex:3];
        [volumeInvocation invoke];
    }
    
  • 14

    使用MediaPlayer框架,我们可以设置SYSTEM声音的级别

    [[MPMusicPlayerController applicationMusicPlayer] setVolume:0];
    
  • 1

    您可以做的最好是鼓励您的用户进入飞行模式 .

相关问题