Фоновое аудио не воспроизводится - PullRequest
0 голосов
/ 05 марта 2012

Я борюсь за пару дней, чтобы разобраться в этом и просто не могу найти выход.Я хочу воспроизводить звук в фоновом режиме при выходе из приложения или при нажатии на ссылку, чтобы перейти в Safari, но я просто не перехожу в фоновый режим.Пожалуйста, помогите.

FirstViewController.h файл:

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

@interface RygestopFirstViewController : UIViewController <AVAudioPlayerDelegate> {

    IBOutlet UIButton                   *playButton;
    IBOutlet UISlider                   *volumeSlider;
    IBOutlet UISlider                   *progressBar;
    IBOutlet UILabel                    *currentTime;
    IBOutlet UILabel                    *duration;

    AVAudioPlayer                       *player;
    UIImage                             *playBtnBG;
    UIImage                             *pauseBtnBG;
    NSTimer                             *updateTimer;

    BOOL                                inBackground;

}

- (IBAction)playButtonPressed:(UIButton*)sender;
- (IBAction)volumeSliderMoved:(UISlider*)sender;
- (IBAction)progressSliderMoved:(UISlider*)sender;

@property (nonatomic, retain)   UIButton        *playButton;
@property (nonatomic, retain)   UISlider        *volumeSlider;
@property (nonatomic, retain)   UISlider        *progressBar;
@property (nonatomic, retain)   UILabel         *currentTime;
@property (nonatomic, retain)   UILabel         *duration;

@property (nonatomic, retain)   NSTimer         *updateTimer;
@property (nonatomic, assign)   AVAudioPlayer           *player;

@property (nonatomic, assign)   BOOL            inBackground;

@end

FirstViewController.m код:

// amount to skip on rewind or fast forward
#define SKIP_TIME 1.0           
// amount to play between skips
#define SKIP_INTERVAL .2

@implementation RygestopFirstViewController

@synthesize playButton;
@synthesize volumeSlider;
@synthesize progressBar;
@synthesize currentTime;
@synthesize duration;
@synthesize updateTimer;
@synthesize player;
@synthesize inBackground;

-(void)updateCurrentTimeForPlayer:(AVAudioPlayer *)p
{
    currentTime.text = [NSString stringWithFormat:@"%d:%02d", (int)p.currentTime / 60, (int)p.currentTime % 60, nil];
    progressBar.value = p.currentTime;
}

- (void)updateCurrentTime
{
    [self updateCurrentTimeForPlayer:self.player];
}

- (void)updateViewForPlayerState:(AVAudioPlayer *)p
{
    [self updateCurrentTimeForPlayer:p];

    if (updateTimer) 
        [updateTimer invalidate];

    if (p.playing)
    {
        [playButton setImage:((p.playing == YES) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal];

        updateTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateCurrentTime) userInfo:p repeats:YES];
    }
    else
    {
        [playButton setImage:((p.playing == YES) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal];
        updateTimer = nil;
    }

}

- (void)updateViewForPlayerStateInBackground:(AVAudioPlayer *)p
{
    [self updateCurrentTimeForPlayer:p];

    if (p.playing)
    {
        [playButton setImage:((p.playing == YES) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal];
    }
    else
    {
        [playButton setImage:((p.playing == YES) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal];
    }   
}

-(void)updateViewForPlayerInfo:(AVAudioPlayer*)p
{
    duration.text = [NSString stringWithFormat:@"%d:%02d", (int)p.duration / 60, (int)p.duration % 60, nil];
    progressBar.maximumValue = p.duration;
    volumeSlider.value = p.volume;
}

-(void)pausePlaybackForPlayer:(AVAudioPlayer*)p
{
    [p pause];
    [self updateViewForPlayerState:p];
}

-(void)startPlaybackForPlayer:(AVAudioPlayer*)p
{
    if ([p play])
    {
        [self updateViewForPlayerState:p];
    }
    else
        NSLog(@"Could not play %@\n", p.url);
}

- (IBAction)playButtonPressed:(UIButton *)sender
{
    if (player.playing == YES)
        [self pausePlaybackForPlayer: player];
    else
        [self startPlaybackForPlayer: player];
}

- (IBAction)volumeSliderMoved:(UISlider *)sender
{
    player.volume = [sender value];
}

- (IBAction)progressSliderMoved:(UISlider *)sender
{
    player.currentTime = sender.value;
    [self updateCurrentTimeForPlayer:player];
}

- (void)dealloc
{
    [super dealloc];

    [playButton release];
    [volumeSlider release];
    [progressBar release];
    [currentTime release];
    [duration release];

    [updateTimer release];
    [player release];

    [playBtnBG release];
    [pauseBtnBG release];   
}

#pragma mark AVAudioPlayer delegate methods

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)p successfully:(BOOL)flag
{
    if (flag == NO)
        NSLog(@"Playback finished unsuccessfully");

    [p setCurrentTime:0.];
    if (inBackground)
    {
        [self updateViewForPlayerStateInBackground:p];
    }
    else
    {
        [self updateViewForPlayerState:p];
    }
}

- (void)playerDecodeErrorDidOccur:(AVAudioPlayer *)p error:(NSError *)error
{
    NSLog(@"ERROR IN DECODE: %@\n", error); 
}

// we will only get these notifications if playback was interrupted
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)p
{
    NSLog(@"Interruption begin. Updating UI for new state");
    // the object has already been paused,  we just need to update UI
    if (inBackground)
    {
        [self updateViewForPlayerStateInBackground:p];
    }
    else
    {
        [self updateViewForPlayerState:p];
    }
}

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)p
{
    NSLog(@"Interruption ended. Resuming playback");
    [self startPlaybackForPlayer:p];
}

#pragma mark background notifications
- (void)registerForBackgroundNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(setInBackgroundFlag)
                                                 name:UIApplicationWillResignActiveNotification
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(clearInBackgroundFlag)
                                                 name:UIApplicationWillEnterForegroundNotification
                                               object:nil];
}

- (void)setInBackgroundFlag
{
    inBackground = true;
}

- (void)clearInBackgroundFlag
{
    inBackground = false;
}



- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Play", @"First");
        self.tabBarItem.image = [UIImage imageNamed:@"Home"];
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

//Make sure we can recieve remote control events
- (BOOL)canBecomeFirstResponder {
    return YES;
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    playBtnBG = [[UIImage imageNamed:@"Player.png"] retain];
    pauseBtnBG = [[UIImage imageNamed:@"Pause.png"] retain];

    [playButton setImage:playBtnBG forState:UIControlStateNormal];

    [self registerForBackgroundNotifications];

    updateTimer = nil;

    duration.adjustsFontSizeToFitWidth = YES;
    currentTime.adjustsFontSizeToFitWidth = YES;
    progressBar.minimumValue = 0.0; 

    // Load the the sample file, use mono or stero sample

    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:@"Sound1" ofType:@"m4a"]];

    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];  
    if (self.player)
    {
        [self updateViewForPlayerInfo:player];
        [self updateViewForPlayerState:player];
        player.numberOfLoops = 0;
        player.delegate = self;
    }


    [fileURL release];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

И, кстати, я хочу, чтобы работать на вкладкепанель приложения, поэтому фоновый режим должен присутствовать всегда.

1 Ответ

0 голосов
/ 07 марта 2012

Вот что вы ищете: https://devforums.apple.com/message/264397 и установите для фонового режима значение «Приложение воспроизводит аудио» в файле .plist вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...