我正在开发一个我想要的应用程序:
在播放音频时尊重铃声/静音开关,和
当铃声/静音开关设置为静音时,显示一个图标,表示声音已静音.
要求1很简单:我使用的AVAudioSessionSoloAmbient是我的应用程序的音频会话类别,因此当响铃/静音开关关闭时,我的音频会话将自动静音.
要求2似乎相当困难,因为我需要某种回调,通知或KVO,这将允许我监控交换机的位置,但Apple明确表示它不愿意提供正式公开的方式来做到这一点.也就是说,如果我能找到一种非侵入性的方式来监控交换机的位置,即使是技术上被禁止的方式(例如内部NSNotification),我也愿意由Apple运行它.
此外,我宁愿不实施我在别处找到的一些民意调查解决方案.有关示例,请参阅"相关问题"部分.
至少在iOS版本4和5中,有一个技巧可以通过观察当前音频会话的路由属性来获取交换机的位置.除了被AVAudioSession班级弃用之外,我还可以确认这个技巧不再是一个选择.当切换振铃/静音开关时,当前路由(包括已弃用的Audio SessionAPI和当前AVAudioSession类的C函数报告)都不会更改.
AVSystemController是一个似乎有很多承诺的内部类.调用确实- (BOOL)toggleActiveCategoryMuted会使sharedAVSystemController我的应用程序的音频静音.此外,共享单例AVSystemController_SystemVolumeDidChangeNotification在通过音量按钮更改系统音量时发布通知.不幸的是,这个通知不是为响应环/静音开关的变化而发布的(尽管这个可疑的来源说它应该).
据我所知,有没有 NSNotification š张贴由任何对象响应于环/无声开关位置的变化.在将自己添加为默认中心中所有通知的观察者后,我得出了这个结论:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:nil object:nil];
Run Code Online (Sandbox Code Playgroud)
然后切换响铃/静音开关.没有.
该AVSystemController课程有一个很有前途的签名方法:
- (BOOL)getActiveCategoryMuted:(BOOL*)arg1;
Run Code Online (Sandbox Code Playgroud)
但是,这有两个问题:
BOOL指向的值arg1似乎都没有变化.
我怀疑某个对象GSEventRef在更改静音开关时会发送一些其他对象,因为我在事件类型的声明中看到以下内容:
kGSEventRingerOff = 1012,
kGSEventRingerOn = 1013,
Run Code Online (Sandbox Code Playgroud)
但是,我很确定我无法拦截这些消息,即使我可以,这也不仅仅是"一点点"的干扰.
简单地说:Instagram应用程序基本上表现出这种行为.观看视频时,它会考虑铃声/静音开关的设置,但在开关关闭时会显示一个图标.图标消失并在移动开关后立即重新出现,我认为它必须是基于事件的,而不是轮询.
这个问题(更多)更新,询问iOS 7.但是,因为我愿意接受私有API规则的最小侵入性破坏,我认为这是一个与我自己不同的问题.
我正在制作一个闹钟应用程序,我已经确认我的闹钟通知被正确触发,但声音并不总是像我预期的那样播放。
例如,当手机未处于静音模式时,通知会成功播放声音(好吧,太棒了!)。然而,当手机是在静默模式下,声音不玩了,即使该应用程序在后台运行还是(没那么大......)。
我知道静音模式应该使所有通知声音静音,但我已经从 App Store 下载了其他闹钟应用程序(如 Alarmy),即使手机处于静音状态,它们也能以某种方式播放通知声音模式,只要应用程序仍在后台运行。只有当应用程序完全退出时,静音模式才会生效。
有谁知道如何实现这个结果?是否需要在代码或 plist 文件中声明某些设置或选项?我已经在互联网上搜索过,但没有找到有关此特定问题的任何信息...
我设置 AVAudioSession 类别的代码:
private func setAudioCategory() {
do {
// Enable sound (even while in silent mode) as long as app is in foreground.
try AVAudioSession.sharedInstance().setCategory(.playback)
}
catch {
print(error.localizedDescription)
}
}
Run Code Online (Sandbox Code Playgroud)
我设置通知的代码:
/// Sets a local user notification for the provided `Alarm` object.
static func set(_ alarm: Alarm) {
// Configure the notification's content.
let content = UNMutableNotificationContent()
content.title = NSString.localizedUserNotificationString(forKey: K.Keys.notificationTitle, arguments: …Run Code Online (Sandbox Code Playgroud) nsnotificationcenter ios avaudiosession swift usernotifications