ObjecTips

Swift & Objective-C で iOS とか macOS とか

iPhone 本体の音量を変更する

iPhone 本体の音量を変更するには MPVolumeViewMPMusicPlayerController クラスを使う。

MPMusicPlayerController には
アプリ内の音楽再生周りを制御するインスタンスを呼び出す

+ (MPMusicPlayerController *)applicationMusicPlayer;

システムの音楽再生周りを制御するインスタンスを呼び出す

+ (MPMusicPlayerController *)iPodMusicPlayer NS_DEPRECATED_IOS(3_0, 8_0, "Use +systemMusicPlayer instead.");

があって、iPodMusicPlayer の方は iOS 8で deprecated になったので代わりに

+ (MPMusicPlayerController *)systemMusicPlayer;

を使う。
ちなみにこの systemMusicPlayer というクラスメソッド、現時点でドキュメントに記載がなくて MPMusicPlayerController.h ヘッダにだけ記載があるので見落としがち、、*Xcode 6.3

音量を変更するのは以下のプロパティ

// The current volume of playing music, in the range of 0.0 to 1.0.
// This property is deprecated -- use MPVolumeView for volume control instead.
@property (nonatomic) float volume NS_DEPRECATED_IOS(3_0, 7_0);

でもこれも iOS 8で deprecated になってしまったので、ヘッダやドキュメントに記載されているように MPVolumeView を使うしかない。 MPVolumeView はUIの提供で、音量の直接のコントロールはできないので iOS 8以降では本体の音量を programmatically に変更する事は Private API を触らない限りできなくなった。

厳しいなと思ったけど、考えてみるとアプリが制御できるのはアプリ内の音量のみというポリシーは正しい気もする。


ちょっと気になったので iOS 8 で Private API を調べてみたら
volume setVolume: というメソッドはまだあって、その他に setPrivateVolume: というメソッドもあった。
volume の方は deprecated に設定しているから内部では setPrivateVolume: の方を使っているっぽい。
Private API になってしまうけど、どちらも KVO で音量の制御はできた。*iOS 8.3