매번 새로 태어나는 Xcode 프로젝트 — Unity 게임 「오늘 누가 쏘냐?」를 iOS 로 빌드하며
Unity 의 iOS 빌드는 앱이 아니라 Xcode 프로젝트를 내놓고, 그 프로젝트는 빌드할 때마다 새로 만들어진다. 손으로 고친 곳이 남지 않는 프로젝트에 권한 문구와 서명을 코드로 넣고, Android 에서만 돌던 공유·진동·화면 방향을 iOS 로 옮기고, Android 모듈이 없는 맥에서도 에디터 스크립트가 컴파일되게 만든 이야기다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET 웹 서비스와 메일서버를 직접 운영하고, Unity 게임과 데스크톱 앱을 만들며 겪은 문제와 해결 과정을 기록합니다.
Unity 의 iOS 빌드는 앱이 아니라 Xcode 프로젝트를 내놓고, 그 프로젝트는 빌드할 때마다 새로 만들어진다. 손으로 고친 곳이 남지 않는 프로젝트에 권한 문구와 서명을 코드로 넣고, Android 에서만 돌던 공유·진동·화면 방향을 iOS 로 옮기고, Android 모듈이 없는 맥에서도 에디터 스크립트가 컴파일되게 만든 이야기다.
웹은 앱에게 묻고 그 자리에서 답을 받는다. WKWebView 에는 그 자리에서 대답할 방법이 없었다. Android 와 같은 이름의 브리지를 미리 채워 둔 값으로 다시 놓고, 앱 안과 밖으로 주소를 나누고, 새 창과 다운로드와 당겨서 새로고침을 iOS 방식으로 옮긴 이야기다.
책상에는 Windows PC 한 대뿐인데 Android 앱 세 개를 iPhone 으로 옮겨야 했다. Xcode 프로젝트를 파일 하나로 관리하고, 클라우드 빌드에서 맥 미니로 빌드 자리를 옮기고, Windows 에서 쓴 스크립트가 맥에서 멈추지 않게 하고, 업로드 직후 보이지 않는 빌드 번호까지 챙긴 iOS 전환 준비기의 첫 편이다.
광고 SDK 를 넣으면 코드 밖의 말도 같이 바뀐다. 판매자 확인용 app-ads.txt 를 웹 사이트 루트에 올리고, Play 앱 콘텐츠의 광고·광고 ID·데이터 보안 답을 새 빌드 기준으로 미리 써 두고, 실제 매니페스트 권한에 맞춰 처리방침과 스토어 문구, 출시 노트를 고쳤다. 무엇을 언제 바꾸느냐가 더 중요했다.
전면 광고가 떠 있는 동안 그 폰의 메인 스레드는 멈춘다. 같이 하기에서 그건 연결이 끊긴 것과 구별이 안 됐다. 연결 확인을 소켓 스레드로 옮기고, 방장이 보내는 a_show 와 게스트가 돌려주는 a_done 두 메시지로 모든 폰의 광고를 맞췄다. 늦게 닫는 폰, 광고가 없는 폰, 나간 폰을 기다리는 규칙과 규약 버전 13 이야기.
파티게임에서 광고를 넣을 수 있는 자리는 생각보다 적다. 결과를 다 보고 다음 판으로 넘어가는 순간 하나만 골랐고, 그 자리에 전면 광고 하나를 띄우는 정적 서비스를 만들었다. 미리 불러오기, 닫힌 뒤 정확히 한 번 부르는 약속, 조용한 실패와 재시도, 빌드별 광고 단위와 광고 등급, iOS 분기까지.
회사 홈페이지의 틀을 그대로 들고 고객사 홈페이지를 하나 더 만들었다. 바꾼 것보다 바꾸지 않은 것이 더 많았고, 한 번은 바꿨다가 되돌렸다. 그 사이 원래 홈페이지는 회사 소개를 넘어 도구를 나눠 주고, 블로그를 잇고, 검색엔진과 광고 크롤러에게 신분을 밝히는 자리가 됐다.
A/S 를 맡긴 고객은 회원이 아니다. 그 사람이 자기 접수 건만 찾게 하려고 처음엔 긴 접수번호와 전화번호 뒷자리를 받았다. 폰 자판으로 스무 자 가까운 번호를 치게 하는 대신 여섯 자리로 줄이자, 이번엔 그 번호를 하나씩 맞혀 보는 쪽을 막아야 했다.
문의 페이지를 열었더니 폼 자리에 "폼 전송이 아직 설정되지 않았습니다"가 떠 있었다. 방문자가 읽을 문장이 아니었다. 서버 없는 정적 사이트에 폼을 붙이면서 키를 어디에 둘지, 브라우저가 어디로 보내게 둘지, 받는 쪽은 무엇을 막아야 할지를 하나씩 정했다.
회사 홈페이지 상단의 EN 버튼을 눌렀더니 주소 끝에 슬래시가 두 개 붙어 있었다. 경로를 만드는 함수 하나의 실수였는데, 그 함수를 언어 전환·hreflang·canonical 이 모두 쓰고 있었다. 서버 없이 HTML 만 올리는 회사 홈페이지를 Astro 로 만들고 IIS 에 배포하기까지의 이야기.