iPhone 锁定时,AVAudioPlayer 不在后台播放
Posted
技术标签:
【中文标题】iPhone 锁定时,AVAudioPlayer 不在后台播放【英文标题】:AVAudioPlayer is not playing in Background when iPhone is locked 【发布时间】:2014-02-19 08:46:54 【问题描述】:实际上我是从 Documents Directory 中获取歌曲的。
我参考了这个链接:- http://www.raywenderlich.com/29948/backgrounding-for-ios ,但它只会播放捆绑包中的歌曲。但我想播放文件目录中的歌曲。
我试过了
Plist 中的背景模式
应用程序不在后台 = Plist 中没有
在 Appdelegate 中 didFinishLaunchingWithOptions:-
NSError *setCategoryErr = nil;
NSError *activationErr = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr];
播放方法()
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:saveFileName];
NSURL *url1 = [[NSURL alloc] initFileURLWithPath: path];
self.audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:NULL];
[self.audioPlayer play];
self.seekBarSlider.minimumValue = 0.0f;
self.seekBarSlider.maximumValue = self.audioPlayer.duration;
//[self updateTime];
self.isPlaying=YES;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
_audioPlayer.delegate=self;
NSError *error;
UIBackgroundTaskIdentifier bgTaskId = 0;
if (_audioPlayer == nil)
NSLog([error description]);
else
UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
[_audioPlayer prepareToPlay];
if([_audioPlayer play])
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
if (newTaskId != UIBackgroundTaskInvalid && bgTaskId != UIBackgroundTaskInvalid)
[[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
bgTaskId = newTaskId;
数据保护:
Under the Xcode -> capabilities .
所有我都试过但没有工作!。谁能帮帮我。
【问题讨论】:
【参考方案1】:当您的设备解锁时,它是否在后台工作?
如果是这样,这听起来像是权限问题。如果您在 developer.apple.com 上为您的应用启用了数据保护。当设备被密码锁定时,您将无法读取文档目录,因为文件已加密。
当设备被锁定时,我们在尝试写入数据库时遇到了困难。浪费了两天时间来弄清楚这一点。
W
编辑 - 也可以在 Xcode 中的功能下找到设置【讨论】:
【参考方案2】:我使用了数据保护机制,尤其是在我将 NSDATA 写入 Documents 目录之前。我需要将保护无设置为特定的文件路径。所以我使用 NSProtectionNone 属性作为文件路径。 如果我们不设置 ProtentionNone 属性,Apple 将不允许访问处于锁定状态的文件。
NSDictionary *protection = [NSDictionary dictionaryWithObject:NSFileProtectionNone forKey:NSFileProtectionKey];
[[NSFileManager defaultManager] setAttributes:protection ofItemAtPath:_path error:nil];
if( [_rawData writeToFile:_path atomically:YES])
NSLog(@"HOpefully written into Documentz directory..");
else
NSLog(@"Writting file mechanism - Failed!");
我曾经在 App Bundle 中无限循环播放 Dummy 音频文件。所以虚拟音频文件正在使用 AVFoundation 框架连续播放。所以我可以连续访问 Documents 目录下的音频文件。一个接一个。
【讨论】:
【参考方案3】:如果您将应用程序的Info.plist
中的UIBackgroundModes
键设置为audio
,音频将在后台播放时继续播放。
音频:应用在后台播放有声内容。
更多关于UIBackgroundModes
键检查here
【讨论】:
【参考方案4】:您的设备上当前是否有其他音频/视频应用程序正在运行?其中一些也使用 AVAudioSessionCategoryPlayback 可能会中断您的音频会话。
How it is said on Apple Developer:
默认情况下,使用此类别意味着您的应用的音频是不可混合的——激活您的会话将中断任何其他同样不可混合的音频会话。要允许此类别混合,请使用 AVAudioSessionCategoryOptionMixWithOthers 选项。
【讨论】:
以上是关于iPhone 锁定时,AVAudioPlayer 不在后台播放的主要内容,如果未能解决你的问题,请参考以下文章
即使类别是 AVAudioSessionCategoryPlayback,AVAudioPlayer 也会在屏幕锁定时停止播放