스토어 메타데이터 API 정리: 항목별로 되는 것과 안 되는 것
앱 설명과 키워드를 채우면서 두 스토어의 API 를 항목별로 다 두드려 봤습니다. 콘솔에 들어가지 않고 어디까지 갈 수 있는지 궁금했거든요.
결과를 정리해 보니 "되는 것"과 "안 되는 것"의 이분법이 아니었습니다. 가운데에 한 칸이 더 있었습니다.
세 가지로 갈렸습니다
API 로 넣었다. 명령으로 값을 보내면 그대로 들어가는 것들입니다.
API 는 있는데 못 넣었다. 엔드포인트도 있고 권한도 있는데 넣을 재료가 없어서 비워 둔 것들입니다. 여기서 막힌 건 기술이 아니라 준비였습니다.
API 가 막혀 있다. 아무리 해도 안 되는 것들입니다.
App Store Connect
| 항목 | 결과 | 방법 |
|---|---|---|
| 앱 이름 | 넣음 | PATCH /v1/appInfoLocalizations/{id} |
| 부제 | 넣음 | 같은 엔드포인트 |
| 카테고리 | 넣음 | PATCH /v1/appInfos/{id} 의 관계 필드 |
| 설명 | 넣음 | PATCH /v1/appStoreVersionLocalizations/{id} |
| 키워드 | 넣음 | 같은 엔드포인트 |
| 홍보 문구 | 넣음 | 같은 엔드포인트 |
| 지원 URL | 넣음 | 같은 엔드포인트 |
| 저작권 | 넣음 | PATCH /v1/appStoreVersions/{id} |
| Bundle ID 등록 | 넣음 | POST /v1/bundleIds 가 201 |
| 빌드와 버전 연결 | 자동 | 업로드하면 알아서 붙음 |
| 개인정보 처리 방침 URL | 못 넣음 | 필드는 있는데 올릴 페이지가 아직 없음 |
| 스크린샷 | 못 넣음 | 업로드 API 는 있는데 이미지가 없음 |
| 연령 등급 | 막힘 | 관계 자체가 없다고 404 |
| 앱 레코드 생성 | 막힘 | 403, does not allow 'CREATE' |
Google Play
| 항목 | 결과 | 방법 |
|---|---|---|
| 제목 | 넣음 | PATCH /edits/{id}/listings/{lang} |
| 짧은 설명 | 넣음 | 같은 엔드포인트 |
| 전체 설명 | 넣음 | 같은 엔드포인트 |
| 연락처 이메일, 웹사이트 | 넣음 | PATCH /edits/{id}/details |
| 트랙 조회 | 넣음 | GET /edits/{id}/tracks/{track} |
| 스크린샷, 아이콘 | 못 넣음 | 업로드 API 는 있는데 이미지가 없음 |
| 키워드 | 필드 없음 | Play 는 키워드 칸이 없음 |
| 콘텐츠 등급 | 막힘 | 콘솔 전용 |
| 데이터 보안 신고 | 막힘 | 콘솔 전용 |
| 앱 생성 | 막힘 | 엔드포인트 자체가 없음 |
두 API 의 성격이 달랐습니다
같은 일을 하는데 다루는 방식이 반대였습니다.
Apple 은 바로 고칩니다. 대상에 PATCH 를 보내면 그 자리에서 반영됩니다.
Google 은 편집 세션을 엽니다. 먼저 편집을 하나 만들고, 그 안에서 값을 바꾸고, 마지막에 커밋해야 반영됩니다. 커밋하지 않으면 아무 일도 일어나지 않고, 중간에 실패하면 편집을 지워서 통째로 되돌릴 수 있습니다.
트랜잭션이 있는 셈이라 처음엔 번거롭게 느껴졌는데, 실수했을 때 롤백이 쉬운 건 장점이었습니다. 실제로 스크립트에 실패 시 편집을 삭제하는 처리를 넣어 두니 마음이 편했습니다.
막히는 방식도 달랐습니다
앱을 만들려고 했을 때 Apple 은 이렇게 답했습니다.
{
"code": "FORBIDDEN_ERROR",
"detail": "The resource 'apps' does not allow 'CREATE'.
Allowed operations are: GET_COLLECTION, GET_INSTANCE, UPDATE"
}무엇이 막혔고 대신 무엇이 되는지까지 알려 줍니다. 이 메시지 덕분에 "권한을 올리면 되겠지"라는 제 가정이 틀렸다는 걸 알았습니다. 정확히는 키를 세 개나 만들어 보고 나서였지만요.
Google 은 그런 답조차 없습니다. 앱을 만드는 엔드포인트가 문서에 없습니다. 없는 문을 두드릴 수는 없으니 오히려 헷갈릴 일이 없었습니다.
연령 등급도 비슷했습니다. Apple 은 관계를 조회하니 "그런 관계가 없다"고 404 를 줬고, Google 은 애초에 그런 경로가 없었습니다.
키워드는 한쪽에만 있습니다
Apple 에는 키워드 칸이 따로 있습니다. 백 자까지 쉼표로 나열하는데, 앱 이름에 이미 들어간 말은 자동으로 색인되니 거기 또 넣으면 자리만 낭비합니다. 그래서 이름에 없는 말들로만 채웠습니다.
Google 에는 그 칸이 없습니다. 설명 본문이 곧 검색 대상이라, 넣고 싶은 말을 문장 안에 자연스럽게 녹여야 합니다. 같은 앱인데 글을 두 벌 쓰게 되는 이유가 이것입니다.
가운데 칸이 제일 흥미로웠습니다
처음에는 "API 로 되나 안 되나"만 궁금했는데, 막상 해보니 API 는 열려 있는데 넣을 게 없어서 못 넣은 것이 두 개나 됐습니다. 개인정보 처리 방침과 스크린샷입니다.
이 둘은 기술 문제가 아닙니다. 처리 방침은 웹에 페이지가 하나 있어야 하고, 스크린샷은 앱을 켜서 찍어야 합니다. 자동화가 막힌 게 아니라 자동화할 재료가 아직 없는 것입니다.
비어 있는 칸을 보면서 "이건 API 가 없나" 하고 문서를 뒤졌는데, 알고 보니 제가 만들지 않은 것이었습니다. 도구를 탓하기 전에 재료를 확인했어야 했습니다.
남은 것
콘솔에 들어가서 해야 하는 건 결국 둘입니다. 연령 등급 설문과 데이터 수집 신고. 둘 다 "이 앱은 이러이러합니다"라고 선언하는 일이라 기계가 대신 눌러 줄 성격이 아닙니다.
나머지는 재료만 만들면 API 로 들어갑니다.
함께 읽기
- 바이너리 등록 후 남은 것들: 자동화되는 일과 사람이 해야 하는 일빌드가 끝나고 양쪽 스토어 콘솔에 바이너리가 올라갔습니다. 저는 그때 "이제 다 됐다"고 생각했습니다. 실제로는 거기서부터가 절반이었습니다.
- App Store Connect와 Google Play API 비교: 인증·권한·한계앱 하나를 두 스토어에 등록하면서 양쪽 API를 같은 날 연달아 만졌습니다. 목적이 똑같았기 때문에 차이가 잘 보였습니다. 인증 방식부터 다르고, 권한을 다루는 사고방식이 다르고, 심지어 "안 되는 걸 알려주는 방식"까지 달랐습니다.
- Expo 앱 스토어 배포 준비 체크리스트: 순서가 중요한 이유새 Expo 앱 하나를 두 스토어에 올릴 준비를 했습니다. 필요한 항목 자체는 검색하면 다 나옵니다. 그런데 정작 저를 막은 건 항목이 아니라 순서였습니다. 앞 단계가 끝나야 뒤 단계의 값이 생기는 구간이 몇 군데 있고, 그걸 모르고 덤비면 "왜 이 필드가 비어 있지"에서 멈춥니다.
- App Store Connect API 키: Team Key로 할 수 있는 것과 없는 것새 앱을 App Store Connect에 등록하면서, 화면을 계속 왔다 갔다 하기 귀찮아서 API로 자동화할 수 있는 부분은 자동화해보려고 했습니다. 결론부터 적으면 절반만 성공했습니다. 조회·수정은 되는데, 앱 생성 자체는 API로 안 됩니다.
- RN 앱 두 번째 배포: 재사용되는 인증서, 새로 해야 하는 등록몇 주 전에 만든 고객 포털 앱을 반쯤 복사해서 새 RN 앱을 하나 더 만들었습니다. 성경 속 여정을 지도에 그리는 화면 하나를 웹에서 옮겨온 것뿐인데, 옮기고 나니 "인증서까지 그대로 가져다 쓸 수 있나"가 궁금해졌습니다. 결론부터 적으면 절반만 맞았습니다.