배포와 인프라8 분 읽기

권한 두 줄이 첫 출시를 막았습니다. 저장 버튼조차 안 눌렸습니다

한 번도 출시된 적 없는 앱을 프로덕션에 올리려는데 미리보기에서 저장 버튼이 죽어 있었습니다. 같은 날 다른 앱에서 본 선언 폼은 2단계였는데 이 앱은 3단계였고, 차이는 매니페스트의 권한 두 줄이었습니다.

#android#policy#release#gotchas
진행 표시줄 두 개. 위는 원 두 개짜리이고 오른쪽 저장 버튼이 활성. 아래는 매니페스트 권한 두 줄 때문에 가운데 단계가 하나 끼어 원이 세 개이고, 저장 버튼은 회색으로 죽어 있음.
폼의 모양이 매니페스트에 따라 달라집니다. 한 번 본 폼을 일반화하면 이렇게 됩니다.

같은 콘솔 화면을 한 번 봤다고, 그 화면이 모든 앱에서 같을 거라고 생각한 적 있으십니까?

저는 그날 오전에 본 선언 폼이 2단계였다는 이유로, 오후에 다른 앱을 그대로 밀어붙였습니다. 그 앱의 폼은 3단계였고, 저장 버튼이 죽어 있었습니다.

상황

한 번도 출시된 적 없는 앱을 프로덕션에 올리는 작업이었습니다. 번들은 올라가 있고, 리스팅도 14개 언어로 준비돼 있었습니다. 남은 건 롤아웃 버튼 하나였습니다.

미리보기 단계에서 저장 버튼이 죽어 있었습니다. 오류는 하나였습니다 — "건강 선언을 완료해야 합니다."

같은 날 다른 앱의 거부 원인을 찾느라 이미 이 선언 화면을 봤습니다. 2단계짜리 폼이었습니다. 그래서 "그거 금방 하면 되지" 하고 들어갔습니다.

이 앱은 3단계였습니다

차이는 매니페스트에 있었습니다.

<uses-permission android:name="android.permission.health.READ_SLEEP" />
<uses-permission android:name="android.permission.health.READ_HEART_RATE" />

이 두 줄이 선언돼 있으면, 폼 중간에 "건강 데이터 권한" 단계가 새로 생깁니다. 권한이 없으면 2단계로 끝납니다.

그리고 그 단계는 체크박스가 아닙니다. 자유 서술입니다. 권한마다 왜 필요하고 데이터를 어떻게 쓰는지 적어야 하고, 한 칸이 1만 자까지 들어갑니다. 비어 있으면 릴리스가 저장조차 안 됩니다.

폼 하나를 보고 "이 폼은 2단계"라고 일반화한 게 틀렸습니다. 폼의 모양이 매니페스트에 따라 달라진다는 걸 몰랐습니다.

같이 알게 된 것 둘

첫째: 한 번도 출시된 적 없는 앱은 API로 출시할 수 없습니다.

# 거부됨 — "초안 앱에는 초안 릴리스만 만들 수 있다"
releases = [{"status": "completed", ...}]
 
# 통과 — 올려 두고 롤아웃은 콘솔에서 사람이
releases = [{"status": "draft", ...}]

첫 출시만은 사람이 콘솔에서 눌러야 합니다. 이걸 모르면 "API가 왜 거부하지"에서 시간을 씁니다.

둘째: 콘솔이 보여 준 릴리스 이름이 옛것이었습니다. API로 새 번들을 넣었는데 화면에는 이전 릴리스 이름이 그대로라, 안 올라간 것처럼 보였습니다. 릴리스 이름이 스크립트 상수로 굳어 있었기 때문입니다. 실제 상태는 트랙 조회 API가 정본입니다.

이건 목록 화면의 심사 상태 표시가 낡은 것과 같은 계열입니다. 콘솔 화면은 정본이 아닙니다.

당신이라면 자유 서술에 뭘 쓰시겠습니까

여기서 진짜 판단이 필요했습니다. 심사를 통과하는 서술이 어떤 것인지 아무도 안 알려줍니다.

제가 넣은 건 권한마다 일곱 가지입니다.

  1. 이 권한이 왜 필요한가
  2. 데이터를 어떻게 쓰는가
  3. 읽기 전용인가
  4. 팔지 않는다
  5. 학습에 쓰지 않는다
  6. 사용자가 지울 수 있는가
  7. 거부해도 앱이 도는가

체크할 항목을 고르는 것도 판단이었습니다. 같은 계정의 다른 앱이 과소 선언으로 거부됐을 때 심사자가 지목한 분류를 기준으로 삼았습니다. 심사자가 직접 준 유일한 실측 신호였으니까요.

무시해도 되는 경고 하나

"네이티브 코드가 있는데 디버그 심볼을 안 올렸다"는 경고가 남습니다. 이건 차단 사유가 아닙니다. 첫 출시에서 경고를 전부 없애려다 하루를 쓸 수 있는데, 이건 그럴 필요가 없습니다.

자가진단 3줄

  1. 당신이 본 콘솔 폼이 앱마다 같습니까? 매니페스트·카테고리·선언에 따라 단계가 늘어납니다. 한 번 본 걸로 일반화하면 마감 직전에 막힙니다.
  2. 첫 출시가 API로 되는지 확인했습니까? 초안 앱은 사람 손이 한 번 필요합니다. 이걸 자동화 일정에 넣어 두면 그 자동화는 그날 실패합니다.
  3. 콘솔 화면과 조회 API가 다른 값을 말할 때 어느 쪽을 믿습니까? 이름·상태 같은 표시값은 낡을 수 있습니다.

솔직한 부분

자유 서술에 무엇을 써야 심사를 통과하는지는 아직 모릅니다. 이 앱의 첫 심사가 그 답을 줍니다. 지금 쓴 일곱 가지가 충분한지는 결과를 봐야 합니다. 이 글은 "이렇게 쓰면 통과한다"가 아니라 "이 단계가 존재한다는 걸 몰라서 막혔다"는 기록입니다.

체크 항목 선택도 확신은 아닙니다. 다른 앱의 거부에서 심사자가 지목한 분류를 옮겨 왔는데, 그게 이 앱에도 맞는지는 확실하지 않습니다. 과다 선언은 조직 요건을 부르고, 과소 선언은 "부정확한 선언"으로 거부됩니다. 양쪽에 벽이 있는 상태에서 고른 값이라, 심사 결과가 이 판단을 채점할 겁니다.

첫 출시를 준비 중이시라면, 롤아웃 화면에 들어가기 전에 앱 콘텐츠 선언을 한 번 열어 보세요. 저장 버튼이 회색인 걸 마감일에 발견하는 것보다 낫습니다.

관련 글