20
votes

Erreur Swift 5.1: [plugin] AddInstanceForFactory: Aucune usine enregistrée pour l'id <CFUUID

L'application se bloque avec le message d'erreur suivant

let path = Bundle.main.path(forResource: "menu_background.mp3", ofType:nil)!
audioPlayer = try AwesomeAudioPlayer(contentsOf: URL(fileURLWithPath: path)) ---> breakpoint

Le point d'arrêt au crash semble être lié à AVAudioPlayer

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


0 commentaires

6 Réponses :


1
votes

J'ai trouvé la solution dans un autre fil de discussion stackoverflow sur AVAudioPlayer, la voici:

Si vous initialisez votre AVAudioPlayer comme

var wrongMusicPlayer: AVAudioPlayer = AVAudioPlayer() OU wrongMusicPlayer = AVAudioPlayer() dans n'importe quelle méthode, supprimez-le et déclarez simplement comme var wrongMusicPlayer: AVAudioPlayer !.


3 commentaires

PAS la solution, malheureusement.


quelqu'un a-t-il encore trouvé une solution à cela? avoir le même problème et cette réponse acceptée ne fonctionne pas pour moi


@alionthego Bien que je n'ai pas encore plongé profondément dans cette erreur, ce que j'ai trouvé est que c'est une erreur que vous obtenez lorsque vous utilisez le simulateur. Je n'ai pas reçu l'erreur sur l'appareil.



1
votes

Je crois que le message d'erreur est un avertissement pour les simulateurs, donc ce n'est pas important.

Je pense que votre problème est un bogue 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

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


1 commentaires

Je l'ai juste lancé sur mon téléphone et il n'y avait pas de message, vous avez donc raison à propos du simulateur👍



1
votes

Vous pouvez utiliser do / catch pour éviter le crash 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.


0 commentaires

10
votes

Je crois que vous avez tous peut-être 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
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")
            }
        }
    }
}

Et après avoir déplacé la var audioPlayer: AVAudioPlayer juste après la ligne d' import AVFoundation ligne import AVFoundation , cela semblait fonctionner.

Le code suivant a donc fonctionné pour moi dans un projet SwiftUI :

import SwiftUI
import AVFoundation

struct PlayerDetailView: View {
@State private var downloadedFilePath: URL = nil
var audioPlayer: AVAudioPlayer
 
var body: some View {

}

Je suivais initialement ce tutoriel de CodeWithChris et sa discussion a également conduit au changement ci-dessus. Consultez également le didacticiel suivant si vous avez besoin d'autres exemples.

J'espère que cela sera utile à quelqu'un d'entre vous!

À votre santé!


6 commentaires

Seul cela a fonctionné pour SwiftUI. Cependant, l'erreur visuelle apparaît toujours.


@Oleksandr quelle est l'erreur visuelle? Je ne t'ai pas compris?


[plugin] AddInstanceForFactory: Aucune usine enregistrée pour l'ID


J'ai essayé tellement de façons différentes, c'est la seule façon de fonctionner pour swiftui !! Merci.


@Oleksandr je vais jeter un oeil et vous recontacter dans le week-end probablement! :-)


Merci. Je viens de me rendre compte, avant car je place le var player: AVAudioPlayer?; à l'intérieur de la fonction causée à l'erreur. Quand je le déplace vers la portée mondiale comme vous. Ça a marché



0
votes

Je pense que cela a à voir avec le fait que AVAudioPlayer est hors de portée avant que le simulateur ne puisse mettre le son en file d'attente et le lire ... ou quelque chose du genre. Je suis tout nouveau sur Swift et je n'ai aucune expérience avec les API iOS.

Voici ce que j'ai découvert après avoir expérimenté le placement de:

import UIKit
import AVFoundation

class ViewController: UIViewController {
  // initializing the "player" variable at the class level will still cause the "AddInstanceForFactory: No factory registered for id" error to happen, but the sound will still play on the simulator
  var player: AVAudioPlayer! 

  func playTheSound() {
    let url = Bundle.main.url(forResource: "funny_sound", withExtension: "mp3")

    player = try! AVAudioPlayer(contentsOf: url!)
    player.play()       
  }
}

Le son jouera ou ne jouera pas en fonction de l'emplacement de la ligne ci-dessus.

Quoi qu'il en soit, l'erreur suivante se produira toujours sur mes appareils Simulator:

import UIKit
import AVFoundation

class ViewController: UIViewController {
    func playTheSound() {
      // initializing the "player" variable within the "playTheSound()" function will cause the "AddInstanceForFactory: No factory registered for id" error and the sound WILL NOT play on the simulator
      var player: AVAudioPlayer! 

      let url = Bundle.main.url(forResource: "funny_sound", withExtension: "mp3")

      player = try! AVAudioPlayer(contentsOf: url!)
      player.play()     
    }
}

(Je suis sur un MacBook Pro fin 2013 + MacOS Catalina + Xcode 11.7 et j'ai testé cela sur un simulateur iPhone SE 2 exécutant iOS 13.7)

Bien que l'erreur continue de se produire, je suis heureux d'avoir au moins le son à jouer sur le simulateur ...

Une erreur se produit et le son NE joue PAS ...

AddInstanceForFactory: No factory registered for id

Une erreur se produit et le son est lu

var player: AVAudioPlayer!


0 commentaires

0
votes

Problème similaire - l'utilisation de Préférences> Son> Sortie différente de celle du casque USB Logictech a conduit à une application qui exécutait un son parfait et joué sans problèmes. Cela n'a jamais posé de problème en dehors du simulateur - le code sur un appareil fonctionnait bien.

TL; DR C'est un problème particulièrement épineux et obtus. J'ai également rencontré un problème avec un inattendu: aucune usine enregistrée pour l'identifiant

Après une courte attente, il a également été suivi de plusieurs autres erreurs signalées par la console, notamment: HALC_ProxyIOContext :: IOWorkLoop: le serveur n'a pas pu démarrer, Erreur: AQMEIO.cpp: 182: AwaitIOCycle: expiré après 15 000 s CA_UISoundClient.cpp: 244 : StartPlaying_block_invoke: CA_UISoundClientBase :: StartPlaying: AddRunningClient a échoué

erreur lors de la tentative de lecture du son. Xcode 12.2, Mac OSX Catalina 10.15.7, simulateur exécutant iOS 14.2. Code avait précédemment travaillé sur des versions antérieures du simulateur. A toujours eu une importation appropriée d'AVFoundation et une déclaration de la propriété de classe AVAudioPlayer comme: var audioPlayer: AVAudioPlayer!

Dans mon cas, cela semble être lié aux pilotes audio sous Mac OSX. Ce problème s'est produit UNIQUEMENT lorsque les Préférences système Mac> Son> Sortie étaient définies sur mon casque USB Logitech. Le code fonctionnait par ailleurs lorsque: joué sur mon moniteur LG, joué sur mes AirPods Pro et lors de l'exécution en dehors du simulateur et sur un appareil> mon iPhone 11 Pro.

J'ai passé plus d'une heure à essayer de diagnostiquer le problème avant de redémarrer et de remarquer que le son fonctionnait lorsque le casque n'était pas utilisé pour la sortie. Le basculement des Préférences> Son> Paramètres de sortie sur autre chose que le casque USB Logitech a immédiatement résolu le problème dans toutes les autres instances de lecture.

Je ne sais même pas où signaler ce problème en tant que bogue Apple, mais en espérant que cela aide quelqu'un. Je suppose que c'est un problème spécifique au système d'exploitation et non un problème qui entraînera un problème avec l'application ou le code.


0 commentaires