我使用了以下代码来检测用户更改的系统音量。
NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
当我更新到iOS 15时,我发现这个代码不起作用,但在任何以前的iOS版本上都能起作用。
我还使用了addObserver
函数,但这没问题。
这是iOS 15的错误吗?如果是,我可以做些什么来修复它。
谢谢:)
6条答案
按热度按时间py49o6xq1#
我挂接了MPVolumeControllerSystemDataSource的方法**_systemVolumeDidChange**,在iOS 15.0(至少Beta2)通知名称改为SystemVolumeDidChange,新的通知结构如下:
有两点需要注意:
1.iOS 15(至少Beta2)的这条通知,即使按一次音量键也会被调用两次,但SequenceNumber是相等的;
1.该通知回调不在主线程上。
p8ekf7hl2#
您正在执行的操作不受支持,因此,如果它不能在所有系统上运行,也就不足为奇了。有文档记录的正确方法是在音频会话
outputVolume
属性上使用KVO:https://developer.apple.com/documentation/avfaudio/avaudiosession/1616533-outputvolume3j86kqsm3#
尝试了AdamWang的答案后,我发现您需要创建并保留一个MPVolumeView示例(但不需要添加到您的视图层次结构中),否则通知将不会发出。
h43kikqp4#
如果有人突然不明白如何应用AdamWang的解决方案,您只需将“
AVSystemController_SystemVolumeDidChangeNotification
”替换为“SystemVolumeDidChange
”。xxhby3vn5#
在iOS15中,不再调用@“AVSystemController_SystemVolumeDidChangeNotification”通知。
取而代之的是关键值观察。(在上面马特回答的基础上进行扩展)
在您的ViewController.m文件中
在您的View Controller.m文件中
您可以使用移出屏幕的MPVolumeView隐藏音量滑块。
Hide device Volume HUD view while adjusitng volume with MPVolumeView slider
pvcm50d16#
我也在努力解决处理音量按钮按下事件的任务,目标是
适用于我的最终解决方案(根据2022年9月)如下:
在我的视图控制器中
在我的加载查看函数中:
可用标签允许您选择根据iOS版本设置的通知。
...我的视图控制器有这个:
这是为了处理事件本身并区分14/15版本的代码(略有不同)
请注意:这里使用的DispatchQueue.main.async,只要完成处理程序(如上所述)不在主线程上,而在我的例子中,它必须在主线程上。在我弄清楚这一点之前,我遇到了一些崩溃和线程警告。
此函数用于处理音量按钮按下事件,并帮助您a)了解事件是“向上”还是“向下”,以及b)管理达到最大/最小值的情况,如果您在触摸最大/最小值时仍需要继续事件处理(这是通过简单地减少/增加当前音量变量来完成的-记住,您不能改变系统音量本身,但是,变量是您的;)
它是主要的iOS 15实施功能。正如你所看到的,MinVolume不是一个数字,它是一个let常量--它与iOS14不同(我在iOS14上发现它是0,而iOS15在我的物理设备上不会低于0.0625--请不要问我为什么,这是一个谜;)
它还处理最后一个通知唯一ID并省略重复的通知事件,这在iOS15中(以某种方式)相当常见。
IOS 14的情况与此相同,主要区别有3点:a)如上所述,通知UserInfo键不同;b)没有重复的通知控制--只要我在iOS 14上没有观察到重复的通知;c)minVolume为0,这对于iOS 14是正确的
希望对您有所帮助:)