HJSoft

[앱스토어 등록 대장정]MAUI iOS 앱 아이콘 복구부터 WCF 로그인 성공까지

HJSoft 맞춤형솔루션 2026. 1. 31. 15:34


“분명 빌드는 됐는데, 아이콘이 없고, 화면은 검고, 로그인은 죽는다.”

MAUI iOS 앱을 Windows 빌드 + Mac 후처리로 App Store에 올리며 겪은

실제 삽질 기록과 해결 과정을 단계별로 정리합니다.

 

 
 
 
 

1단계: 앱 아이콘 실종 사건 (The Icon Mystery)

* 상황

  • Windows 환경의 Visual Studio에서 MAUI iOS 빌드
  • Mac에서 수동으로 패키징(iOS Payload 구성)
  • 실기기에서 앱 아이콘이 표시되지 않음

* 원인

MAUI iOS 앱은 빌드 시 아이콘 리소스를 Assets.car 파일로 컴파일합니다.

하지만:

  • Windows 빌드 결과물을
  • Mac에서 수동으로 병합 / 패키징하는 과정에서
  • Assets.car가 누락되거나 잘못된 위치에 존재 즉, 아이콘 소스는 있어도 iOS가 읽을 수 없는 상태였습니다.

* 해결

  1. 아이콘이 정상 표시되던 이전 성공 빌드에서
  2. Assets.car 파일 추출
  3. 새 빌드 결과물의 아래 경로에 강제로 이식
  4. Payload/APP.app/Assets.car
  5. 재서명 후 실행 → 아이콘 정상 표시 확인

MAUI iOS에서 “아이콘이 안 나온다” =

거의 항상 Assets.car 문제입니다.


2단계: 검은 화면의 공포 (Black Screen Issue)

* 상황

  • 아이콘은 정상
  • 앱 실행 시 아무 화면도 안 뜨고 검은 화면에서 멈춤

* 원인

Visual Studio가 Info.plist에 자동으로 주입한 UIApplicationSceneManifest 설정 때문.

iOS는 이 설정이 있으면:

  • 다중 창(Scene) 앱으로 인식
  • Scene 기반 라이프사이클을 시도

하지만:

  • MAUI 기본 앱 구조와 충돌
  • 결과: UI 렌더링 실패 → 검은 화면

* 해결 (순정화 작업)

Mac 터미널에서 아래 명령 실행:

/usr/libexec/PlistBuddy -c "Delete :UIApplicationSceneManifest" Info.plist

→ Scene 설정 제거

→ 앱 정상 렌더링


3단계: 리플렉션의 벽 (Reflection.Emit Error)

* 상황

  • 화면은 정상 출력
  • 로그인 버튼 클릭 시 즉시 앱 종료
  • 에러:
  • PlatformNotSupportedException

* 원인

iOS는 JIT(실시간 코드 생성) 을 금지합니다.

하지만:

  • Newtonsoft.Json
  • WCF 통신 라이브러리

이 내부에서 Reflection.Emit 기반 동적 코드 생성을 시도 → iOS에서 즉시 크래시

* 해결

.csproj에 인터프리터 실행 강제 옵션 추가:

<MtouchInterpreter>-all</MtouchInterpreter>

  • 모든 코드를 AOT + 인터프리터 방식으로 실행
  • Reflection 기반 라이브러리 사용 가능
  • → 로그인 로직 정상 동작

4단계: 마지막 관문 – ATS(App Transport Security)

* 상황

  • 앱 실행 OK
  • 로그인 시:
  • The resource could not be loaded...

* 원인

iOS ATS 정책:

  • HTTPS만 허용
  • HTTP 요청은 기본 차단

문제의 서버:

http://XXXX.co.kr:88

* 해결

Info.plist에 ATS 예외 추가:

  • NSAppTransportSecurity
  • NSExceptionDomains
  • 해당 도메인에 HTTP 허용

→ WCF 로그인 성공


최종 성공 프로세스 (정석 루트)

1. 빌드 (Windows)

  • MAUI 프로젝트에 <MtouchInterpreter>-all</MtouchInterpreter> 추가
  • iOS 빌드

2. 준비 (Mac)

  • 빌드 결과 압축 해제
  • 이전 성공 빌드에서 Assets.car 추출
  • Payload/AppName.app/에 덮어쓰기

3. 수정

  • PlistBuddy로 SceneManifest 삭제
  • ATS 예외 추가
  • 버전 / 빌드 넘버 조정

4. 재서명

codesign -f -s [인증서ID] --entitlements temp.entitlements Payload/AppName.app

5. 업로드

  • zip 압축
  • TestFlight 업로드
  • ✔ 심사 준비 완료

이 과정은 공식 문서 어디에도 안 나옵니다.

하지만 실제로 MAUI iOS + WCF + Windows 빌드 환경에서는

누구나 한 번은 겪게 되는 지점입니다.

이 글이 같은 삽질을 하는 분들에게

“아, 나만 그런 게 아니구나”가 되길 바랍니다.