端末のサイドボタンで変えられる音量、こいつをコードから変えたいって魂胆でございます。
「ユーザーが触ることなく」音量を変えたいので、操作するオブジェクトは画面上では見えない状態にしたいなと。
この端末の音量関連はだいぶガチガチの仕様で融通の効かない仕様のため、正攻法ではないことをご了承ください。笑
開発環境(前提条件)
・Xcode11.4
・Swift5
実装
MPVolumeView という音量を調節するクラスを使用しますが、スワイダーを動かさないと音が鳴りません。
タイトルにもあるように「強制的に」鳴らしたいので、強行突破していきます!
2021年4月10日時点で iOS14 で再確認したら動きましたが、いつまでこのコードが動くのか…笑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import MediaPlayer class ViewController: UIViewController { override func viewDidLoad() {} func unmute() { let volumeView = MPVolumeView(frame: .init(x: 0.0, y: 0.0, width: 100.0, height: 50.0)) volumeView.isUserInteractionEnabled = false volumeView.alpha = 0.01 // ★1 self.view.addSubview(volumeView) guard let slider = volumeView.subviews.compactMap({ $0 as? UISlider }).first else { return } slider.value = AVAudioSession.sharedInstance().outputVolume + 0.01 // ★2 slider.value -= 0.01 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { // ★3 volumeView.removeFromSuperview() } } } |
★1:完全に非表示にすると音が鳴らないため、0.01 にする
★2:端末に設定されている音量を取得し、少しだけ音量を加えて元に戻します。
★3:すぐに削除すると音が鳴らないため、asyncAfter で少し経ってから削除する。
これで端末の設定で音量が流れます。
まぁアプリからマナーモードを強制解除するような処理なので、制限をかけるのも分かりますけどね。
アプリやユーザーによっては流したい人もいるから、正規の方法で流したい。笑
この方法については stack overflow も参考にしたので、ぜひ見て下さい。
さいごに
トラッキングのようにユーザーが選べるようになってほしいなぁ
デフォルトで音声は流れないけど、設定したユーザーは音声が流れるようにできるし。
地味に需要ある気がするんだけどな…(-ω-;)
コメント