"사실은 넷이고, 배포는 마지막 하나뿐이야."
빌드 확인은 배포가 아니야
앱을 아이폰에 올리는 방법은 두 가지인데, 각각 답하는 질문이 달라. Xcode에서 실행하거나 devicectl로 설치하면 등록된 기기가 적힌 개발 프로필로 서명해. 그 기기는 페어링돼 있고, 개발자 모드여야 하고, 잠금도 풀려 있어야 해. 게다가 한 번에 한 대뿐이야. 여기서 답하는 질문은 "이 빌드가 실제 기기에서 도나?"야. 즉 빌드 확인이지. TestFlight는 App Store와 같은 방식으로 서명하고 모든 테스터 기기에 무선으로 설치해. 다음 빌드가 나오면 그 기기에서 자동으로 업데이트되게 할 수도 있고. 이쪽이 답하는 질문은 "이 앱이 쓰는 사람들 손에 들어갔나?"야.
한도는 애플이 정한 거라, 숫자로 기억해둘 만해. TestFlight 빌드는 90일 동안 테스트할 수 있어. 내부 테스터는 팀의 App Store Connect 사용자 중 최대 100명이고, 이들이 받는 빌드는 심사가 필요 없어. 외부 테스터는 최대 10,000명까지 가능하고, 이쪽 빌드는 베타 심사를 받아야 할 수도 있어. 가족 앱은 전부 내부 그룹으로 나가. 첫 빌드든 백 번째 빌드든 예외 없이 그 길로 가.
이 규칙을 낳은 실패
한 코딩 세션이 터미널 앱의 첫 iOS 마일스톤을 끝냈어. 그러고는 주인의 아이폰에 케이블로 설치하고, TestFlight는 나중 단계로 적어뒀지. 그런데 코딩 엔진 앱이 12일 전에 명령 하나로 도는 TestFlight 파이프라인을 이미 내놓았고, 이후의 모든 앱은 그걸 기준 삼아 따라 하기로 정해져 있었어. 결국 주인이 직접 짚어줘야 했어. 케이블 설치 자체는 아무 문제가 없었어. 그냥 배포가 아니었을 뿐이야. 그걸 끝났다고 한 대가로 한 사이클을 통째로 날렸고. 케이블 설치에 자꾸 끌리는 건, 튜토리얼 대부분이 그 방법을 보여주고 1분이면 결과가 나오기 때문이야. 그래서 판단에 맡기지 않고 규칙으로 적어둔 거야.
사실 넷을 따로따로 보고해
업로드가 성공해도 배포는 아니야. 이어지는 사실은 네 개고, 보고할 땐 그중 참인 것 하나를 콕 집어 말해.
- 업로드됨. 실패할 수도 있는 export 관문을 통과한 뒤 파이프라인이
_UPLOAD_OK줄을 찍었어. - 처리됨. App Store Connect가 빌드 처리를 끝냈어. 몇 분 걸릴 수 있어. 초록색으로 끝난 실행 뒤에 거절 이메일이 날아오는 것도 이 단계야.
- 배정됨. 내부 그룹의 빌드 목록에 들어갔어.
- 설치됨. 기기에 새 빌드가 보이거나 테스터 행에 Installed라고 떠. 배포라고 부를 수 있는 건 이것 하나뿐이야.
가족 파이프라인은 모든 iOS 레포에 똑같이 들여놓은 공유 프로그램이야. 앱마다 다른 사실은 그 옆의 작은 설정 파일에 두고. 마지막으로 찍는 줄에 규칙을 한 번 더 적어서, 다음에 로그를 읽는 사람이 사실 1을 사실 4로 착각하지 못하게 해.