Swift 5.1 Error: [plugin] AddInstanceForFactory: No factory registered for id <CFUUID

前端 未结 7 2257
再見小時候
再見小時候 2021-02-12 10:41

App crashes with the following error message

2019-10-12 20:01:34.332334-0700 Awesome App[26368:3535170] [plugin] AddInstanceForFactory: No factory registered for         


        
相关标签:
7条回答
  • 2021-02-12 10:49

    I believe you all might have added the AVFoundation to the frameworks list in Project General Info tab.

    Erroneous Code was as follows:

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

    And after I moved the var audioPlayer: AVAudioPlayer declaration to just after the line of import AVFoundation line it seemed to be working.

    So following code worked for me in a SwiftUI project:

    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")
                    }
                }
            }
        }
    }
    

    I was initially following this tutorial of CodeWithChris and its discussion also led to above change. Also checkout following tutorial too if you need further examples.

    Hope this will be helpful to someone of you out there!

    Cheers!

    0 讨论(0)
  • 2021-02-12 10:49

    I think it has to do with the AVAudioPlayer going out of scope before the simulator device is able to queue up the sound and play it...or something along those lines. I'm brand new to Swift and I have zero experience with iOS APIs.

    Here's what I discovered after experimenting with the placement of:

    var player: AVAudioPlayer!
    

    The sound will either PLAY or NOT PLAY depending on the placement of the line above.

    Regardless, the following error will always occur on my Simulator devices:

    AddInstanceForFactory: No factory registered for id
    

    (I'm on a Late 2013 MacBook Pro + MacOS Catalina + Xcode 11.7 and I tested this on an iPhone SE 2 simulator running iOS 13.7)

    Although the error keeps occurring, I'm happy that I at least got the sound to play on the Simulator...

    Error occurs and sound DOES NOT play...

    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()     
        }
    }
    

    Error occurs and sound DOES play

    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()       
      }
    }
    
    0 讨论(0)
  • 2021-02-12 10:58

    You could use do/catch to avoid the crash and examine the exception, or ignore the issue all together with try?. For me, this was only showing up in the simulator when calling:

    try? AVAudioSession.sharedInstance().setCategory(.playback)

    I think it's safe to ignore it in my case.

    0 讨论(0)
  • 2021-02-12 11:03

    In my case totally different...

    The issue is solved after doing... var player = AVAudioPlayer()

    It didn't work in... var player:AVAudioPlayer!

    (Xcode 12.2)

    0 讨论(0)
  • 2021-02-12 11:12

    I have found the solution in another stackoverflow thread about AVAudioPlayer, here it is :

    If you initialize your AVAudioPlayer like

    var wrongMusicPlayer: AVAudioPlayer = AVAudioPlayer() OR wrongMusicPlayer = AVAudioPlayer() in any method then please remove it and just Declare like var wrongMusicPlayer: AVAudioPlayer!.

    0 讨论(0)
  • 2021-02-12 11:12

    I believe the error message is a warning for simulators hence it is not important.

    I think your issue is a bug in your code. Should be something like this:

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

    Where the forResource is the name of the file and ofType is the extension. You can also use Bundle.main.url which will look like this:

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

    0 讨论(0)
提交回复
热议问题