ios

유니티 iOS 오류 해결방법 공식문서 공부

코코넛딩 2025. 6. 10. 15:50

1. 게임이 반응하지 않으면서 "interrunpt"라고 표시된다.

 1. 초기화하지 않은 변수 등의 스크립트 상의 오류

 

2. Thumb 컴파일한 타사 네이티브 라이브러리 사용

- iOS SDK 링커에서 알려진 문제를 유발할 수 있으며 랜덤 충돌을 일으킬 수 있습니다.

- 링커(Linker) : 런타임에 프레임워크를 연결한다.

- 프레임 워크 (framework) : 크래스와 라이브러리가 특정 목적을 구현하기위해 합쳐진 형태

-  THUMB mode :  32bit ARM에서 돌아가는 16 bit 기계어 

- 해결방법은 '3. Unity iOS 앱의 외부 라이브러리를 링크할 때 EXC_BAD_ACCESS가 발생'을 참고

 

3. 직렬화된 스크립트 프로퍼티에 대해 값 타입이 포함된 Generic 타입을 파라미터(예: List<int>, List<SomeStruct>, List<SomeEnum>)로 사용할 경우 Unity AOT 컴파일러가 이를 처리하지 못해 앱이 중단될 수 있다.

- 제네릭 타입 대신 배열(int[], SomeStruct[], SomeEnum[])을 사용하여 직렬화된 프로퍼티를 정의하세요.

 

4. 관리되는 코드 스트리핑 활성화 시 리플렉션 사용

- 관리되는 코드 스트리핑 : 빌드에서 사용되지 않는 코드를 제거하여 최종 빌드 크기를 대폭 줄이는 방법이다.

- 리플렉션 : 객체를 토대로 데이터의 메타적인 정보를 가져오는 기법

- 관리 코드 스트리핑을 비활성화하거나, 리플렉션을 사용하지 않도록 코드를 수정하세요.

public class ReflectionTest : MonoBehaviour
{
    private void Start()
    {
        Temp temp = new Temp(); 
        
        Debug.Log("타입이름 : " + temp.GetType().Name);
    }
    // GetType을 하여 클래스의 이름을 출력한 상태
    // 클래스의 정보만을 가져온다
}

출처 : https://velog.io/@yongseok1000/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%A6%AC%ED%94%8C%EB%A0%89%EC%85%98

 

