Je veux jouer de la musique même si l'application passe en arrière-plan. J'ai vérifié tous les liens stackoverflow mais aucun d'eux n'a fonctionné. Veuillez aider à le faire aujourd'hui.
J'avais utilisé le code suivant: -
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];
J'avais résolu cette question en me référant tâches d'arrière-plan de l'application iOS
et apportez quelques modifications dans .plist
fichier de notre application ..
Mise à jour
écrire ce code dans la vue de votre contrôleur a fait une méthode de chargement comme celle-ci
- (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];
}
Je voulais juste ajouter une note à la réponse de Mehul. Cette ligne:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
est en fait très important. J'ai utilisé d'autres tutoriels pour mettre mon AVAudioPlayer en service. Tout a bien fonctionné, sauf que mon audio ne démarrerait pas si l'application était en arrière-plan. Pour clarifier, mon audio était bien s'il était déjà en cours de lecture lorsque l'application était en arrière-plan ... mais il ne démarrerait pas si l'application était déjà en arrière-plan.
L'ajout de la ligne de code ci-dessus a permis à mon audio de démarrer même si l'application était en arrière-plan.
Vous devez définir "audio" comme l'un de vos UIBackgroundModes dans Info.plist. Apple a documentation sur le problème .
Écrivez cette ligne pour plist pour l'exécution en arrière-plan ...
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
Écrivez ce code Où vous voulez utiliser
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];
Aussi important ici si vous utilisez MPMusicPlayerController
: Vous devez utiliser:
[MPMusicPlayerController iPodMusicPlayer]
Et pas
[MPMusicPlayerController applicationMusicPlayer]
De plus, si vous ne souhaitez pas que votre application stop music
qui était en cours de lecture au démarrage de votre application, regardez ici: AVAudioPlayer désactive l'iPod - comment contourner?
Étape 1
Apportez les modifications suivantes dans info.plist
L'application ne s'exécute pas en arrière-plan: NON
Modes d'arrière-plan requis
item0 :App plays audio or streams audio/video using AirPlay
Étape 2 N'oubliez pas d'ajouter les éléments suivants dans MainViewController.h
fichier
#import <'AVFoundation/AVAudioPlayer.h>
@interface MainViewController:<'AVAudioPlayerDelegate>
AVAudioPlayer *H_audio_player;
Étape Ajoutez le code suivant dans la action de lecture de votre classe 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;
Vous pouvez utiliser MPMoviePlayerController même pour lire des films audio en solo. Si vous l'aimez, lisez ceci Apple Q&A technique de la bibliothèque:
Q&A technique de la bibliothèque des développeurs iOS QA1668
Si même après avoir défini l'audio comme l'un de vos UIBackgroundModes
dans la liste, l'audio s'arrête lorsque vous passez en arrière-plan, essayez setting
votre application's audio session
à media playback
.
Voici la référence associée: https://developer.Apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html
Voici à quoi ressemblera le code:
NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: &activationError];
NSError*setCategoryError = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
J'utilise le code ci-dessous. Cela fonctionne pour moi et appelle le clic du bouton de la méthode d'instance du lecteur audio.
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 toutes les réponses, il manque ce code pour contrôler le lecteur lorsque l'utilisateur réveille l'appareil:
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
[_audioPlayer play];
break;
case UIEventSubtypeRemoteControlPause:
[_audioPlayer pause];
break;
default:
break;
}
}
Et vous avez toutes ces options:
UIEventSubtypeRemoteControlPlay = 100,
UIEventSubtypeRemoteControlPause = 101,
UIEventSubtypeRemoteControlStop = 102,
UIEventSubtypeRemoteControlTogglePlayPause = 103,
UIEventSubtypeRemoteControlNextTrack = 104,
UIEventSubtypeRemoteControlPreviousTrack = 105,
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
UIEventSubtypeRemoteControlEndSeekingBackward = 107,
UIEventSubtypeRemoteControlBeginSeekingForward = 108,
UIEventSubtypeRemoteControlEndSeekingForward = 109,
Pour lire votre audio en arrière-plan
Étape 1: Ajoutez simplement votre info.plist créez un tableau
étape 2 :
- (void)applicationDidEnterBackground:(UIApplication *)application
{
__block UIBackgroundTaskIdentifier task = 0;
task=[application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]);
[application endBackgroundTask:task];
task=UIBackgroundTaskInvalid;
}];
}
étape 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];
À partir de l'exemple de code d'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];
}
Je pense que les événements de contrôle à distance ne sont pas nécessaires dans le cas suivant:
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers,
sizeof(value), &value);