SwiftUI프로그래밍

[SwiftUI]AddInstanceForFactory: No factory registered for id 오류 해결하기

맥북용 어플에서 warning이 발생되었다. 오류 내용은 다음과 같으며, AVAudioPlayer와 연관이 있다.

AddInstanceForFactory: No factory registered for id <CFUUID 0x6xxxxxx0> F8xxxxx-BxE8-1xx6-xx31-xxxxxxxCD46

현재 개발되어 사용중인 코드는 다음과 같다.


import Foundation
import AVKit

class SoundSetting: ObservableObject {
    
    //1. soundSetting의 단일 인스턴스를 만듬
    /// singleton ? :
    /*싱글 톤은 한 번만 생성 된 다음 사용해야하는 모든 곳에서 공유해야하는 객체입니다 */
    static let instance = SoundSetting()
    
    var audioPlayer: AVAudioPlayer?
    

    
    enum LoopOption: Int {
        case Loop = -1  // 무한반복
        case OnePlay = 0  // 1회 재생
        case TwoPlay = 1  // 2회재생
    }
    
    
    func onPlaySound(sound: SoundOption, loop: LoopOption) {
 
        guard let url = Bundle.main.url(forResource: sound.rawValue, withExtension: ".mp3") else { return }
        
//        guard let url = URL(string: "") else { return }
        
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            audioPlayer?.numberOfLoops = loop.rawValue
            audioPlayer?.play()
        } catch let error {
            print("재생하는데 오류가 발생했습니다. \(error.localizedDescription)")
        }
    }
    
    func onStopSound() {
//        print(" : ---> 노래중지 호출됨")
        audioPlayer?.stop()  // 재생중인 플레이어 정지
    }
    
    func onPauseSound() {
        audioPlayer?.pause()  // 재생중인 플레이어 일시중지
    }
    
}

이 오류는 AVAudioPlayer가 초기화되면서 발생할 수 있는 문제 중 하나이다. 주로 AVAudioPlayer와 관련된 리소스를 초기화하거나 접근하는 데 문제가 있을 때 나타난다.


오류 원인은?

  1. 리소스 파일 경로 문제
    Bundle.main.url(forResource:withExtension:)가 유효하지 않거나, 제공된 파일명이 잘못되었을 가능성이 있다.
    • .mp3 파일이 프로젝트에 추가되지 않았거나, Target Membership 설정이 올바르지 않을 수도 있다.
  2. AVAudioPlayer 인스턴스화 문제
    AVAudioPlayer가 초기화 중 문제가 발생하면 위와 같은 오류가 나타날 수 있다.
  3. 싱글톤 문제
    싱글톤 SoundSetting이 제대로 초기화되지 않았거나, 메모리 관리 문제로 예상치 못한 동작이 발생할 수 있다.
  4. 루프 값 설정 문제
    audioPlayer?.numberOfLoops에 전달된 값이 예상하지 못한 방식으로 동작할 수도 있다. 기본적으로 -1은 무한 루프를 나타내지만, AVAudioPlayer가 이에 대해 예외를 던질 수 있다.

해결 방법

var audioPlayer: AVAudioPlayer? 선언을 var audioPlayer: AVAudioPlayer!로 변경해보아도 오류는 동일하게 발생된다. 두가지 선언 방법 모두 노래는 정상적으로 재생된다.

아래 코드로 로그를 찍어본결과 파일경로가 찍힌다.

if let url = Bundle.main.url(forResource: sound.rawValue, withExtension: "mp3") {
     print("파일 경로: \(url)")
} else {
     print("리소스 파일을 찾을 수 없습니다.")
}

TextField는 내가 만든 어플에서 사용되지않는다.

해결방법이 없는것인가?

애플 개발자 포럼에도 동일한 오류 관련 글이 올라와 있다.

https://forums.developer.apple.com/forums/thread/698496

[관련자료]

https://stackoverflow.com/questions/59941220/how-to-resolve-addinstanceforfactory-no-factory-registered-for-id-cfuuid-0x60

error: Content is protected !!