我目前正在开发 PTT(即按即说)应用程序。 我正在尝试使用硬件音量按钮来启动/停止传输。
到目前为止我看到的所有建议的解决方案都可以缩小到两个:
AVAudioSession
属性outputVolume
。AVSystemController_SystemVolumeDidChangeNotification
,自 iOS 15.0 起 - SystemVolumeDidChange
。在不讨论每种解决方案的优缺点的情况下,它们都有一个共同点 - 它们都是基于体积的,这会带来几个问题。
我注意到 Zello 应用程序以某种方式设法克服了这些问题,因为即使设备关闭或命令中心打开,它们也可以使用音量按钮 - 不会对系统音量产生任何干扰。此外,从命令中心更改音量也没有效果。
有人知道如何实现这种行为吗?
警告私有 API 使用如下。您必须有一些特殊情况才可能让您通过AppStore审核。
查看 2012 年的 探索 iOS SDK 并使用未记录的 API。
总而言之,您需要调用私有方法
- [UIApplication setWantsVolumeButtonEvents:YES]
来启用以下通知:
_UIApplicationVolumeUpButtonDownNotification
_UIApplicationVolumeUpButtonUpNotification
_UIApplicationVolumeDownButtonDownNotification
_UIApplicationVolumeDownButtonUpNotification
在 Swift 中,可以通过以下方式启用:
@objc public protocol UIApplicationPrivate {
@objc func setWantsVolumeButtonEvents(_:Bool)
}
class VolumeButtonsManager {
private static var observer: NSObjectProtocol?
static func setup(with application: UIApplication) {
observer = NotificationCenter.default.addObserver(forName: nil,
object: nil,
queue: nil,
using: handleEvent)
let application = unsafeBitCast(application, to:UIApplicationPrivate.self)
application.setWantsVolumeButtonEvents(true)
}
private static func handleEvent(_ notification: Notification) {
switch notification.name.rawValue {
case "_UIApplicationVolumeUpButtonDownNotification": print("Volume Up Button Down")
case "_UIApplicationVolumeUpButtonUpNotification": print("Volume Up Button Up")
case "_UIApplicationVolumeDownButtonDownNotification": print("Volume Down Button Down")
case "_UIApplicationVolumeDownButtonUpNotification": print("Volume Down Button Up")
default: break
}
}
}
UIApplicationPrivate
通过消除显式构造选择器的警告。
我认为您尝试做的事情将导致应用程序商店在审核过程中被拒绝,正如 Apple 在 App Store 审核指南第 2.5.9 段中提到的那样
改变或禁用标准开关功能的应用程序(例如音量调高/调低和响铃/静音开关)或其他本机用户界面元素或行为将被拒绝。例如,应用程序不应阻止指向其他应用程序的链接或用户希望以某种方式工作的其他功能。了解有关正确处理的更多信息