iOS 12 を使用しAVSystemController_SystemVolumeDidChangeNotification
て、ボリュームを押して画像をキャプチャすることを検出することを観察しています。
let volumeView = MPVolumeView(frame: CGRect(x: 0, y: -40, width: 0, height: 0)) // override volume view
view.addSubview(volumeView)
NotificationCenter.default.addObserver(self, selector: #selector(captureImage), name: Notification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
ただし、少なくとも iPhone XS および XS Max では、(デバイスの右側にある) ロック ボタンが押されたときにも通知が発生することに気付きました。
周りを検索してみましたが、この問題に言及している人や、この通知について多くの議論をしている人はいません。音量ボタンの押下を聞く他の同様の試みでは AVAudionSessions / KVO を使用しますが、音量が既に最大/最小になっているときにオブザーバーが呼び出されないことがわかりました。このAVSystemController_SystemVolumeDidChangeNotification
奇妙なロックボタンの問題を除いて、これは問題なく機能するようです。通知の名前から、ロックボタンが押されたときになぜ応答するのかわかりません。
ロック ボタンを押すと、コンソールに次のメッセージが表示されます。
[avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Speaker (type: Speaker) //これは 4 回表示されます
+[CATransaction synchronize] トランザクション内で呼び出される //これは 2 回表示されます
これらのログは、音量ボタンを押しても表示されません。
また、私は App Store に提出するつもりはないので、Apple がこのおそらく非公開の通知を使用してこのアプリを拒否するかどうかについては心配していません。
AVSystemController_SystemVolumeDidChangeNotification
を作成しAVAudioSession
て観察する代わりに、次のoutputVolume
ようにします。
let audioSession = AVAudioSession()
try? audioSession.setActive(true)
audioSession.addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil)
…その後、デバイスがロックされてもヒットしませんが、「AVAudioSessionPortImpl.mm ポート スピーカー用に選択されたデータ ソースが不明です」というコンソール エラーが引き続き表示されます。しかし、音量がミュートされると、もうプレスを受けません。私がする必要があるのは、最小または最大に当たらないように手動で音量を変更することだと思いますか?
ありがとうございました