Objective-C: 如何让AVPlayer一直在后台播放

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.

我试图让 AVPlayer 在我退出应用程序时继续播放,我已经实现了以下 Singleton Class :

.h 文件:

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

@interface LiveStreamSingleton : NSObject<AVAudioPlayerDelegate>{

}

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

.m 文件:

#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

我已经设置了 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 在后台播放,但我在我的 ipad 上试过了,它不起作用。

有什么想法吗?

在 属性 列表 (.plist) 文件中添加一个名为 Required background modes 的键..

如下图..

并在

中添加以下代码

Objective-C

AppDelegate.h

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

AppDelegate.m

在应用程序 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 {

        }
    }
}

希望对您有所帮助。