이 글은 애플 앱스토어(App Store)에 앱을 제출한 뒤
두 번째 심사에서 In-App Purchase 무한 로딩 문제로
Reject를 받았던 실제 경험과,
해당 문제를 해결하기 위해 거쳤던 테스트 및 수정 과정을 정리한 기록이다.

특히 App Store Connect 설정,
Sandbox Tester 생성,
TestFlight에서 인앱 결제가 동작하지 않았던 이유까지
초보 앱 개발자가 겪기 쉬운 시행착오를 중심으로 정리했다.

 

## 두 번째 App Store Reject를 확인한 순간

지난번에는 in-app purchase 요소가 있다는 것을 일부 부분에 체크해서 넣지 않아서 검증을 할 수 없었던 것 같다. 그래도 별 일이야 있겠냐는 생각에 내심 "통과되었고 앱스토어에 게시되었다"라는 식의 메세지가 뾰료롱 뜨는 것을 기대했다.
그러다 새벽에 잠에 막 들었을 때, 앱을 리뷰하고 있다고 status가 바뀌는 것을 보았고, 이제 곧 잠이 깰랑말랑한 어둠 속에서 기쁜 소식을 볼 것이라고 예상했는데!! Reject이 떠 있었다. 힝ㅠㅠ

 

## In-App Purchase 버튼에서 발생한 무한 로딩 문제

메세지를 열어보니, 프리미엄 서비스 구매를 위해 설치한 인앱 결제 버튼을 누르면 무한 로딩이 빙글빙글 돌아가는 문제가 생겼단다.


아이들을 학교에 보내놓고 커피와 함께 바이브 코딩 시간이 돌아왔다.
Gemini에게 이것저것 말해가며 오류를 수정하고 검토해달라고 했다. 몇 초만에 뚝딱 해치웠단다.
Gemini는 다 해냈다고 자신만만한데 뭔가 미심쩍어서 내가 직접 테스트를 해봐야 할 것 같았다.

 

## TestFlight 테스트 중 발견된 추가 오류들

사실 지난번에 잘못된 부분을 수정하면서 TestFlight로 모든 것들을 다시 한번 눌러보고 제출해야겠다는 생각에 또 점검을 했는데, 그렇게 많이 검사를 했었는데도 사소한 에러들이 조금씩 여전히 보였다. 예를 들면, 사진을 찍고 다음 화면으로 넘어가기 직전의 짧은 순간에 어떤 글씨가 쓰여있는 화면이 함께 중간에 지나가는 오류가 보이는 것.

그 외에도 빌드 과정에서 버전 번호를 수정해야 했는데, AI는 그런 부분을 알아서 고치는 법이 없어서 내가 하나하나 찾아가면서 "이것도 수정해 줘. 저것도 수정해 줘"하며 요청해야 했다. 이것은 마치 미국에서 집을 사고 들어서기 전까지 집주인에게 고쳐달라는 걸 요청하는 그런 느낌 아닌가...
 
어쨌든 뚝딱 고쳤다는 버튼을 눌러서 확인하려면, 샌드박스 계정이 필요하다고 했다. 
샌드박스 계정은 개발 중에 연결되지만, App Store 출시 후 실제 결제 서버에 연결된다고 한다. 결제 순간에 에러가 나면 error 메시지가 뜨는 것도 확인했다. 버튼을 누르면 아무 반응이 없이 무한 로딩을 하다가 멈추는 기존 버그는 해결했다. 에러가 발생했다는 창이 뜨는 것이 '무한으로 로딩을 하는 것을 멈추라는' 안전장치가 작동된 결과라고 했다.

 
이렇게 하고도 뭔가 마음이 찝찝했다. 프리미엄 결제 이후에 대한 점검을 해봐야겠다는 생각이 들었다.
심사를 하는 기분으로 테스트 계정으로 가짜 결제를 완료해 보고, 프리미엄으로 바뀌는 것을 확인해야 다시 업로드할 준비가 다 될 것 같았다. 이 과정에서 내가 또 누락한 게 있었다는 걸 알게 되었다.

 

## In-App Purchase 테스트를 위한 Sandbox 계정 설정

우선 과정을 하나하나 적자면 다음과 같았다.
1. App Store Connect에서 User and Access 메뉴를 클릭해서 Sandbox Tester를 클릭해서 생성한다.
2. iPhone 설정(Setting)에서 제일 아래의 Developer을 누른다. (이 글을 쓰는 시점의 iOS versiondms 26.2였다.) 쭉 내리면 Sandbox Apple Account라는 부분이 있다. 거기에 App Store Connect에서 만들었던 Andbox Tester ID/PW를 입력했다.

그런 다음에 TestFlight에서 앱을 설치 및 실행한 후 프리미엄 인앱 구매 버튼을 눌러 결제창만 확인하면 되는데...
계속 error 메시지가 떴다. 이때부터 몇 시간을 '에러가 어디서 발생한 것인가' 찾는 싸움이 시작되었다.
 

## 결제창이 뜨지 않았던 진짜 원인 찾기

