AVAudioSession Passcode-lock在iOS8上停止AVAudioRecorder

时间:2014-11-11 14:43:54

标签: ios objective-c audio-recording avaudiorecorder avaudiosession

我遇到了与后台录制相关的意外问题(特别是当屏幕变为密码锁定时)。在摘要中,我的 AVAudioRecorder 应用程序似乎在前台,后台(切换应用程序时)和屏幕关闭时(但在激活密码锁之前)正确记录。

如果我延迟密码锁定(设置>密码>要求密码> 4小时.etc ),那么录制工作在前景/后台/应用切换/屏幕关闭时没有问题。等等,但是当录音中的密码锁定被破坏时。

我基本上使用 AVAudioRecorder 代码录制音频,并通过设置' UIBackgroundModes / audio'来遵循指南。在app.plist中设置以确保背景录制,这似乎在后台工作(即出现红色录制栏)但在通行码变为活动时失败,即用户按下电源按钮并需要输入密码才能访问设备。

我的代码设置为通过' AVAudioSessionInterruptionNotification '处理音频中断,AVAudioSession设置为' withOptions:AVAudioSessionCategoryOptionDuckOthers ',以最大限度地减少外部事件影响后台录制。

[测试程序]

  • 密码锁定(iPhone 5 / iOS8.1>设置>密码>需要密码> 5分钟后)

    1. [Success-CASE-1]'开始录制'持续7分钟使屏幕保持开启且应用程序有效/可见(即,在开始录制后未在后台运行)>>录制工作和按“停止录制”后,音频将被保存并可以播放。

    2. [Success-CASE-2]'开始录制'持续7分钟保持屏幕开启和切换应用程序(即在背景中运行,屏幕主要是开启,并且在开始录制后显示红色记录条)>>录制工作和按“停止录制”后,音频将被保存并可以播放。

    3. [故障 - 案例]'开始录制'7分钟切换屏幕关闭(即应用程序在后台运行,设备屏幕关闭)>>使用屏幕关闭7分钟后,设备在屏幕打开时需要密码。录音意外停止,变得腐败无法播放。

  • 密码锁定(iPhone 5 / iOS8.1>设置>密码>需要密码> 15分钟后)

    1. [重复失败 - 带有调整后的密码的情况]“开始记录”7分钟切换屏幕关闭(即应用程序在后台运行,设备屏幕关闭)>>使用屏幕关闭7分钟后,设备开启(此时不需要通过锁定)。录音没问题,效果很好,可以播放。

只有Failure-CASE和Repeat-Failure-CASE之间的区别是不需要屏幕锁定密码。

[注意]

  1. 在iPhone 4/5/6,iPad Mini 2(iOS8.1)上使用XCode 6.1进行测试,但问题相同。
  2. 代码是标准的AVAudioRecorder代码,AVAudioSession设置类似于: http://www.jacopretorius.net/2013/04/record-and-playback-audio-in-ios.html
  3. ..

    希望信息有所帮助,花了很多试验和错误来达到这一点。

    还有其他人遇到过这个问题吗?因为它很奇怪。

    感谢

1 个答案:

答案 0 :(得分:1)

当密码锁定时,您的音频文件(在沙盒中)可能受iOS保护; 如果在没有设置密码的情况下锁定屏幕,则一切正常;

尝试以下方法:

        NSDictionary *oldAttr = [[NSFileManager defaultManager]attributesOfItemAtPath:localFilePath error:nil];
        NSMutableDictionary *newAttr = nil;
        if (oldAttr){
            newAttr = [[NSMutableDictionary alloc]initWithDictionary:oldAttr];
        }else{
            newAttr = [[NSMutableDictionary alloc]init];
        }
        [newAttr setObject:NSFileProtectionNone forKey:NSFileProtectionKey];
        [[NSFileManager defaultManager] setAttributes:newAttr
                                         ofItemAtPath:localFilePath
                                                error:nil];

或者,将证书中的数据保护设置为关闭。