Eu quero tocar música mesmo que o aplicativo esteja em segundo plano. Eu verifiquei todos os links stackoverflow, mas nenhum deles funcionou. Por favor, ajude a necessidade de fazê-lo hoje.
Eu usei o seguinte código:
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Day At The Beach" ofType: @"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; NSError *error; playerTemp = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error]; playerTemp.numberOfLoops = 0; AudioSessionSetActive(true); [playerTemp play];
Eu tinha resolvido esta questão, referindo-se a tarefas de fundo de aplicativos iOS
e faça algumas alterações no arquivo .plist
do nosso aplicativo.
Atualizar
escrever este código na exibição do seu controlador fez método de carga como este
- (void)viewDidLoad { NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"in-the-storm" ofType:@"mp3"]]; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [audioPlayer play]; [super viewDidLoad]; }
Eu só queria adicionar uma nota à resposta de Mehul. Está linha:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
é realmente muito importante. Eu usei outros tutoriais para colocar meu AVAudioPlayer em funcionamento. Tudo funcionou bem, exceto que meu áudio não iniciaria se o aplicativo estivesse em segundo plano. Para esclarecer, meu áudio estava bem se já estava sendo reproduzido quando o aplicativo entrou em segundo plano … mas não seria iniciado se o aplicativo já estivesse em segundo plano.
A adição da linha de código acima fez com que meu áudio fosse iniciado mesmo se o aplicativo estivesse em segundo plano.
Você precisa definir ‘audio’ como um dos seus UIBackgroundModes no Info.plist. A Apple tem documentação sobre o assunto .
Você pode usar o MPMoviePlayerController até mesmo para reproduzir filmes de áudio solo. Se você gostou, leia este detalhado Q & A técnico da Apple Library:
Biblioteca técnica do desenvolvedor do iOS Q & A QA1668
Passo 1
Faça as seguintes alterações no info.plist
Aplicativo não é executado em segundo plano: NÃO
Modos de fundo necessários
item0 :App plays audio or streams audio/video using AirPlay
Etapa 2 Não esqueça de adicionar os seguintes itens no arquivo MainViewController.h
#import <'AVFoundation/AVAudioPlayer.h>
@interface MainViewController:<'AVAudioPlayerDelegate>
AVAudioPlayer *H_audio_player;
Etapa 3 Adicione o seguinte código dentro da ação de reprodução da sua class MainViewController
.
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d-%d",C_CID, C_SID] ofType:@"mp3"]; NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; H_audio_player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil]; H_audio_player.delegate = self; H_audio_player.numberOfLoops = -1;
Escreva esta linha para plist para executar em segundo plano …
UIBackgroundModes audio
Escreva este código onde você deseja usar
AVAudioPlayer* audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.urlForConevW error:&error]; audioPlayer.delegate = self; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; audioPlayer.numberOfLoops = 1; [audioPlayer play];
Também é importante aqui se você estiver usando o MPMusicPlayerController
: Você deve usar:
[MPMusicPlayerController iPodMusicPlayer]
E não
[MPMusicPlayerController applicationMusicPlayer]
Além disso, se você não quiser que seu aplicativo stop music
que estava sendo reproduzida quando o aplicativo for iniciado, veja aqui: AVAudioPlayer desativa o iPod – como contornar o problema?
Eu uso o código abaixo. Funciona para mim e clica no botão de clique do método da instância do reprodutor de áudio.
NSError *error; NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]]; self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error]; [[AVAudioSession sharedInstance] setActive:YES error: &error]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self.player prepareToPlay];
De todas as respostas está faltando este código para controlar o jogador quando o usuário está acordando o dispositivo:
- (BOOL)canBecomeFirstResponder { return YES; } - (void)remoteControlReceivedWithEvent:(UIEvent *)event { switch (event.subtype) { case UIEventSubtypeRemoteControlPlay: [_audioPlayer play]; break; case UIEventSubtypeRemoteControlPause: [_audioPlayer pause]; break; default: break; } }
E você tem todas essas opções:
UIEventSubtypeRemoteControlPlay = 100, UIEventSubtypeRemoteControlPause = 101, UIEventSubtypeRemoteControlStop = 102, UIEventSubtypeRemoteControlTogglePlayPause = 103, UIEventSubtypeRemoteControlNextTrack = 104, UIEventSubtypeRemoteControlPreviousTrack = 105, UIEventSubtypeRemoteControlBeginSeekingBackward = 106, UIEventSubtypeRemoteControlEndSeekingBackward = 107, UIEventSubtypeRemoteControlBeginSeekingForward = 108, UIEventSubtypeRemoteControlEndSeekingForward = 109,
Se, mesmo depois de definir o áudio como um dos seus UIBackgroundModes
no plist, o áudio parar ao ir para o fundo, tente setting
application's audio session
seu application's audio session
para media playback
.
Veja a referência relacionada: https://developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html
Aqui está como o código será:
NSError *activationError = nil; [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; NSError*setCategoryError = nil; [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
Para reproduzir seu áudio em segundo plano
Passo 1: Basta adicionar o seu info.plist fazer um array
passo 2 :
- (void)applicationDidEnterBackground:(UIApplication *)application { __block UIBackgroundTaskIdentifier task = 0; task=[application beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]); [application endBackgroundTask:task]; task=UIBackgroundTaskInvalid; }]; }
etapa 3 :
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"iNamokar" ofType:@"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath]; AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [player prepareToPlay]; [self.player play];
A partir do código de exemplo da Apple: Audio Mixer (MixerHost)
// If using a nonmixable audio session category, as this app does, you must activate reception of // remote-control events to allow reactivation of the audio session when running in the background. // Also, to receive remote-control events, the app must be eligible to become the first responder. - (void) viewDidAppear: (BOOL) animated { [super viewDidAppear: animated]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; }
Eu acho que os events de controle remoto não são necessários para o seguinte caso:
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(value), &value);