35

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

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


有没有没有 JOIN 或 UNION 的 CTE 自我引用的解决方案?就像经理-员工问题一样

根据经典的经理-员工同桌问题解决了一个挑战。给定一个包含 ids、employees 和 managerid 的表

桌子:

  EMPNO ENAME      JOB            MGR
 ---------- ---------- --------- ----------
  7839 KING       PRESIDENT     
  7698 BLAKE      MANAGER         7839
  7782 CLARK      MANAGER         7839
  7566 JONES      MANAGER         7839
  7654 MARTIN     SALESMAN        7698
  7499 ALLEN      SALESMAN        7698
  7844 TURNER     SALESMAN        7698
  7900 JAMES      CLERK           7698
  7521 WARD       SALESMAN        7698
  7902 FORD       ANALYST         7566
  7369 SMITH      CLERK           7902
  7788 SCOTT      ANALYST         7566
  7876 ADAMS      CLERK           7788
  7934 MILLER     CLERK           7782

我已经走了很远是使用逗号分隔的'FROM'之后的旧形式的连接(我不想要)进行查询:

WITH e AS ( SELECT * FROM employee ), 
     m AS ( SELECT * FROM employee )
SELECT e.ENAME      
    e.JOB         
    m.ENAME      
    m.JOB
FROM e,m //dont want this
WHERE e.MGR = m.EMPNO;

我希望使用没有 JOINS 的 CTE 的解决方案,如果可能的话,也可以不使用 UNION 来获得输出:

Employee   Emp# Manager Mgr# 
   BLAKE   7698 KING    7839 
   CLARK   7782 KING    7839 
   JONES   7566 KING    7839 
   MARTIN  7654 BLAKE   7698 
   ALLEN   7499 BLAKE   7698 
   TURNER  7844 BLAKE   7698 
   JAMES   7900 BLAKE   7698 
   WARD    7521 BLAKE   7698 
   FORD    7902 JONES   7566 
   SMITH   7369 FORD    7902 
   SCOTT   7788 JONES   7566 
   ADAMS   7876 SCOTT   7788 
   MILLER  7934 CLARK   7782 
4

9 回答 9

17

我相信你们都可能已经AVFoundation在 Project General Info 选项卡中添加了框架列表。

错误代码如下:

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

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

干杯!

于 2020-04-09T22:37:28.903 回答
6

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

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

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

于 2019-12-03T08:10:18.643 回答
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()       
  }
}
于 2020-09-14T19:06:28.680 回答
2

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

做完之后问题就解决了... var player = AVAudioPlayer()

它在... var player:AVAudioPlayer 中不起作用!

(Xcode 12.2)

于 2021-01-28T11:10:25.940 回答
1

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

如果你初始化你的AVAudioPlayer喜欢

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

于 2019-10-15T10:21:31.053 回答
1

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.

于 2020-01-05T03:56:02.807 回答
1

我想我已经解决了这个问题(很难证明是否定的,因为错误是零星的)。我在一个单独的类中有我的 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()
    ...
}
于 2022-01-11T17:55:18.090 回答
1

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

TL;DR 这是一个特别棘手和迟钝的问题。我也遇到了一个意外的问题:没有为id注册工厂

稍等片刻之后,还出现了其他几个控制台报告的错误,包括:HALC_ProxyIOContext::IOWorkLoop: server failed to start, Error: AQMEIO.cpp:182:AwaitIOCycle: timed out after 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 错误提交,但希望它对某人有所帮助。我假设这是一个特定于操作系统的问题,而不是会导致应用程序或代码出现问题的问题。

于 2020-11-21T16:37:08.040 回答
0

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

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

这里改变

ofType:nil

ofType: "mp3"

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

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

于 2021-03-28T11:07:46.470 回答