web-dev-qa-db-fra.com

Comment gérer la lecture audio en arrière-plan lorsque le périphérique iOS est verrouillé ou sur une autre application?

Pour concevoir un système de musique génératif pour iOS, à l'aide d'OpenFrameworks, je devrais fournir un mode dans lequel l'utilisateur pourrait écouter la musique produite par l'application lorsque:

  • l'appareil est verrouillé
  • l'utilisateur utilise une autre application

Certaines applications, telles que BLOOM ou réveil, fonctionnent de la sorte et proposent aux utilisateurs un commutateur pour activer/désactiver cette fonctionnalité.

Des conseils pour ça?

22
gluon

Lecture audio en arrière-plan

Une application qui lit ou enregistre de l'audio en continu (même si l'application tourne en arrière-plan ) Peut s'inscrire pour effectuer ces tâches dans le Contexte. Vous activez la prise en charge audio à partir de la section Modes d’arrière-plan de l'onglet Capacités de votre projet Xcode. (Vous pouvez également activer Cette prise en charge en incluant la clé UIBackgroundModes avec la valeur audio Dans le fichier Info.plist de votre application.) Les applications lisant du contenu audio dans l'arrière-plan doit jouer un contenu audible et non le silence.

Référence Apple "Lecture et enregistrement de sons d'arrière-plan"

S'assurer que l'audio continue lorsque l'écran se verrouille

Pour activer/désactiver cette fonctionnalité, j'ai trouvé Activer et désactiver votre session audio , je ne l'ai pas essayée moi-même, mais cela ressemble à ce dont vous avez besoin.

34
DanSkeel

Vous devez apporter quelques modifications au fichier plist.

c'est à dire. 1) Définir le mode d'arrière-plan requis sur App lit l'audio

2) set L'application ne s'exécute pas en arrière-plan sur NO.

 NSError *setCategoryErr = nil;
 NSError *activationErr  = nil;
 [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
 [[AVAudioSession sharedInstance] setActive:YES error:&activationErr];

Ensuite, vous devez écrire beaucoup de code dans AppDelegate

Désormais, vous pouvez facilement utiliser le son lorsque l'écran du téléphone est verrouillé ou en arrière-plan.

29
dhaval rupani

Apportez les modifications suivantes dans les paramètres de projet xCode ainsi que dans le code.

étape 1) Sélectionnez votre fichier de projet dans le navigateur de Xcode. Ensuite, dans la section Capabilities, activez la sous-section Modes d’arrière-plan. Une fois que la liste des modes d’arrière-plan vous a été fournie, cochez la case Audio & Airplay.

stp 2) Utilisez le code Swift suivant, vous devez définir une session audio pour votre application.

var audioPlayer : AVAudioPlayer!

@IBAction func playButtonClicked(sender : AnyObject){

    let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    dispatch_async(dispatchQueue, {

        if let data = NSData(contentsOfFile: self.audioFilePath())
        {
            do{
                let session = AVAudioSession.sharedInstance()

                try session.setCategory(AVAudioSessionCategoryPlayback)
                try session.setActive(true)

                self.audioPlayer = try AVAudioPlayer(data: data)
                //self.audioPlayer.delegate = self
                self.audioPlayer.prepareToPlay()
                self.audioPlayer.play()
            }
            catch{
                print("\(error)")
            }
        }
    });
}

func audioFilePath() -> String{

    let filePath = NSBundle.mainBundle().pathForResource("mySong", ofType: "mp3")!
    return filePath
}

Cette session de lecture audio sera la lecture de votre application, même si l'application est en arrière-plan ou si le téléphone est en mode silencieux ou si l'appareil est verrouillé.

2
Himanshu Mahajan

Regardez sur ce tutoriel. Il a quelques exemples de services d'arrière-plan

http://www.raywenderlich.com/29948/backgrounding-for-ios

1
hmlasnk

Vous devez apporter quelques modifications au fichier plist.

1) Définir le mode d'arrière-plan requis sur App lit l'audio

2) set L'application ne s'exécute pas en arrière-plan sur NO.

let dispatchQueue = DispatchQueue.global()
            dispatchQueue.async(execute: {
                    do{
                        let session = AVAudioSession.sharedInstance()

                        try session.setCategory(AVAudioSessionCategoryPlayback)
                        try session.setActive(true)

                        self.isObjectAllocate = true
                        if self.isPlayed == false{
                            self.playSound(soundName: "http://radio.zahraun.com:8000/live.m3u")
                            self.isPlayed = true
                            self.btnPlayAudio.setImage(#imageLiteral(resourceName: "pause") , for: .normal)

                        }else{
                            self.audioPlayer.pause()
                            self.isPlayed = false
                            self.btnPlayAudio.setImage(#imageLiteral(resourceName: "audioPlay"), for: .normal)
                        }
                    }
                    catch{
                        print("\(error)")
                    }
            });
0
Varun Naharia