iTag iTag - 1 year ago 51
iOS Question

AVAudioPlayer is not playing in Background when iPhone is locked

Actually i fetching the songs from Documents Directory.

I referred this Link:- , But it will play the songs from bundle only. but i want to play the songs from documents Directory.

I tried

  1. Background modes in the Plist

  2. Application Does not in background = No in Plist

  3. In Appdelegate didFinishLaunchingWithOptions:-

    NSError *setCategoryErr = nil;
    NSError *activationErr = nil;
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
    [[AVAudioSession sharedInstance] setActive:YES error:&activationErr];

  4. PlayMethod()

    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];


    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];


    NSError *error;

    UIBackgroundTaskIdentifier bgTaskId = 0;

    if (_audioPlayer == nil)
    NSLog([error description]);

    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 .

    All I tried But not working!. Can anyone help me.

Answer Source

I used Data Protection mechanism and particularly before I am going to write the NSDATA into Documents directory. I need to set the Protection None to particular file path. So I used NSProtectionNone Property for the file path. If we won't set the ProtentionNone property the Apple won't allow to access the file on Locked State.

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..");

    NSLog(@"Writting file mechanism - Failed!");

And I used to play the Dummy audio file in infinite loop from App Bundle. so the dummy audio file is playing continuously using AVFoundation Framework. So I can able to access the Documents directory audio files continuously. one by one.