美文网首页iOSApple Guide
iOS AVAudioSessionInterruptionNo

iOS AVAudioSessionInterruptionNo

作者: NieFeng1024 | 来源:发表于2017-07-18 15:35 被阅读77次

    https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/HandlingAudioInterruptions/HandlingAudioInterruptions.html#//apple_ref/doc/uid/TP40007875-CH4-SW1

    后台录音时音频会话响应中断(开始中断)大致分为以下几种情况:

    1. 闹钟或日历闹钟响起或
    2. 当来电话时。
    3. 他应用程序激活其音频会话时。

    中断结束 :应用程序继续运行,要恢复音频,必须重新启动音频会话。
    如果用户忽略呼叫或关闭闹钟,则系统发出“中断已结束”消息,

    audio_session_interrupted_2x.png

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_observerApplicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];

    • (void)_observerApplicationWillResignActive:(NSNotification *)sender {
      if ([sender.name isEqualToString:UIApplicationWillResignActiveNotification]) {
      [self _registerNotificationForAudioSessionInterruption];
      }
      }
    • (void)_registerNotificationForAudioSessionInterruption {
      [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(_audioSessionInterruptionHandle:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];
      }
    • (void)_audioSessionInterruptionHandle:(NSNotification *)sender {
      if ([sender.userInfo[AVAudioSessionInterruptionTypeKey] intValue] == AVAudioSessionInterruptionTypeBegan) {
      //pause session
      } else if ([sender.userInfo[AVAudioSessionInterruptionTypeKey] intValue] == AVAudioSessionInterruptionTypeEnded) {
      //Continue
      }
      }
    • (void)_observerApplicationBecomeActiveAction:(NSNotification *)sender {
      if ([sender.name isEqualToString:UIApplicationWillEnterForegroundNotification]) {
      [[NSNotificationCenter defaultCenter] removeObserver:self name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];
      }
      }
      在dealloc 中移除通知会出现异常, 对象生命周期文档中明确说明 dealloc 方法不可super 不可调用,不要调用其他对象的方法。在此调用移除通知的监听 会导致 闹钟响起时弹出通知栏,关闭通知之后无法调起app 继续进行录音操作,断点debug代码已经执行。我分析的原因是后台录音权限申请之后iOS系统会 管理app 当在AVAudioSessionInterruptionTypeEnded 时重启录音,首先是 此监听在dealloc 中移除,而在通知栏弹出通知的一瞬间,系统并未回收app,只是进入休眠状态。还在内存中只是无法重新启动录音。而未在dealloc中移除监听,系统会重新打开app 进入录音页面,这样就不存在中断监听被移除,可以继续录音。我选择在app 进入前台时移除后台中app 录音中断的监听,在页面消失移除所有通知监听。

    欢迎大家指正。

    相关文章

      网友评论

        本文标题:iOS AVAudioSessionInterruptionNo

        本文链接:https://www.haomeiwen.com/subject/zirhkxtx.html