iOS 자동 갱신 구독 기능 구현에 대한 회고 - (2) 앱 심사 리젝

iOS 자동 갱신 구독 기능 구현에 대한 회고 - (2) 앱 심사 리젝

이번 업데이트 진행중에 총 세번의 리젝을 당했는데, 대부분이 개발자가 생각하지 않았을 이슈들이었다. 처음 자동 갱신 구독 기능을 넣기로 했다면 아래 사항들을 잘 따져보는게 좋을것이다.

어이없는 실수

리뷰 요청을 올린 다음날은 토요일이었다. 나는 내가 속해 있는 커뮤니티의 컨퍼런스에 참여하기 위해 이동하고 있던 중이었다. 그러다 아무 생각 없이 업무 메일을 열어 봤는데, 앱 심사 리젝 안내 메일이 와 있었다. 험난한 여정의 시작이었다.

애플에서 언급한 리젝 사유는 다음과 같았다.

  • (Guideline 2.1 - Performance - App Completeness) We found that while you have submitted in-app purchase products for your app, the in-app purchase functionality is not present in your binary.
  • (Guideline 3.1.2 - Business - Payments - Subscriptions) We noticed that your app or its metadata did not fully meet the terms and conditions for auto-renewing subscriptions, as specified in Schedule 2, section 3.8(b) of the Paid Applications agreement.

간단하게 번역해보자면, 하나는 **“너네가 리뷰 요청한 인앱 아이템이 보이지 않는다”**였고 또 하나는 “자동 갱신 구독 아이템에 대한 충분한 설명이 없다” 라는 것이었다.

첫번째 문제는 정말 부끄러울 정도로 초보적인 문제였다. 리뷰어용 계정에 새로 만든 인앱 아이템이 노출되지 않아서 리뷰어가 해당 아이템을 확인 할 수 없었던 것이다. 리뷰어용 계정은 서버에서 다른 로직을 사용할 수도 있다는 생각을 못 했던 내 잘못이었다. 두번째 문제는 “아이템이 노출 안되서 설명이 없다고 한 거겠지?” 라고 생각하고 그냥 건너뛰었다.

서버 개발자와 연락후 로직을 수정한 결과 리뷰어용 계정에도 해당 아이템이 정상적으로 노출되는 것을 확인했고, 리뷰를 다시 제출했다. 다음주 월요일에 예정되어 있던 이벤트가 있었기 때문에 긴급심사 요청도 함께 보냈다.

하지만 우리의 긴급심사 요청은 받아들여지지 않았고 마케팅팀과 기획팀은 타 회사와의 이벤트발표를 미루는 B플랜을 고려하기 시작했다.

Facepalm

가이드라인

새로 리뷰를 올린 이후로 리뷰 통과 여부를 매일 새벽마다 확인하고 있었는데, 19일 새벽에 리젝 안내 메일을 다시 받았다. 두번째 리젝 사유는 다음과 같았다.

  • (Guideline 3.1.2 - Business - Payments - Subscriptions) We noticed that your app or its metadata did not fully meet the terms and conditions for auto-renewing subscriptions, as specified in Schedule 2, section 3.8(b) of the Paid Applications agreement.

첫번째 리젝에서 크게 신경쓰지 않았던 두번째 리젝 사유와 동일했다.

이 메일을 확인한건 19일 새벽 4시 반, 리젝 사유를 확인하고 10분 정도 멘붕에 빠져 있다가 정신을 차리고 기획팀과 대응 방안 논의를 시작했다.

자동 갱신 구독형 인앱 아이템에는 여러 제약사항이 있는데, 앱 스토어 심사 지침에 나온 것들중 우리에게 문제가 됐던 사항은 다음과 같다.

3.1.2(c) 구독 정보: 고객에게 구독을 요청하기 전에 사용자에게 월별 발행 횟수 정보, 클라우드 저장 공간 정보, 서비스 접근 방법 등과 같은 구입 항목에 대해 명확하게 설명해야 합니다. 또한 계약, 세금 및 금융거래 계약서의 Schedule 2에서 설명한 요구 사항을 명확하게 전달해야 합니다. — App Store 심사지침

상당히 모호하지만, 리젝 사유에 포함된 구체적인 내용을 확인하면 뭘 더 추가해야 하는지 확실히 알 수 있다.

  • Title of publication or service
  • Length of subscription (time period and content or services provided during each subscription period)
  • Price of subscription, and price per unit if appropriate
  • Payment will be charged to iTunes Account at confirmation of purchase
  • Subscription automatically renews unless auto-renew is turned off at least 24-hours before the end of the current period
  • Account will be charged for renewal within 24-hours prior to the end of the current period, and identify the cost of the renewal
  • Subscriptions may be managed by the user and auto-renewal may be turned off by going to the user's Account Settings after purchase
  • Any unused portion of a free trial period, if offered, will be forfeited when the user purchases a subscription to that publication, where applicable

