iOS

2014-10-29, ios

ボリューム変更通知を受け取る

標準のカメラアプリは本体横のボリュームボタンやヘッドホンのボタンを使ってシャッターを切ることができます。これと同じようなことを自分のアプリ内でやるにはどうするか調べてみました。これが最善かどうか全く不明ですが2つ見つかったので、一応備忘のために。

1.NotificationCenterを使う シンプルで分かりやすいんですが、addObserverに指定している名前(AVSystemCont...)がどうも公式ドキュメントに掲載されていないようです。つまりプライベートなAPIという扱いで、AppStore申請時にリジェクトされるのではないか?という懸念があります。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleNotification:)
                                             name:@"AVSystemController_SystemVolumeDidChangeNotification"
                                           object:nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

セレクタに指定したメソッドの定義です。

- (void) handleNotification:(NSNotification *)notification
{
  // ..
}

通知が不要になったら、停止することもできます(他のビューに移る時などは必要かと思います)。

[[UIApplication sharedApplication] endReceivingRemoteControlEvents];

1.AudioSessionを使う こちらもシンプルですね。しかもプロパティの変更監視という一般的な手法で実現しています。しかし、致命的な欠陥があって、これはあくまで「ボリュームが変更された」というイベントですので、ボリュームが最大のときにボリュームアップボタン、最小の時にダウンボタンを押しても(ボリュームはそれ以上変わらないので)反応しません。シャッター代わりには使えなさそうです…。

AVAudioSession* audioSession = [AVAudioSession sharedInstance];

[audioSession setActive:YES error:nil];
[audioSession addObserver:self
               forKeyPath:@"outputVolume"
                  options:0
                  context:nil];
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  if ([keyPath isEqual:@"outputVolume"]) {
    // ..
  }
}

参考URL

この記事は役に立ちましたか?