2013-06-12 5 views
1

Я не могу заставить AVPLayer работать в фоновом режиме, он отлично работает, когда приложение запускается, но когда я нажимаю кнопку «домой» (в устройстве), звук останавливается. В чем проблема?AVPlayer & background audio streaming

это APPNAME-.plist:

<key>UIBackgroundModes</key> 
<array> 
    <string>audio</string> 
</array> 

у меня есть этот код в AppDelegate.h:

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

затем в AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

NSURL *url = [NSURL URLWithString:@"mp3url"]; 
// You may find a test stream at <http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8>. 
self.playerItem = [AVPlayerItem playerItemWithURL:url]; 
[_playerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext]; 
self.player = [AVPlayer playerWithPlayerItem:_playerItem]; 

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
// Override point for customization after application launch. 
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
self.window.rootViewController = self.viewController; 
[self.window makeKeyAndVisible]; 

return YES;} 

то в этом метод:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
        change:(NSDictionary *)change context:(void *)context { 

if (context == &ItemStatusContext) { 
    NSLog(@"context?"); 
    AVPlayer *thePlayer = (AVPlayer *)object; 
    if ([thePlayer status] == AVPlayerStatusFailed) { 
     NSLog(@"error"); 
     // Respond to error: for example, display an alert sheet. 
     return; 
    } 
    if ([thePlayer status] == AVPlayerStatusReadyToPlay) { 
     NSLog(@"ready"); 
     [[AVAudioSession sharedInstance] setDelegate:self]; 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback 
               error:nil]; 
     [[AVAudioSession sharedInstance] setActive:YES 
              error:nil]; 
     [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
     [_player play]; 
     return; 
    } 

    if ([thePlayer status] == AVPlayerStatusUnknown) { 
     NSLog(@"unknown"); 
    } 
    // Deal with other status change if appropriate. 
} 
// Deal with other change notifications if appropriate. 
[super observeValueForKeyPath:keyPath ofObject:object 
         change:change context:context]; 
return; 

+1

Я проверил этот код, его рабочий штраф для меня. Я тестировал его на iphone 4s. – iCoder

+0

@ Норберт благодарит за ответ. Моя вина, я просто работал над «тестовой» копией файла plist .... –

+0

У кого-то есть современное решение Swift? – Kaptain

ответ

1

Ошибка, описанная выше. Я просто работал над «тестовой» копией файла plist. Извините

Смежные вопросы