Кнопка громкости Swift System удерживается на фоне - PullRequest
1 голос
/ 10 марта 2020

1st LINK работает для ViewController.

let volumeView = MPVolumeView(frame: CGRect.zero)
self.view.addSubview(volumeView)
NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged(_:)), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)

@objc func volumeChanged(_ notification: NSNotification) {
    if let volume = notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"] as? Float {
        print("volume: \(volume)")
    }
}

2nd LINK о фоновом использовании.

ВОПРОС: Как уведомить / применить действие в приложении, если кнопка громкости нажата более 5 секунд в фоновом режиме или когда экран заблокирован?

Примечание : В случае ViewController мы можем добавить подпредставление MPVolumeView

Согласно моим последним исследованиям: UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum) может быть использовано для проверки кнопки ... однако, похоже, она не работает из AppDelegate .swift

Более того, согласно WWD C 2019 презентация есть путь через BackgroundTasks.

Все, что я нашел о фоновых процессах, которые вы можете запустить их до завершения приложения и дождитесь завершения или используйте кнопки проверки / события из запущенного приложения. Мы можем поймать кнопку Event на Android через сервис доступности. Есть ли похожий способ на iOS?

1 Ответ

1 голос
/ 19 марта 2020
import UIKit  
import MediaPlayer  
import AVFoundation  

class ViewController: UIViewController {  

    private var audioLevel : Float = 0.0  

    override func viewDidLoad() {  
        super.viewDidLoad()  
        // Do any additional setup after loading the view, typically from a nib.  
    }  

    override func viewWillAppear(_ animated: Bool) {  
        listenVolumeButton()  
    }  

    func listenVolumeButton(){  

        let audioSession = AVAudioSession.sharedInstance()  
        do {  
            try audioSession.setActive(true, options: [])  
            audioSession.addObserver(self, forKeyPath: "outputVolume",  
                                     options: NSKeyValueObservingOptions.new, context: nil)  
            audioLevel = audioSession.outputVolume  
        } catch {  
            print("Error")  
        }  
    }  

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {  
        if keyPath == "outputVolume"{  
            let audioSession = AVAudioSession.sharedInstance()  
            if audioSession.outputVolume > audioLevel {  
                print("Hello")  
                audioLevel = audioSession.outputVolume  
            }  
            if audioSession.outputVolume < audioLevel {  
                print("GoodBye")  
                audioLevel = audioSession.outputVolume  
            }  
            if audioSession.outputVolume > 0.999 {  
                (MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(0.9375, animated: false)  
                audioLevel = 0.9375  
            }  

            if audioSession.outputVolume < 0.001 {  
                (MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(0.0625, animated: false)  
                audioLevel = 0.0625  
            }  
        }  
    }  


}  
...