Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Objective-C: How to make AVPlayer keep playing in the background

I know that there are a lot questions like mine but nothing is working for me.

I'm trying to let the AVPlayer keep playing when i exit the app, i have implemented the following Singleton Class :

.h file:

#import <AVFoundation/AVFoundation.h>
#import <Foundation/Foundation.h>

@interface LiveStreamSingleton : NSObject<AVAudioPlayerDelegate>{

}

+(LiveStreamSingleton *)sharedInstance;
-(void)playStream;
-(void)stopStream;
-(bool)status;
@end

.m file:

#import "LiveStreamSingleton.h"

static LiveStreamSingleton *sharedInstance = nil;
@interface LiveStreamSingleton (){
    AVPlayer *audioPlayer;

}

@end
@implementation LiveStreamSingleton

+ (LiveStreamSingleton*) sharedInstance {
    static dispatch_once_t _singletonPredicate;
    static LiveStreamSingleton *_singleton = nil;

    dispatch_once(&_singletonPredicate, ^{
        _singleton = [[super allocWithZone:nil] init];
    });

    return _singleton;
}

+ (id) allocWithZone:(NSZone *)zone {
    return [self sharedInstance];
}

-(void)playStream{

    //NSError *error = nil;
    NSURL *urlStream;
    NSString *urlAddress = @"http://198.178.123.23:8662/stream/1/;listen.mp3";
    urlStream = [[NSURL alloc] initWithString:urlAddress];
    AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:urlStream options:nil];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
    audioPlayer = [AVPlayer playerWithPlayerItem:playerItem];
    //This enables background music playing
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    audioPlayer = [AVPlayer playerWithURL:urlStream];
    if(!audioPlayer.error){
        NSLog(@"Trying to play from singleton!");
        [audioPlayer play];
        NSLog(@"rate: %f",audioPlayer.rate);
    }
}

-(void)stopStream{
    NSLog(@"Trying to stop from singleton!");
    [audioPlayer pause];
}


-(bool)status{
    bool stat;
    if(audioPlayer.rate > 0){
        stat = true;
    }else{
        stat = false;
    }
    return stat;
}

@end

I have set the [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; for playing in the background, but i tried it on my real ipad, it's not working.

Any ideas?

like image 656
Fadi Obaji Avatar asked Dec 24 '22 17:12

Fadi Obaji


1 Answers

add a key named Required background modes in property list (.plist) file ..

as following picture..

enter image description here

and add following code in

Objective-C

AppDelegate.h

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

AppDelegate.m

in application didFinishLaunchingWithOptions

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

Swift

import AVFoundation
import AudioToolbox
class AppDelegate: UIResponder, UIApplicationDelegate
{
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
    {

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
        }
        catch {

        }
    }
}

Hope it helps.

like image 191
Ashish Kakkad Avatar answered Dec 28 '22 09:12

Ashish Kakkad