API App Store Review позволяет сторонним магазинам приложений, зарегистрированным в Google Play через программу Third-party app store on Play, предоставлять необходимую информацию о приложениях, размещенных в их магазине. Это включает метаданные приложений, описания, APK-файлы и заявления о соответствии политике.
Полный список конечных точек, методов и схем ресурсов см. в справочнике API для отзывов в App Store .
Прежде чем начать
Прежде чем отправлять запросы к API отзывов в App Store, необходимо выполнить основное руководство по началу работы , чтобы настроить доступ к API, учетные данные сервиса и проект Google Cloud. API отзывов в App Store ожидает не более 300 запросов в минуту на один магазин приложений.
Проектирование и архитектура API
API для отзывов в App Store работает по принципу атомарных снимков . Вместо транзакционных сессий вы загружаете файлы по отдельности, а затем фиксируете все состояние одним атомарным вызовом:
- Вы загружаете отдельные файлы и ресурсы (APK-файлы, изображения и файлы политик) в отдельных прямых запросах.
- Вы кэшируете возвращаемые идентификаторы для этих файлов.
- Для атомарной фиксации всего состояния размещенного приложения необходимо отправить единственный, заключительный запрос
UpdateAppStoreHostedApp.
1. Регистрация
Для регистрации размещенного приложения вызовите метод createappstorehostedapp , указав имя пакета приложения и имя пакета вашего магазина. Подробную информацию о схемах запроса и ответа см. в справочнике API.
2. Загрузка бинарных файлов и ресурсов.
После регистрации размещенного приложения необходимо загрузить его ресурсы, используя специализированные конечные точки загрузки:
- APK : Все активно распространяемые APK-файлы приложения (с использованием
uploadapk). - Изображения : Графические ресурсы, такие как значок приложения и скриншоты (с использованием
uploadimage). - Политики : (При необходимости) Документация, связанная с политиками (с использованием
uploadappstoreapppolicydeclarationfile).
Кэширование и повторное использование ресурсов
Для оптимизации пропускной способности и производительности не загружайте повторно идентичные ресурсы . Все возвращаемые токены apkId , imageId и fileId являются постоянными. Вы можете кэшировать эти идентификаторы в собственной базе данных и повторно использовать их при последующих обновлениях размещенного приложения. Например, если вы обновляете описание размещенного приложения, но значок приложения и скриншоты остаются неизменными, используйте кэшированные токены imageId в следующем запросе обновления.
3. Собрать и принять решение
После успешной загрузки всех ресурсов и получения их соответствующих идентификаторов необходимо собрать полное состояние размещенного приложения и зафиксировать его с помощью метода updateappstorehostedapp . Этот метод принимает полное, атомарное представление сведений о размещенном приложении, локализованные списки в магазине, активные наборы APK-файлов и заявления о безопасности.
Этот вызов заменяет любое ранее активное состояние новым состоянием, описанным в запросе.
Пример текста запроса
Ниже представлен реалистичный и синтаксически корректный JSON-запрос, иллюстрирующий все ключевые элементы:
{
"appStorePackageName": "com.example.thirdparty.store",
"packageName": "com.example.hostedapp.game",
"appDetails": {
"developerName": "Adventure Games Studio Ltd.",
"contactEmail": "support@adventuregames.example.com",
"developerWebsite": "https://adventuregames.example.com"
},
"activeLocalizedStoreListings": [
{
"languageCode": "en-US",
"appName": "Super Quest Legends",
"shortDescription": "An epic fantasy RPG adventure.",
"fullDescription": "Super Quest Legends is an immersive action RPG featuring real-time battles, customizable classes, and a deep fantasy narrative. Journey through a magical realm, fight epic bosses, and team up with friends in dungeon raids.",
"appIconId": "987123",
"screenshotId": [
"102938",
"475869",
"384756"
],
"videoLink": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
},
{
"languageCode": "es-ES",
"appName": "Super Quest Leyendas",
"shortDescription": "Una aventura épica de RPG fantástico.",
"fullDescription": "Super Quest Leyendas es un RPG de acción inmersivo con batallas en tiempo real, clases personalizables y una profunda narrativa de fantasía. Viaja a través de un reino mágico, lucha contra jefes épicos y únete a amigos en incursiones.",
"appIconId": "987123",
"screenshotId": [
"102938",
"475869",
"384756"
]
}
],
"activeApks": {
"activeApkSets": [
{
"baseApkId": "554433"
},
{
"baseApkId": "990011"
}
]
},
"policyDeclarations": [
{
"declarationId": "POLICY_DECLARATION_ID_TARGET_AUDIENCE_CONTENT",
"responses": [
{
"questionId": "POLICY_QUESTION_ID_TAC_TARGET_AGE_GROUPS",
"multipleChoiceResponse": {
"values": [
"POLICY_RESPONSE_CHOICE_ID_TAC_AGE_EIGHTEEN_AND_ABOVE"
]
}
},
// ... other responses for TAC
]
},
{
"declarationId": "POLICY_DECLARATION_ID_ADVERTISING_ID",
"responses": [
{
"questionId": "POLICY_QUESTION_ID_AD_ID_IS_USED",
"booleanResponse": {
"value": false
}
}
// ... other responses for AD_ID
]
}
// ... other declarations
]
}
Декларации политики
При отправке или обновлении информации о приложении с помощью API необходимо включить все требуемые декларации о политике конфиденциальности.
Требования к декларированию
В сферу действия входят следующие декларации:
Необходимо для всех приложений, чтобы подтвердить необходимость дополнительных деклараций:
- Приложения для здоровья: Расскажите, какие функции для здоровья использует приложение, чтобы мы могли понять, каким требованиям должна соответствовать политика в отношении приложений для здоровья.
- Финансовые функции: Приложения, предоставляющие финансовые функции, могут соответствовать определенным нормативным требованиям в некоторых странах или регионах. Предоставьте точную и актуальную информацию о финансовых функциях приложения, чтобы мы могли убедиться, что соответствующие команды рассмотрят вашу заявку.
- Идентификатор рекламного объявления: Помогите нам понять, использует ли приложение идентификатор рекламного объявления.
- Проверка учетных данных (данные для входа): Если доступ к какой-либо части приложения ограничен на основе данных для входа, членства, местоположения или других форм аутентификации, предоставьте инструкции по доступу к ней.
- Политика конфиденциальности: ссылка на политику конфиденциальности приложения и подробная информация о ней.
- Целевая аудитория и контент: Вы должны сообщить нам целевую возрастную группу приложения, а также другую информацию о его содержании. Это поможет убедиться в том, что приложения, разработанные для детей, безопасны и подходят для детей.
- Реклама: Вы должны сообщить нам, если приложение содержит рекламу.
Требуется при определенных условиях:
- Приложения для государственных учреждений: Укажите, предназначено ли приложение для использования государственными органами любого типа. Это включает в себя национальные, региональные и городские органы власти, а также местные органы власти. Это поможет нам убедиться, что заявку рассматривают соответствующие команды. Если это заявление не будет заполнено, приложение будет считаться не государственным.
- Стандарты безопасности для детей: Обязательны для приложений в категориях «Социальные сети» или «Знакомства». Приложения в категориях «Социальные сети» или «Знакомства» должны предоставлять опубликованные стандарты безопасности и контактную информацию в соответствии с нашей политикой обеспечения безопасности детей .
- Приложения для новостей и журналов: Обязательно для приложений из категории «Новости и журналы». Добавьте подробную информацию о приложении для новостей и журналов, чтобы обеспечить прозрачность в отношении организаций, стоящих за приложением.
Структура запроса API
Объявления политик предоставляются в массиве policyDeclarations в теле запроса UpdateAppStoreHostedAppRequest . Каждый элемент этого массива представляет собой объект AppStoreAppPolicyDeclaration .
Объект AppStoreAppPolicyDeclaration :
-
declarationId(строка, обязательно): Уникальный идентификатор декларации политики (например,POLICY_DECLARATION_ID_FINANCE,POLICY_DECLARATION_ID_TARGET_AUDIENCE_CONTENT). -
responses(массивPolicyResponse, обязательно): список ответов на вопросы, содержащиеся в конкретной декларации.
Объект PolicyResponse :
-
questionId(строка, обязательно): Уникальный идентификатор конкретного вопроса, на который дается ответ (например,POLICY_QUESTION_ID_FINANCIAL_PRODUCT_TYPES,POLICY_QUESTION_ID_TAC_TARGET_AGE_GROUPS). -
value(обязательно): Сам ответ, который может быть одного из следующих типов:-
booleanResponse: Для вопросов типа «Да» или «Нет».-
value(логическое)
-
-
stringResponse: Для ответов в виде обычного текста, включая URL-адреса.-
value(строка)
-
-
singleChoiceResponse: Когда из списка можно выбрать только один вариант.-
value(строка): Идентификатор выбранного варианта ответа.
-
-
multipleChoiceResponse: Когда можно выбрать несколько вариантов.-
values(массив строк): Идентификаторы выбранных вариантов ответа.
-
-
documentResponse: Для вопросов, требующих загрузки документа, см. раздел «Обработка загрузки документов» . -
groupResponse: Для повторяющихся наборов вложенных вопросов. -
keyedGroupResponse: Для наборов вложенных вопросов, сгруппированных по определенному ключу.
-
Примеры фрагментов кода для объявления см. в подробном руководстве .
Обработка загрузки документов
Для некоторых вопросов, касающихся политики, требуется предоставить подтверждающие документы (например, лицензии на финансовые функции). Документы нельзя встраивать непосредственно в запрос UpdateAppStoreHostedAppRequest . Вместо этого необходимо:
Загрузка документа: используйте конечную точку
UploadAppStoreAppPolicyDeclarationFile. Это запрос на загрузку медиафайла. ТипfileTypeдолжен быть установлен наDECLARATION_FILE_TYPE_DOCUMENT.- Конечная точка:
POST /androidpublisher/v3/appstore/{appStorePackageName}/apps/{packageName}/policyDeclarationFiles:upload - В ответе на запрос об успешной загрузке будет содержаться идентификатор
fileId).
- Конечная точка:
Укажите идентификатор документа: в
PolicyResponseзапрос о документе используйте типdocumentResponse. Заполните полеdocumentIdидентификаторомfileId, полученным на этапе загрузки.
Объект PolicyDocumentResponse :
-
documentId(строка, обязательно): Идентификатор, возвращаемый конечной точкойUploadAppStoreAppPolicyDeclarationFile. -
expiryDate(Дата, Необязательно): Дата истечения срока действия документа, если применимо. -
nonExpiring(логическое значение, необязательно): Установите значениеtrue, если срок действия документа не истекает.
Пример ответа на документ:
// Inside a PolicyResponse object
{
"questionId": "POLICY_QUESTION_ID_FINANCE_CRYPTO_US_FINCEN_LICENSE", // Example ID
"documentResponse": {
"documentId": "123456789", // The fileId from upload
"expiryDate": {
"year": 2027,
"month": 6,
"day": 1
}
}
}
4. Контроль доступности
После подтверждения состояния размещенного приложения с помощью команды UpdateAppStoreHostedApp , приложение автоматически обрабатывается и по умолчанию помечается как опубликованное в Google Play для стороннего магазина приложений.
Чтобы контролировать доступность приложения после его добавления в репозиторий, вызовите метод ` updateappstorehostedapppublishstatus для обновления его состояния:
- Отмена публикации приложения : Чтобы сделать размещенное приложение недоступным, установите поле
publishStateв значениеAPP_STORE_APP_PUBLISH_STATE_UNPUBLISHED. - Повторная публикация приложения : Чтобы сделать ранее неопубликованное приложение снова доступным без изменения описаний или повторной загрузки ресурсов, установите поле
publishStateвAPP_STORE_APP_PUBLISH_STATE_PUBLISHED.