提交应用版本
您可以通过 Aptoide Connect 开发者控制台 中的 应用提交表单,或通过下面描述的 Uploader API 来 提交 一个 新的 Android 应用版本。
端点
| 方法 | URL |
|---|---|
| POST | https://uploader.catappult.io/api |
身份验证
要访问此 API,您需要在 Aptoide Connect 上拥有一个有效的账户订阅,并使用 API 密钥进行身份验证(请查看此处了解如何生成密钥)。
应用版本只能由 Developer 类型的账户提交。
请求头
| 请求头 | 类型 | 是否必需 | 描述 |
|---|---|---|---|
Api-Key | string | 必需 | 用于对您的 API 请求进行身份验证。其值为您的 Aptoide Connect API 密钥。 |
请求体参数
- 所有参数都必须以 表单数据(
multipart/form-data)形式发送。不支持 JSON 请求。请在 cURL 中使用-F标志来发送每个字段。 - 所有文件参数(apk、obbs、splits、icon、featureGraphic、screenshots)均可通过以下任一方式提供:
- 作为 直接上传,或
- 作为 可公开访问的 URL(如果文件已托管在服务器或云存储上,例如 Amazon S3、Dropbox,则推荐此方式)。请确保所有 URL 均可公开访问,并在上传过程完成前保持有效。服务将直接从所提供的 URL 获取文件。
注意:请勿在同一请求中混用已上传的文件和 URL。每个请求请选择一种方式。
您可以一次性为多种语言提供 特定于区域设置的元数据(locales[<language_code>][...])。请参阅可用的语言代码。
参数 | 类型 | 是否必需 | 描述 |
|---|---|---|---|
|
| 必需 | 基础 APK 文件。 |
|
| 可选 | 可选的 OBB(扩展)文件。 |
|
| 仅当 | 通过 URL 提交时,与每个 OBB 文件对应的文件名。 |
|
| 可选 | 可选的 APK 拆分包文件(例如 |
|
| 可选(默认: | 指示该 APK 是否集成了我们的 Billing SDK。如适用,请使用 |
|
| 可选 | 控制提交的 APK 在我们的管理团队批准后如何以及何时发布。可能的值: |
|
| 可选 | 仅当 releaseMode 设置为 |
|
| 可选(默认: | 启用( |
|
| 可选 | 应用图标。 |
|
| 可选 | 应用的特色图片。 |
|
| 可选 | 指定语言的标题。 |
|
| 仅当提供了 | 指定语言的描述。 |
|
| 可选 | 指定语言的发行说明。 |
|
| 仅当提供了 | 指定语言的屏幕截图。 |
响应
成功
如果 API 调用返回 HTTP 200 状态码,则表示上传请求 成功,所提交的版本现在 正等待 Aptoide 团队的管理员批准。
错误
如果 HTTP 状态码 不是 200,则表示提交 失败。
响应体通常会包含一个描述问题的错误代码和消息。
| 错误代码 | HTTP 状态码 | 含义 | 修复方法 |
|---|---|---|---|
MISSING-APK | 400 Bad Request | 未提供 APK 文件或 URL | 上传一个 APK 或提供一个有效的公开 APK URL |
INVALID-APK-FILE | 400 Bad Request | 提供的 APK 文件无效 | 提供一个有效的 APK 文件或一个有效的公开 APK URL |
INVALID-APK-URL | 400 Bad Request | 提供的 APK URL 无法下载或无效 | 检查 URL 的可访问性和文件类型 |
APK-TOO-LARGE | 413 Payload Too Large | APK 文件过大 | 提供一个更小的 APK。请在此处查看允许的最大大小 |
OBB-TOO-LARGE | 413 Payload Too Large | OBB 文件过大 | 提供一个更小的 OBB。请在此处查看允许的最大大小 |
SPLIT-TOO-LARGE | 413 Payload Too Large | 拆分包文件过大 | 提供一个更小的拆分包。请在此处查看允许的最大大小 |
APK-NOT-SIGNED | 422 Unprocessable Entity | APK 未签名 | 在提交前对 APK 进行签名 |
INVALID-BILLING-METHOD | 400 Bad Request | 检测到不允许的计费方法 | 使用允许的计费方法。允许的值:aptoide-sdk、none |
APPLICATION-OWNED-BY-OTHER-ACCOUNT | 403 Forbidden | 该应用归另一个开发者账户所有 | 如果您是该应用的合法所有者,请联系支持团队 |
APK-ALREADY-EXISTS | 409 Conflict | 该 APK 此前已由您提交过 | 提交一个不同的 APK |
APK-SIGNATURE-MISMATCH-MARKET | 409 Conflict | APK 签名与 Google Play 版本不匹配 | 使用与 Google Play 上相同的密钥库 |
APK-SIGNATURE-MISMATCH-PREVIOUS | 409 Conflict | APK 签名与此前为该应用提交的 APK 不匹配 | 使用与上一版本相同的密钥库 |
APK-VERCODE-LOWER-THAN-MARKET | 409 Conflict | APK 的 versionCode 低于 Google Play 版本 | 将 versionCode 递增至与 Google Play 上相同或更高的值 |
FAILED-MOVING-APK-TO-STORAGE | 500 Internal Server Error | 将 APK 移至内部存储失败 | 重试 |
FAILED-MOVING-OBB-TO-STORAGE | 500 Internal Server Error | 将 OBB 移至内部存储失败 | 重试 |
FAILED-MOVING-SPLIT-TO-STORAGE | 500 Internal Server Error | 将拆分包文件移至内部存储失败 | 重试 |
SUBMISSION-NOT-ALLOWED | 403 Forbidden | 该应用不在 Google Play 中。只有当应用同时在 Google Play 中可用时,您才能通过 API 密钥首次将其提交到 Aptoide Connect。 | 通过 Aptoide Connect 开发者控制台上的应用提交表单提交第一个版本 |
SUBMISSION-NOT-ALLOWED | 403 Forbidden | 等待批准的待处理提交过多 | 在新提交之前等待批准完成 |
备注
- 大多数瞬时错误(如网络或存储故障)可通过短暂延迟后重试来解决。
- 验证错误(如签名或所有权问题)必须在重试之前修复。
- 非 200 的 HTTP 状态始终表示没有新版本被排入审查队列。
示例
文件上传示例(带 Billing SDK 的 APK)(cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "[email protected]" \
-F "billingMethod=aptoide-sdk"
文件上传示例(APK + 1 个 OBB + 1 个拆分包)(cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "[email protected]" \
-F "obbs[0][email protected]" \
-F "splits[0][email protected]_v8a.apk"
文件上传示例(带 Billing SDK 的 APK + 图标 + 特色图片 + 2 个区域设置,各含 2 张屏幕截图)(cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "[email protected]" \
-F "billingMethod=aptoide-sdk" \
-F "[email protected]" \
-F "[email protected]" \
-F "locales[en_GB][title]=Title via API" \
-F "locales[en_GB][description]=Description via API" \
-F "locales[en_GB][news]=News via API" \
-F "locales[en_GB][screenshots][0][email protected]" \
-F "locales[en_GB][screenshots][1][email protected]" \
-F "locales[pt_PT][title]=Titulo via API" \
-F "locales[pt_PT][description]=Descricao via API" \
-F "locales[pt_PT][news]=Noticias via API" \
-F "locales[pt_PT][screenshots][0][email protected]" \
-F "locales[pt_PT][screenshots][1][email protected]"
公开 URL 示例(带 Billing SDK 的 APK + 1 个 OBB + 1 个拆分包)(cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "apk=https://example-bucket.s3.amazonaws.com/app-release.apk" \
-F "obbs[0]=https://example-bucket.s3.amazonaws.com/main.12345.com.example.obb" \
-F "obbFileNames[0]=main.12345.com.example.obb" \
-F "splits[0]=https://example-bucket.s3.amazonaws.com/config.arm64_v8a.apk" \
-F "billingMethod=aptoide-sdk"
公开 URL 示例(带 Billing SDK 的 APK + 2 个 OBB + 2 个拆分包)(cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "apk=https://example-bucket.s3.amazonaws.com/app-release.apk" \
-F "obbs[0]=https://example-bucket.s3.amazonaws.com/main.12345.com.example.obb" \
-F "obbs[1]=https://example-bucket.s3.amazonaws.com/patch.12345.com.example.obb" \
-F "obbFileNames[0]=main.12345.com.example.obb" \
-F "obbFileNames[1]=patch.12345.com.example.obb" \
-F "splits[0]=https://example-bucket.s3.amazonaws.com/config.arm64_v8a.apk" \
-F "splits[1]=https://example-bucket.s3.amazonaws.com/config.xhdpi.apk" \
-F "billingMethod=aptoide-sdk"
公开 URL 示例(带 Billing SDK 的 APK + 图标 + 特色图片 + 2 个区域设置,各含 2 张屏幕截图)(cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "apk=https://example-bucket.s3.amazonaws.com/app-release.apk" \
-F "billingMethod=aptoide-sdk" \
-F "icon=https://example-bucket.s3.amazonaws.com/icon.png" \
-F "featureGraphic=https://example-bucket.s3.amazonaws.com/FG.png" \
-F "locales[en_GB][title]=Title via API" \
-F "locales[en_GB][description]=Description via API" \
-F "locales[en_GB][news]=News via API" \
-F "locales[en_GB][screenshots][0]=https://example-bucket.s3.amazonaws.com/s03.png" \
-F "locales[en_GB][screenshots][1]=https://example-bucket.s3.amazonaws.com/s04.png" \
-F "locales[pt_PT][title]=Titulo via API" \
-F "locales[pt_PT][description]=Descricao via API" \
-F "locales[pt_PT][news]=Noticias via API" \
-F "locales[pt_PT][screenshots][0]=https://example-bucket.s3.amazonaws.com/s01.png" \
-F "locales[pt_PT][screenshots][1]=https://example-bucket.s3.amazonaws.com/s02.png"