2014-02-19 19 views
15

Ich verwende eine Instanz von AVAudioPlayer, um eine Audiodatei abzuspielen. Die App ist so konfiguriert, dass Audio im Hintergrund abgespielt wird und eine geeignete Audiositzung eingerichtet wird. Ich erhalte auch erfolgreich Fernbedienungsereignisse.Warum verschwinden die Audioeinstellungen für den Sperrbildschirm, wenn ich AVAudioPlayer pausiere?

Hier ist der Code:

#import "ViewController.h" 
#import <AVFoundation/AVFoundation.h> 

@interface ViewController() 

@property (nonatomic) AVAudioPlayer *player; 

@end 

@implementation ViewController 

@synthesize player; 

- (BOOL)canBecomeFirstResponder { return YES; } 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Turn on remote control event delivery 

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

    // Set ourselves as the first responder 

    [self becomeFirstResponder]; 

    // Set the audio session 

    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    NSError *setCategoryError = nil; 
    BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; 
    NSError *activationError = nil; 
    success = [audioSession setActive:YES error:&activationError]; 

    // Play an mp3 with AVAudioPlayer 

    NSString *audioFileName = @"%@/Via_Aurora.mp3"; 
    NSURL *audioURL = [NSURL fileURLWithPath:[NSString stringWithFormat:audioFileName, [[NSBundle mainBundle] resourcePath]]]; 
    player = [[AVPlayer alloc] initWithURL:audioURL]; 

    [player play]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 

    // Turn off remote control event delivery & Resign as first responder 

    [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
    [self resignFirstResponder]; 

    // Don't forget to call super 

    [super viewWillDisappear:animated]; 
} 

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { 

    if (receivedEvent.type == UIEventTypeRemoteControl) { 

     switch (receivedEvent.subtype) { 

      case UIEventSubtypeRemoteControlPreviousTrack: 
       NSLog(@"prev"); 
       break; 

      case UIEventSubtypeRemoteControlNextTrack: 
       NSLog(@"next"); 
       break; 

      case UIEventSubtypeRemoteControlPlay: 
       [player play]; 
       break; 

      case UIEventSubtypeRemoteControlPause: 
       [player pause]; 
       break; 

      default: 
       break; 
     } 
    } 
} 

@end 

Wenn ich die App des Audio spielt, wenn die Ansicht Lasten laufen. Die App spielt weiterhin Audio ab, wenn sie in den Hintergrundmodus wechselt. Ich bin in der Lage, Audio aus dem Control Center anzuhalten und/oder wiederzugeben (Zugriff entweder über die App oder über den Sperrbildschirm), aber wenn ich auf die Audiosteuerung des Sperrbildschirms zugreife und den Player pausiere, wird die Musik angehalten und der Sperrbildschirm gesteuert verschwinden. Ich erwarte, dass die Musik pausiert, aber nicht, dass die Steuerelemente verschwinden.

In anderen Audio-Anwendungen, die ich verwende, können Sie anhalten, dann spielen, Audio aus dem Sperrbildschirm. Habe ich etwas übersehen? Ist das ein richtiger Ansatz, um so etwas zu tun?

Antwort

21

Sie auf dem richtigen Weg sind ...

Sie scheinen Einstellung zu fehlen;

MPNowPlayingInfoCenter nowPlayingInfo 

Ohne sie, Sie werden die Ergebnisse beschrieben, IE nach einer Pause Drücken der Sperrbildschirm nicht mehr angezeigt, die Pause, oder in der Tat, dass es ein Lied gespielt wird. Hier ist eine Anleitung, wie man sie einstellt (ich habe das aus dem Arbeitscode genommen, den ich vor einiger Zeit gemacht habe, aber ich bin sicher, dass du herausfinden kannst, was was ist).

MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc]initWithImage:albumImage]; 
    [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = [NSDictionary dictionaryWithObjectsAndKeys:aSong.songTitle, MPMediaItemPropertyTitle, 
                  aSong.artistName, MPMediaItemPropertyArtist, artwork, MPMediaItemPropertyArtwork, 1.0f, MPNowPlayingInfoPropertyPlaybackRate, nil]; 
+0

Danke @ mdb983 - das war das fehlende Stück! – maml

+0

Gern geschehen. Froh, dass es geholfen hat! – MDB983

+0

Total Lebensretter! Ich hatte das gleiche Problem wie der ursprüngliche Autor und das machte den Trick für mich :) – Audioy

0

Fügen Sie diesen Code in ViewDidLoad() für Hintergrundspiel hinzu. Es funktioniert für mich. Sie sollten es versuchen

UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 

    let session:AVAudioSession = AVAudioSession.sharedInstance() 

    do 
    { 
     try session.setCategory(AVAudioSessionCategoryPlayback) 
    } 
    catch 
    { 
     print("Background Play Error") 
    }