[유니티 C#] 리플렉션(Reflection)

리플렉션 개요

velog.io

 

5. 네이티브 플러그인 인터페이스 내 오류

- Xcode 디버거 콘솔에서 확인되는 경우가 많다.

 

2. Program received signal: "SIGBUS" 또는 EXC_BAD_ACCESS

- 앱이 NullReferenceException을 수신할 때 iOS 기기에 표시됩니다.

- 네이티브 Stack Trace을 사용하여 오류를 찾을 수 있습니다.

- 이런 오류가 일어난 후에는 작업을 계속 할 수 없는 경우가 많습니다.

- Xcode 디버거 콘솔에 bt all 을 입력합니다.

...
Thread 1 (thread 11523): 

1. 0 0x006267d0 in m_OptionsMenu_Start ()
1. 1 0x002e4160 in wrapper_runtime_invoke_object_runtime_invoke_void__this___object_intptr_intptr_intptr ()
1. 2 0x00a1dd64 in mono_jit_runtime_invoke (method=0x18b63bc, obj=0x5d10cb0, params=0x0, exc=0x2fffdd34) at /Users/mantasp/work/unity/unity-mono/External/Mono/mono/mono/mini/mini.c:4487
1. 3 0x0088481c in MonoBehaviour::InvokeMethodOrCoroutineChecked ()
...

- 메인 스레드인 Thread 1에 대한 Stack Trace를 찾아야합니다.

- Stack Trace의 첫 라인은 오류가 발생한 위치를 알려준다.

- 이 예에서는 NullReferenceExceptons이 OptionsMenu 스크립트의 Start 메서드 내에서 발생했습니다.

- 일반적으로 NullReferenceExceptons은 초기화 순서를 잘못 적용했을 때 Start 메서드 내에서 발생합니다.

 

Thread 1 (thread 11523): 

1. 0 0x0062564c in start ()

- 일부 경우 Stack Trace 내용이 부분적으로만 디버거 콘솔에 표시됩니다.

-이 메세지는 앱의 릴리즈 빌드 중에 네이티브 심볼이 삭제 되었음을 의미합니다.

- 다음 과정을 통해 풀 스택 트레이스를 얻을 수 있습니다.

1. 기기에서 앱을 제거

2. 모든 타겟을 클린

3. 빌드 후 실행

4. Xcode 디버거 콘솔에 bt all 을 입력합니다.

 

 

3. Unity iOS 앱의 외부 라이브러리를 링크할 때 EXC_BAD_ACCESS가 발생

- 일반적으로 외부 라이브러리가 ARM Thumb 명령 집합으로 컴파일 될 때 발생합니다. 이러한 라이브러리는 현재의 유니티와 호환되지 않습니다.

-  THUMB mode :  32bit ARM에서 돌아가는 16 bit 기계어 

- 다음 단계를 따라 해결할 수 있습니다.

  • Xcode의 메뉴에서 View > Navigators > Show Project Navigator를 선택합니다.
  • Unity-iPhone 프로젝트를 선택한 후 Build Settings 탭을 활성화합니다.
  • 검색 필드에 Other C Flags를 입력합니다.
  • 여기에서 -mno-thumb 플래그를 추가한 후 라이브러리를 다시 빌드합니다.
  • -mno-thumb 플래그를 사용하여 ARM 아키텍처에서 Thumb 명령어 세트를 비활성화할 수 있습니다.

 

- 라이브러리 소스를 사용할 수 없다면 해당 라이브러리 공급자에게 thumb를 사용하지 않은 버전을 요청해야합니다.

 

 

4. Xcode 콘솔에 "WARNING -> applicationDidReceiveMemoryWarning()"이라는 메시지가 나타나고 그 후 애플리케이션이 즉시 충돌합니다.

- Program received signal: "0" 과 같은 메세지가 표시될 수 있다.

- 이 메세지는 치명적이진 않지만 iOS에 메모리가 부족함을 표시하고 앱이 추가 메모리를 확보하도록 요청합니다.

- 데게 백그라운드 프로세스의 메모리를 비우면 앱을 계속 실행할 수 있습니다.

- 대개 전체 기기 RAM의 50%를 사용하는 앱은 심각한 메모리 사용 문제를 격지 않습니다.

 

 

5. Type.GetProperty() 또는 Type.GetValue()가 기기에서 크래시를 일으킴

- 현재 Type.GetProperty 및 Type.GetValue()는 .NET 2.0 Subset 프로파일에서만 지원됩니다.

- .NET : MicroSoft에서 제작하였으며, 앱 개발에 필요한 라이브러리와 런타임 환경을 제공하는 무료 오픈소스 프레임워크

- .NET API 호환성 레벨은 플레이어 설정에서 선택할 수 있습니다.

- Type.GetProperty 및 Type.GetValue()는 관리되는 코드 스트리핑과 호환되지 않을 수 있어 제외해야할 수 있습니다.

- 스트리핑 프로세스 중에 직접 작성한 커스텀 스크립 불가 타입 리스트를 사용할 수도 있습니다.

- 참고 : https://docs.unity3d.com/kr/2022.3/Manual/iphone-playerSizeOptimization.html

 

빌드한 iOS 플레이어 크기 최적화 - Unity 매뉴얼

빌드한 iOS 플레이어 크기 최적화

docs.unity3d.com

 

6. 스크립트에서 호출된 네이티브 함수를 통해 Cocoa를 사용할 때 "PlayerLoop called recursively!" 오류가 발생합니다.

- UI에 대한 일부 작업을 수행하명 iOS가 창을 즉시 다시 그립니다.

- UIViewController가 UIView를 메인 UIWIndow에 추가하는 것이 가장 일반 적인 예이다.

- 스크립트에서 네이티브 함수를 호출하면 Unity의 PlayerLoop 내에서 발생하므로 PlayerLoop가 재귀적으로 호출된다.

- 이경우 waitUntilDone이 false로 설정된 performSelectorOnMainThread 메서드를 사용할 것을 고려해야합니다.

- 그러면 Unity의 PlayerLoop 호출 간에 실행할 작업을 예약하도록 iOS에 알립니다.

 

7. 프로파일러 또는 디버거가 iOS 기기에서 게임이 실행되는 것을 감지하지 못합니다.

- 개발용 빌드를 빌드했는지 확인하고, Script Debugging 및 Autoconnect Profiler 체크박스를 선택했는지 확인하자.

- 기기에서 실행되는 앱은 UDP 포트 54997에서 225.0.0.222로 멀티 캐스트 브로드 캐스트를 합니다.

- 네트워크 설정이 이 트래픽을 허용하느지 확인해야합니다.

- 그러면 프로파일러는 55000-55511 범위의 포트에 있는 원격 기기에 연결하여 기기로 부터 프로파일러 데이터를 가져올 것입니다.

- 이 포트는 TCP 액세스를 위해 열려 있어야 합니다.

 

8. DLL 누락

- 앱이 에디터에서 정상적으로 동작하지만 iOS 프로젝트에 오류가 발생하는 경우 DLL(예: l18N.dll) 누락이 원인일 수 있습니다.

- 이 경우 Unity.app 내에서 해당 dll을 복사하여 프로젝트의 Assets\Plugins 폴더에 붙여 넣으세요.

- Unity 앱 내 DLL 위치는 다음과 같습니다.

- Unity.app\Contents\Frameworks\Mono\lib\mono\unity 그런 다음 프로젝트의 스트리핑 레벨을 확인하여 빌드 최적화 시 DLL의 클래스가 제거되지 않도록 해야합니다.