그 다음에 로그를 보니, 앱이 상품 정보를 불러오질 못했다. 즉, 내가 App Store Connect에 기입했던 상품 정보를 찾아오지 못해서 결제창이 뜨지 않고 바로 에러처리가 나는 상황이었다.
3-1. Monetization > In-App Purchase 내부의 Product ID가 글자, 띄어쓰기 하나 없이 완벽하게 똑같은지 확인하기.
3-2. 유료 앱 계약이 잘 되어 있는지? : Agreement, Tax, Bank Account 정보가 잘 기입되고 Active 상황인지.

나는 여기에서 3-2 부분이 하나도 체크되어 있지 않아 있었다. 
모든 것들을 기입한 뒤, 은행 정보가 애플에 들어오기 전까지 시간이 꽤 걸릴 것이라고 예상했던 것과는 달리, 바로 Active 상황으로 전환되었다. 그 뒤에 다시 인 앱 구매 버튼을 눌렀는데... 여전히 안 됐다.
 
모든 것들을 다시 점검했을 때도 구매 화면 넘어가는 것 안됨,
아이폰 재부팅, Bundle ID 확인을 해도 여전히 안 넘어감...

 

##In-App Purchase 기능 누락


그렇게 몇 번을 반복하다가, 프로젝트 파일 내에 In-App Purchase 기능이 Xcode 설정에 "추가되어 있지 않은(검색되지 않는) 상태"인 것으로 보인다고 진단했다. Xcode에서 In-App Purchase 기능을 추가하다가 빼기를 반복했다가, In-App Purchase 기능이 활성화될 때 함께 활성화되어야 할 파일이 만들어지지 않는 상태라는 것도 발견했단다. 
 
그 뒤에 Xcode 에서 파일을 강제로 만들고, Xcode 내부의 여러 요소들을 누르고 실행하기를 계속 진행했다(여기에 모두 적기엔 너무 복잡하고 많음). 한 참 후에 파일을 못 찾는 에러는 해결되었고, Xcode 설정 문제도 끝이 났지만 여전히 "상품을 찾을 수 없음" 문제는 해결할 수 없었다. Gemini는 이 문제를 "애플 서버가, 설령 Active라고 뜨더라도 아직 계약 정보를 반영하지 못해서 생길 문제의 확률이 높다"라고 이야기했다.

그래서 가상 테스트(StoreKit Config)로 테스트용 가짜 상품을 만들어서 코드가 정상인지 확인을 해보기로 했다. 이 과정은 실제로 결제되는 것이 아니라 "결제된 척" 연기만 하는 것이라고 했다. 테스트는 시뮬레이터가 아닌 실기기에서 실행했다.

Xcode 설정, 앱코드 점검(상품 인식과 결제창 띄우기) 성공. 
TestFlight에서만 안 되는 건 애플 서버 반영 시간문제인 거라고 결론.
 
이후 시뮬레이터에서 실행을 하면 app store에 결제할 Id/password를 입력해 달라는 데까지 확인이 되었지만, 여전히 TestFlight에서는  두 시간이 지나도록 여전히 결제창이 뜨질 않고, 제품 구매버튼을 누른 곳에서 빙글빙글 로딩 화면만 계속됨.
진행 상황을 출력하기 위해 로그 출력 설정을 했더니 다음과 같이 정상적인 결제창이 떴다!

서버 반영 시간의 문제였던건지, Active 상태여도 즉시 안될 수도 있던 건지...해결된 방식의 요점을 모르겠다.

 

코딩을 잘 모르는 나로서는 결제창 문제 하나를 제대로 해결하기까지 8시간이나 걸렸다.
프로그래밍을 잘하는 사람이었더라면 아마 몇 분만에 금세 해냈겠지..

내가 헤매며 이것저것 눌러서 도착한 일련의 과정들이 과연 문제 해결에 모두 필요했던 과정이었는지도 의구심이 든다. 그냥 AI가 방안을 찾아주는 대로 이것저것 했다. 마치 여러 약을 써보다가 그 여러 약의 복합적인 효과로 병이 나은 느낌이다.
그래도 이렇게 돌아가듯 하나씩 알아보고 뜯어보고 물어보니 아이폰에서 샌드박스 계정을 열어볼 기회도 생기고, 내가 이런 정도로 문제를 해결해 낼 수 있다는 것도 신기하다. 하나씩 눌러가고 설정해가면서 배워가는 것도 많다.

바이브코딩은, 그런데 정교한 부분을 처리할수록, 문제 자체에 대한 접근보다는 "자기 방식을 고집하는 어린아이"같아서, 이 AI가 놓치고 있는 부분은 무엇인지를 꼼꼼하게 살펴보고, 더 명확하고 자세하게 설명해서 개선점을 찾도록 이끌어야 한다는 걸 느낀다.  어떤 부분을 어떻게 바꿔나가고 싶은지를 구체적으로 표현할 수 있어야(+인내심) AI를 효율적으로 이용해서 결과물을 도출할 수 있는 것 같다.

 

결과적으로 In-App Purchase 무한 로딩 문제는
단일 원인이 아니라 App Store Connect 설정,
Xcode Capability, 서버 반영 시간 등이
복합적으로 얽혀 있었던 문제였던 것 같다.

In-App Purchase와 관련된 App Store 심사 문제는
코드뿐만 아니라 설정과 테스트 환경까지
모두 검증하지 않으면 쉽게 Reject로 이어질 수 있다는 걸
이번 경험을 통해 확실히 알게 되었다.

+ Recent posts