구독 아이템의 이름, 기간, 가격은 기본적으로 들어가겠지만 4번째 줄 부터는 자세히 확인해 봐야 한다. 번역해보면 다음과 같다.

  • 앱 스토어 계정에 등록된 구매 수단을 통해 결제가 될 것이다.
  • 구독 만료 24시간 전까지 구독 취소를 하지 않을 경우 자동으로 갱신된다.
  • 현재 구독 기간 종료 전 24시간 이내에 갱신 비용을 확인하고 부과한다.
  • 구독은 사용자가 관리할 수 있으며, 사용자의 계정 설정으로 이동하여 자동 갱신을 중단 할 수 있다.
  • 무료 평가판의 미 사용 부분은 사용자가 구독을 구매할 경우 효력이 상실됩니다.

위와 같은 내용이 앱 내부에 들어가야 하는데, 들어가야 하는 곳도 따로 정해져 있다. 리뷰어로 부터 온 메시지를 다시 들여다 보자.

“Adding the above information to the StoreKit modal alert is not sufficient; the information must also be displayed within the app itself, and it must be displayed clearly and conspicuously during the purchase flow without requiring additional action from the user, such as opening a link.”

“위와 같은 정보들을 StoreKit의 모달 팝업창에 추가하는 것으로 충분하지 않습니다. 이 정보들은 앱 자체에 표시되어야 하며 링크를 여는 것과 같이 사용자가 별도로 조치를 취하지 않아도 잘 보여야 합니다.”

즉, 사용자가 구매하는 액션을 취하는 View에 직접적으로 노출되어야 한다는 의미였다. 그래서 우리는 위 정보를 구매 화면에 꾸역꾸역 넣어서 다시 심사를 올릴 수 밖에 없었다.

바이너리를 새로 올려서 심사를 요청한 날짜는 12월 19일. 애플 연말 연휴 시작까지 4일밖에 남지 않았다.

Red Light

인앱 구매 아이템 리젝

새벽에 뒤척이다 잠에서 깨는 것이 일상으로 굳어져 가던 21일 아침. 애플 심사팀으로부터 메일이 한통 왔다.

This is a courtesy notice to inform you that although your recently submitted app, <앱 이름>, includes auto-renewable In-App Purchase subscriptions, it is not eligible for the marketing opt-in incentive. As a result, the marketing opt-in incentive option will be disabled in iTunes Connect and you will not be able to offer free extensions of auto-renewable In-App Purchase subscriptions in exchange for the right to send marketing materials.

간단히 해석해보면, “너네 앱은 마케팅 정보 제공으로 무료 구독 기간을 제공하는 옵션에 적합하지 않기 때문에 해당 옵션을 우리가 껐음” 라는 메일이었다. Newsstand Kit을 쓰는 매거진 앱의 경우 사용자의 주소 및 우편번호등을 받고 무료로 구독 기간을 제공할 수 있는 옵션이 있는데[1], 우리와 같은 서비스 앱에 해당되지 않기 때문에 자동으로 꺼진 모양이었다.

이 메일을 확인하다가 이번에는 새로 만들었던 자동 갱신 구독 아이템에 문제가 생긴것을 발견하였다. “개발자의 조치가 필요함” 이라니.. 다행히도 앱 자체가 리젝 당한건 아니었지만 심사 큐에서 다시 밀려야 하기 때문에 리젝을 먹은거나 마찬가지.

인앱 아이템을 등록할때는 심사를 위한 스크린샷과 설명을 함께 첨부하도록 되어 있었는데, 스크린샷에서 보이는 아이템 이름과 “현지화”에 등록해 둔 이름이 일치하지 않았던게 문제였던 것으로 추정했다. 여기서 추정할 수 밖에 없는 이유가 있는데, 인앱 아이템 리젝은 iTunes Connect 의 지원센터 페이지에도 사유를 알려주지 않기 때문이다. 그저 빨간 불이 들어 온 곳을 고쳐볼 뿐.

이쯤 되니 우리는 거의 자포자기 한 상태가 되었고, 내년 오픈이라는 말도 안되는 플랜도 예상해야 할 수 밖에 없었다. 그래서 우리가 최대한 할 수 있는걸 하자 싶어서 구구절절하게 글을 작성해서 애플 심사팀에 긴급 심사를 요청하는 메일을 다시 보냈다. 그리고 리뷰 가이드라인에서 문제가 될 만한 내용이 있는지 다시 확인하는 작업을 거쳤다.

이 시점에 가이드라인 상에서 발견된 문제 중 하나는 “구매 복원” 기능이 없었다는 건데, 우리는 일단 앱 리뷰 정보에 “구독 정보는 우리 서버와 계정에 귀속되므로 구매 복원 기능이 필요 없다” 라고 적어 놓기로 했다. 만약 이걸 가지고 리젝을 걸 경우에는 바로 심사를 다시 넣을 수 있도록 바이너리를 준비했다.

3편에서 계속됩니다


  1. In-App Purchase Configuration Guide for iTunes Connect 의 Subscription Properties - Marketing Incentive Duration 항목 참고 ↩︎