L'application se bloque avec le message d'erreur suivant
2019-10-12 20:01:34.332334-0700 Awesome App[26368:3535170] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x600002903280> F8BB1C28-BAE8-11D6-9C31-00039315CD46
Le point d'arrêt au crash semble être lié à AVAudioPlayer
let path = Bundle.main.path(forResource: "menu_background.mp3", ofType:nil)!
audioPlayer = try AwesomeAudioPlayer(contentsOf: URL(fileURLWithPath: path)) ---> breakpoint
J'ai trouvé la solution dans un autre thread stackoverflow sur AVAudioPlayer, le voici:
Si vous initialisez votre AVAudioPlayer
comme
var wrongMusicPlayer: AVAudioPlayer = AVAudioPlayer()
OR wrongMusicPlayer = AVAudioPlayer()
dans n'importe quelle méthode, veuillez le supprimer et simplement déclarer comme var wrongMusicPlayer: AVAudioPlayer
!.
Je pense que vous avez peut-être tous ajouté AVFoundation à la liste des cadres dans l'onglet Informations générales du projet.
Le code erroné était le suivant:
import SwiftUI
import AVFoundation
struct PlayerDetailView: View {
@State private var downloadedFilePath: URL = nil
var audioPlayer: AVAudioPlayer
var body: some View {
Et après avoir déplacé le var audioPlayer: AVAudioPlayer
déclaration juste après la ligne de import AVFoundation
ligne, il semblait fonctionner.
Le code suivant a donc fonctionné pour moi dans un projet SwiftUI
.
import SwiftUI
import AVFoundation
var audioPlayer: AVAudioPlayer!
struct PlayerDetailView: View {
@State private var downloadedFilePath: URL = nil
var body: some View {
VStack {
Button("Play the Downloaded Track") {
if let downloadedPath = self.downloadedFilePath?.path, FileManager().fileExists(atPath: downloadedPath) {
do {
audioPlayer = try AVAudioPlayer(contentsOf: self.downloadedFilePath!)
guard let player = audioPlayer else { return }
player.prepareToPlay()
player.play()
} catch let error {
print(error.localizedDescription)
}
} else {
print("The file doesn not exist at path || may not have been downloaded yet")
}
}
}
}
}
Je suivais initialement ce tutoriel de CodeWithChris et sa discussion a également conduit au changement ci-dessus. Vérifiez également suivant le tutoriel aussi si vous avez besoin d'autres exemples.
J'espère que cela sera utile à quelqu'un d'entre vous!
À votre santé!
Vous pouvez utiliser do/catch pour éviter le plantage et examiner l'exception, ou ignorer le problème avec try?
. Pour moi, cela n'apparaissait que dans le simulateur lors de l'appel:
try? AVAudioSession.sharedInstance().setCategory(.playback)
Je pense qu'il est prudent de l'ignorer dans mon cas.
Je crois que le message d'erreur est un avertissement pour les simulateurs, il n'est donc pas important.
Je pense que votre problème est un bug dans votre code. Devrait être quelque chose comme ça:
let path = Bundle.main.path(forResource: "menu_background", ofType:"mp3") audioPlayer = try AwesomeAudioPlayer(contentsOf: URL(fileURLWithPath: path!)) ---> breakpoint
Où forResource est le nom du fichier et ofType est l'extension. Vous pouvez également utiliser Bundle.main.url qui ressemblera à ceci:
let path = Bundle.main.url(forResource: "menu_background", withExtension:"mp3") audioPlayer = try AwesomeAudioPlayer(contentsOf: URL(fileURLWithPath: path!)) ---> breakpoint