Swift 5.1 错误:[插件] AddInstanceForFactory: 没有注册 ID 为 <CFUUID> 的工厂。

51

应用程序崩溃并显示以下错误消息

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
似乎崩溃时的断点与AVAudioPlayer有关。
let path = Bundle.main.path(forResource: "menu_background.mp3", ofType:nil)!
audioPlayer = try AwesomeAudioPlayer(contentsOf: URL(fileURLWithPath: path)) ---> breakpoint

11个回答

24
我相信你们可能已经在项目“常规信息”标签的框架列表中添加了AVFoundation错误代码如下:
import SwiftUI
import AVFoundation

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

在我将 var audioPlayer:AVAudioPlayer 的声明移动到 import AVFoundation 行之后,它似乎正在工作。

所以,在 SwiftUI 项目中,以下代码适用于我:

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

我最初是在跟随CodeWithChris的教程,它的讨论也引导了上面的更改。如果你需要更多的例子,还可以查看以下教程

希望这对你们中的某些人有所帮助!

干杯!


2
只有这个适用于SwiftUI。然而,视觉错误仍然出现。 - J A S K I E R
@Oleksandr,什么是“Visual error”?我没听懂你的意思? - Randika Vishman
1
[插件] AddInstanceForFactory: 没有为该id注册的工厂。 - J A S K I E R
3
我尝试了许多不同的方法,这是唯一在SwiftUI中有效的方法!! 谢谢。 - Emmy
1
@Oleksandr 我会在周末内查看并回复你的,可能会有所延迟! :-) - Randika Vishman
5
谢谢。我刚意识到,之前因为我把 var player: AVAudioPlayer?; 放在函数内部导致了错误。当我像你说的那样将它移动到全局作用域时,它就起作用了。 - Phat Tran

9

我认为错误信息是模拟器的警告,因此不太重要。

我认为你的问题是你代码中的一个错误。应该像这样:

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

其中forResource是文件名,ofType是扩展名。 您还可以使用Bundle.main.url,如下所示:

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


6
我在手机上跑了一下,没有收到消息,所以你对模拟器的判断是正确的。 - daj mi spokój

7
我认为这与 AVAudioPlayer 在模拟器设备能够排队播放声音之前离开作用域有关,或者类似于这样的情况。我是 Swift 的新手,对 iOS API 一无所知。
在尝试重新排列代码之后,我发现了以下内容:
var player: AVAudioPlayer!

根据上面的线条位置,声音将要么播放要么不播放。

无论如何,在我的模拟器设备上都会出现以下错误:

AddInstanceForFactory: No factory registered for id

(我使用的是2013年晚期的MacBook Pro + MacOS Catalina + Xcode 11.7,并在运行iOS 13.7的iPhone SE 2模拟器上进行了测试。)尽管错误仍然会发生,但我很高兴至少已经成功在模拟器上播放了声音...出现错误时声音无法播放...
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()     
    }
}

出现错误声音有播放

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

2
我强烈建议使用 var player: AVAudioPlayer? 而不是 var player: AVAudioPlayer! - Daniel

2

我认为我已经解决了这个问题(难以证明否定,因为错误是零散的)。我将我的AVAudioPlayer放在一个单独的类中:

import SwiftUI
import AVFoundation
var audioPlayer: AVAudioPlayer?

class AudioManager {
    
    var userSettings = UserSettings()
    func playSoundEffect(_ assetName:String) {
        
        if !userSettings.soundDisabled {
            guard let audioData = NSDataAsset(name: assetName)?.data else {
                fatalError("Unable to find asset \(assetName)")
            }
            
            do {
                audioPlayer = try AVAudioPlayer(data: audioData)
                audioPlayer?.prepareToPlay()
                audioPlayer?.play()
            } catch {
                print(error.localizedDescription)
            }
        }
//        audioPlayer?.stop()
    }
    func stopPlay() {
        audioPlayer?.setVolume(0.0, fadeDuration: 0.25)
    }
    
}

