如何禁用iOS系统声音

我正在开发一个iPad应用程序,它可以连接播放声音的附件。 当iPad连接到附件时,我想静音所有系统声音,但允许其他声音(iPod)。

其中一部分原因是配件是在现场演出中使用的。 很明显,如果电子邮件,警报或其他任何系统的声音都在运行并被放大(疯狂的大声),那就太麻烦了。

我已经看过使用AVAudioSession (阅读audio会议了解更多),并尝试所有的AudioSessionCategories 。 这些类别都不会使系统声音静音,而只会让您将应用程序声音(iPod)静音 – 对我的用途不起作用。

我也在“ 系统声音服务 ”上find了文档,但这只允许您播放系统声音。 这里没有API来禁用系统声音,而您的应用程序正在运行。

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

使用AVSystemController可以改变系统的声音,这就是铃声的顺便说一句。 但是,AVSystemController存在于私有的Celestial框架中。 由于这个框架是由UIKit引用的,所以仍然可以使用这个类而不直接引用它。

苹果公司禁止使用私人API,所以只有这样做是一个坏主意。 鉴于我的情况,我认为他们可能会例外,但是我可能会放弃这个过程,因为服用后我意识到这并没有解决我的问题。 它确实将声音静音,但只要插入到我的配件中,即使铃声音量设置为0,系统也会以最大音量响起。这使我相信解决问题的答案在MFI文件。

无论如何,这里是如何改变使用私人框架/ api铃声(这将让你的应用程序拒绝没有某种特殊的权限)。

简短的回答:

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

答案无需直接参考天体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]; } 

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

 [[MPMusicPlayerController applicationMusicPlayer] setVolume:0]; 

最好你能做的就是鼓励你的用户进入飞机模式。