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 不在后台播放的主要内容,如果未能解决你的问题,请参考以下文章

设备锁定时,AVAudioPlayer 不会播放

即使类别是 AVAudioSessionCategoryPlayback,AVAudioPlayer 也会在屏幕锁定时停止播放

使用 AVAudioPlayer 控制锁定屏幕上的音频

为啥 AVAudioPlayer 不播放?

iPhone AVAudioPlayer 应用程序在第一次播放时冻结

通过 Apple iPhone Earpods 控制 AVAudioPlayer