web-dev-qa-db-fra.com

L'application se bloque lors de la lecture audio sur iOS13.1

Je crée une application qui exécute des fichiers audio à partir du bundle principal avec une URL. Quand j'ai testé cela sur iOS 13, tout va bien. Mais avec la nouvelle mise à jour de 13.1, je reçois une erreur ici sur la ligne de code

backgroundMusicPlayer = essayez AVAudioPlayer (contentsOf: URL (fileURLWithPath: sound!))

ça dit:

Thread 1: EXC_BAD_ACCESS (code = 1, adresse = 0x48

Voici le code que j'utilise dans une classe personnalisée qui exécute la musique de fond lorsque l'application se lance:

import Foundation
import AVFoundation

var backgroundMusicPlayer = AVAudioPlayer()

func playBackgroundMusic(filename: String){
let  sound = Bundle.main.path(forResource: filename, ofType: "m4a")

do{
    try     
AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: [AVAudioSession.CategoryOptions.mixWithOthers])
    backgroundMusicPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound!))

}catch{
    print (error)
}
backgroundMusicPlayer.numberOfLoops = -1
backgroundMusicPlayer.prepareToPlay()
backgroundMusicPlayer.play()
}

Tout cela fonctionne bien dans le simulateur sur iOS13, mais se bloque sur un appareil exécutant la version 13.1. Il semble que l'URL soit le problème, mais je ne sais pas pourquoi. Ce même comportement se produit sur d'autres écrans où les boutons déclenchent des fichiers audio à partir du bundle.

17
Terry B

Change ça:

var backgroundMusicPlayer = AVAudioPlayer()

Pour ça:

var backgroundMusicPlayer : AVAudioPlayer!
25
もぶわさお

AVAudioPlayer n'a pas d'init, il doit donc être supprimé.

Solution pour Swift

Si vous initialisez votre AVAudioPlayer comme:

var musicPlayer: AVAudioPlayer = AVAudioPlayer() 

ou

musicPlayer = AVAudioPlayer() 

dans n'importe quelle méthode puis supprimez-le et déclarez comme:

var musicPlayer: AVAudioPlayer!

Solution pour l'objectif C

Si vous initalisez comme

AVAudioPlayer *musicPlayer = [[AVAudioPlayer alloc] init];

SUPPRIMER la partie init de [[AVAudioPlayer alloc] init] pour ressembler à

AVAudioPlayer *musicPlayer = [AVAudioPlayer alloc];

EDIT: Si après cela, votre application s'arrête sur cette ligne, comme si vous y définissiez le point d'arrêt (mais vous ne l'avez pas fait), mais que l'application s'exécute sans problème après avoir cliqué sur lecture/exécution, vous ne devriez pas vous inquiéter car il s'agit d'un niveau c problème qui n'affecte pas l'application. Vous pouvez en savoir plus dans ce thread Donc, la solution consiste à modifier le point d'arrêt pour Toutes les exceptions, changez le type d'exception de "Tous" en "Exceptions Objective-C"

  1. Accédez au navigateur Breakpoint dans Xcode.
  2. Cliquez avec le bouton droit de la souris sur la ligne "Toutes les exceptions".
  3. Sélectionnez l'option "Modifier le point d'arrêt ...".
  4. Modifiez l'exception de Tous à Objective-C.

enter image description here

5
omanosoft

Ajoutez le code ci-dessous dans AppDelegate.Swift

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSession.Category.playback)
    }
    catch {
        print("Setting category to AVAudioSessionCategoryPlayback failed.")
    }
    return true
}
0
Shubhendu Amitabh