然后,在需要播放音频的SwiftUI视图中,一定要import AVFoundation

import SwiftUI
import AVFoundation

struct MyView: View {
    ...
    let audioManager = AudioManager()
    ...
}

2
在我的情况下完全不同...
问题在做了...之后得到解决 var player = AVAudioPlayer()
在...中它并没有起作用 var player:AVAudioPlayer!
(Xcode 12.2)

如果你在正确的位置初始化它的值,比如在viewDidLoad中,甚至是在使用它之前的方法中,那么 var player:AVAudioPlayer! 就能正常工作。 - Eric Aya

1
您可以使用do/catch来避免崩溃并检查异常,或者使用try?忽略这个问题。对我来说,只有在模拟器中调用以下代码时才会出现这种情况:try? AVAudioSession.sharedInstance().setCategory(.playback)。我认为在我的情况下忽略它是安全的。

1
我在另一个stackoverflow线程上找到了关于AVAudioPlayer的解决方案,这里是:
如果你像这样初始化AVAudioPlayervar wrongMusicPlayer: AVAudioPlayer = AVAudioPlayer()或者wrongMusicPlayer = AVAudioPlayer()在任何方法中,请将其删除,只需声明为var wrongMusicPlayer: AVAudioPlayer!。

42
很遗憾,这并不是解决方案。 - Phil
8
有人已经找到解决方案了吗?我也遇到了同样的问题,但是这个被接受的答案对我没有用。 - alionthego
9
尽管我还没有深入研究这个错误,但我发现这是在模拟器上运行时出现的错误。在设备上没有遇到过这个错误。 - Roohul

1

类似的问题-使用偏好设置>音频>输出与逻辑技 USB 无线耳机不同,导致应用程序执行完美并播放声音无问题。在模拟器外从未出现过问题-设备上的代码运行良好。

简而言之,这是一个尤其棘手和晦涩的问题。我也遇到了一个意外的问题:

No factory registered for id

等待片刻后,还会出现其他几个控制台报告的错误,包括:

HALC_ProxyIOContext::IOWorkLoop:服务器无法启动,错误: AQMEIO.cpp:182:AwaitIOCycle:15.000s超时 CA_UISoundClient.cpp:244:StartPlaying_block_invoke:CA_UISoundClientBase::StartPlaying:AddRunningClient失败

尝试播放声音时出现错误。Xcode 12.2,Mac OSX Catalina 10.15.7,模拟器运行iOS 14.2。 代码以前在模拟器的旧版本上工作正常。 始终正确导入AVFoundation&将AVAudioPlayer类属性声明为:

var audioPlayer: AVAudioPlayer!

在我的情况下,似乎与Mac OSX中的音频驱动程序有关。只有当我将Mac系统偏好设置>声音>输出设置为我的Logitech USB耳机时,才会出现这个问题。否则,代码在以下情况下正常工作:通过我的LG监视器播放,在我的AirPods Pro上播放,并且在模拟器外部执行并在设备>我的iPhone 11 Pro上运行时。
花了一个多小时来诊断这个问题,重新启动后注意到耳机未用于输出时音频工作。将偏好设置>声音>输出设置更改为除Logitech USB耳机以外的其他内容立即解决了所有其他播放实例中的问题。
甚至不确定在哪里将此问题归档为苹果错误,但希望它能帮助某些人。假设这是一个特定于操作系统的问题,而不是会导致应用程序或代码问题的问题。

0

我在Here2Huynh的回答中找到了解决方案。

let path = Bundle.main.path(forResource: "menu_background.mp3", ofType:nil)! 

这里进行更改

ofType:nil

ofType: "mp3"

然后再次尝试。在使用模拟器时没有错误消息。

顺便说一下,我正在使用swiftui项目


0

模拟器 -> 输入输出 -> 键盘 -> 取消所有勾选 输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接