iOS 覆盖硬件音量按钮(与 Zello 相同)

问题描述 投票:0回答:2

我目前正在开发 PTT(即按即说)应用程序。 我正在尝试使用硬件音量按钮来启动/停止传输。

到目前为止我看到的所有建议的解决方案都可以缩小到两个:

  1. 使用KVO观察
    AVAudioSession
    属性
    outputVolume
  2. 使用私有 API 通知,即
    AVSystemController_SystemVolumeDidChangeNotification
    ,自 iOS 15.0 起 -
    SystemVolumeDidChange

在不讨论每种解决方案的优缺点的情况下,它们都有一个共同点 - 它们都是基于体积的,这会带来几个问题。

  1. 按音量按钮可更改系统音量。虽然可以通过重置系统音量来解决这个问题,但这不是一个很好的解决方案。
  2. 无法区分来自硬件按钮的音量变化和来自命令中心的音量变化,因此按钮的使用仅限于应用程序位于前台且处于活动状态时。
  3. 当用户按下音量按钮时,第一个音量变化事件和随后的连续事件之间有一个短暂的延迟,这使得跟踪快速按下和释放变得困难。

我注意到 Zello 应用程序以某种方式设法克服了这些问题,因为即使设备关闭或命令中心打开,它们也可以使用音量按钮 - 不会对系统音量产生任何干扰。此外,从命令中心更改音量也没有效果。

有人知道如何实现这种行为吗?

ios volume
2个回答
4
投票

警告私有 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
通过消除显式构造选择器的警告


0
投票

我认为您尝试做的事情将导致应用程序商店在审核过程中被拒绝,正如 Apple 在 App Store 审核指南第 2.5.9 段中提到的那样

改变或禁用标准开关功能的应用程序(例如音量调高/调低和响铃/静音开关)或其他本机用户界面元素或行为将被拒绝。例如,应用程序不应阻止指向其他应用程序的链接或用户希望以某种方式工作的其他功能。了解有关正确处理的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.