Swift 5.1 错误:[插件] AddInstanceForFactory:没有为 id <CFUUID 注册工厂

Posted

技术标签:

【中文标题】Swift 5.1 错误:[插件] AddInstanceForFactory:没有为 id <CFUUID 注册工厂【英文标题】:Swift 5.1 Error: [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 【发布时间】:2020-02-10 03:11:49 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

相信大家可能已经将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 项目中为我工作:

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 的这个教程,它的讨论也导致了上述变化。如果您需要更多示例,也可以查看following tutorial。

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

干杯!

【讨论】:

只有这对 SwiftUI 有效。但是,视觉错误仍然出现。 [plugin] AddInstanceForFactory: 没有为 id 注册工厂 我尝试了很多不同的方法,这是唯一适用于swiftui的方法!谢谢。 @Oleksandr 我会看看,并在周末期间回复您! :-) 谢谢。我才意识到,之前是因为我将var player: AVAudioPlayer?; 放在导致错误的函数内。当我像你一样将它移动到全局范围时。成功了【参考方案2】:

我认为错误消息是对模拟器的警告,因此它并不重要。

我认为您的问题是代码中的错误。应该是这样的:

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

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

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

【讨论】:

刚刚在我的手机上运行它并没有消息所以你是对的模拟器?【参考方案3】:

我认为这与 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()       
  

【讨论】:

我强烈建议使用var player: AVAudioPlayer? 而不是var player: AVAudioPlayer!【参考方案4】:

在我的情况下完全不同......

该问题之后得到解决... var player = AVAudioPlayer()

不起作用... var player:AVAudioPlayer!

(Xcode 12.2)

【讨论】:

var player:AVAudioPlayer! 如果您在适当的位置初始化它的值,例如在viewDidLoad 中,或者甚至在您使用它之前的方法中,则可以正常工作。【参考方案5】:

我在另一个关于 AVAudioPlayer 的 *** 线程中找到了解决方案,这里是:

如果你初始化你的AVAudioPlayer

var wrongMusicPlayer: AVAudioPlayer = AVAudioPlayer()wrongMusicPlayer = AVAudioPlayer() 以任何方式删除它,然后像 var wrongMusicPlayer: AVAudioPlayer! 一样声明。

【讨论】:

不幸的是,这不是解决方案。 有人找到解决方案了吗?有同样的问题,这个接受的答案对我不起作用 @alionthego 虽然我还没有深入研究这个错误,但我发现这是你在使用模拟器运行时遇到的错误。未在设备上收到错误消息。【参考方案6】:

您可以使用 do/catch 来避免崩溃并检查异常,或者将问题与try? 一起忽略。对我来说,这只是在调用时出现在模拟器中:

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

我认为在我的情况下忽略它是安全的。

【讨论】:

【参考方案7】:

类似问题 - 使用首选项 > 声音 > 输出不同于 Logictech USB 耳机导致应用程序执行完美和播放声音没有问题。在模拟器之外从来都不是问题 - 设备上的代码运行良好。

TL;DR 这是一个特别棘手和迟钝的问题。我还遇到了一个意外的问题: 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。

在重新启动之前花了一个多小时尝试诊断问题,并在耳机未用于输出时注意到音频正常工作。将 Preferences > Sound > Output 设置切换到 Logitech USB 耳机以外的设置立即解决了所有其他播放实例中的问题。

甚至不确定在哪里将此问题作为 Apple 错误提交,但希望它可以帮助某人。我假设这是一个特定于操作系统的问题,而不是会导致应用程序或代码出现问题的问题。

【讨论】:

【参考方案8】:

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

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

这里改

ofType:nil

ofType: "mp3"

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

顺便说一下,我用的是swiftui项目

【讨论】:

以上是关于Swift 5.1 错误:[插件] AddInstanceForFactory:没有为 id <CFUUID 注册工厂的主要内容,如果未能解决你的问题,请参考以下文章

Swift 5.1 NSInternalInconsistencyException 错误

更新到 Xcode 11 Swift 5.1 后出现 Google AdMob 错误

安装 Xcode10.2.1 但仍然收到错误“使用 Swift 5.0.1 编译的模块无法由 Swift 5.1 编译器导入”

如何解决问题 UIPickerView 致命错误:索引超出范围 [IOS Swift 5.1 Xcode 11.2]

如何在 Swift 5.1 中修复“无法在没有参数的情况下调用‘发送’”

Swift 5.1 发布进程