Unity iOS 빌드, 매번 Xcode 손보지 마세요 — PostProcessBuild로 프레임워크·Info.plist 자동 주입
Unity로 iOS 앱을 빌드할 때마다 Xcode에서 프레임워크를 추가하고 Info.plist 문구를 넣는 수작업, 빼먹으면 크래시나 심사 반려로 이어집니다. PostProcessBuild 콜백으로 이 과정을 코드로 자동화한 실제 방법을 공유합니다.
안녕하세요. Jay입니다!
Unity로 iOS 앱을 만들어 보신 분이라면 이 루틴이 익숙하실 겁니다 — Build 누르고, 생성된 Xcode 프로젝트 열고, 프레임워크 추가하고, Info.plist에 권한 문구 넣고… 그리고 다음 빌드 때 또 처음부터. 문제는 이 수작업을 한 번이라도 빼먹으면 런타임 크래시나 앱 심사 반려로 돌아온다는 거죠. 오늘은 이 과정을 아예 코드로 자동화하는 방법을 공유합니다.
🔍 왜 매번 다시 해야 할까
Unity의 iOS 빌드는 매 빌드마다 Xcode 프로젝트를 새로 생성합니다. 그래서 손으로 Xcode에서 바꾼 설정(프레임워크 링크, plist 키, Capability 등)은 다음 빌드 때 싹 사라집니다. 저도 최근 게임을 iOS에 올리면서 이걸로 크게 데였는데요, 광고 SDK가 요구하는 프레임워크가 링크 안 돼 크래시가 나고, ATT(앱 추적 투명성) 문구가 빠져 심사에서 반려됐습니다.
해결은 하나입니다 — 빌드가 끝난 직후 Unity가 자동으로 Xcode 프로젝트를 손보게 만드는 것.
🛠 PostProcessBuild — 빌드 후처리 훅
Unity에는 [PostProcessBuild] 라는 콜백이 있습니다. iOS 빌드가 끝난 뒤 Unity가 이 메서드를 호출해 주는데, 여기서 생성된 Xcode 프로젝트를 코드로 편집할 수 있습니다. Editor 폴더 아래에 스크립트를 하나 만들어 두면 끝입니다.
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
public static class IOSBuildScript
{
[PostProcessBuild(999)] // 숫자가 클수록 나중에 실행
public static void OnPostprocessBuild(BuildTarget target, string path)
{
if (target != BuildTarget.iOS) return;
// 아래에서 프레임워크 링크 + plist 편집
}
}
⚙️ ① 프레임워크 자동 링크
Xcode 프로젝트 파일(project.pbxproj)을 PBXProject로 열어 프레임워크를 추가합니다. 광고·추적 관련 프레임워크가 대표적이죠.
string projPath = PBXProject.GetPBXProjectPath(path);
var proj = new PBXProject();
proj.ReadFromFile(projPath);
string targetGuid = proj.GetUnityMainTargetGuid();
proj.AddFrameworkToProject(targetGuid, "AppTrackingTransparency.framework", true); // weak link
proj.WriteToFile(projPath);
마지막 인자를 true로 주면 weak link가 되어, 해당 프레임워크가 없는 구형 OS에서도 크래시 없이 동작합니다.
⚙️ ② Info.plist 문구·키 자동 주입
PlistDocument로 Info.plist를 열어 필요한 키를 넣습니다. ATT 사용 문구와 광고 SDK 식별자가 대표적입니다.
string plistPath = path + "/Info.plist";
var plist = new PlistDocument();
plist.ReadFromFile(plistPath);
var root = plist.root;
// ATT 권한 요청 시 사용자에게 보여줄 문구 (없으면 심사 반려)
root.SetString("NSUserTrackingUsageDescription",
"맞춤 광고를 제공하는 데 사용됩니다.");
// AdMob 앱 식별자
root.SetString("GADApplicationIdentifier", "ca-app-pub-XXXX~YYYY");
plist.WriteToFile(plistPath);
이제 빌드할 때마다 이 값들이 코드로 확정 주입됩니다. 손으로 넣던 걸 까먹을 일이 없어졌어요.
🤔 이게 왜 중요한가 — 크래시와 반려를 동시에 막는다
이 자동화의 진짜 가치는 두 가지 문제를 근본에서 없앤다는 겁니다.
- 크래시 방지: 프레임워크가 항상 링크되니, "특정 기기에서만 튕긴다" 같은 재현 어려운 버그가 사라집니다.
- 심사 반려 방지: 추적을 쓰는 앱은 애플이 ATT 문구를 요구합니다(Guideline 2.1). 이 문구가 plist에 자동으로 들어가니 빠뜨릴 수 없죠. (실제로 광고 초기화 전에 ATT 팝업을 띄우는 코드도 함께 넣어야 완결됩니다.)
저는 여기에 개발용 빌드를 원버튼으로 뽑는 BuildDev 메서드까지 같은 스크립트에 넣어, 빌드 파이프라인을 통째로 코드화했습니다.
결론
Unity iOS에서 "매번 Xcode를 손보는" 수작업은, 한 번 자동화하면 크래시와 심사 반려를 동시에 막아줍니다.
빌드마다 반복되고 빼먹기 쉬운 설정일수록 [PostProcessBuild]로 코드화하세요. 사람의 기억이 아니라 스크립트가 보장하게 만드는 것 — 그게 출시 전날 밤을 평온하게 만드는 가장 확실한 방법입니다. 다음에도 유익한 포스팅으로 찾아오겠습니다. 감사합니다!