移动端集成 入门教程
所属主题:Claude 提示词工程完全指南
如果你正负责将 AI 能力接入移动应用,却无从下手,本文专为你准备。你将获得可操作的任务清单、常用配置对比表、完整示例以及常见陷阱,助你绕过文档翻找的混乱期。建议阅读后,进一步参考Anthropic 官方文档 获取最新 API 细节,或查阅移动端网络请求最佳实践 深化理解。
快速回答
移动端集成入门教程 是一套标准化指导流程,用于将后端 API(如 LLM 推理接口)接入 iOS 或 Android 客户端。核心目标并非堆叠 SDK,而是确保网络请求、认证、流量控制和错误处理在移动环境下可靠运行。本文以调用 Claude API 为例展开说明,你可通过 Anthropic 控制台 管理密钥和查看使用情况,或参考 API 版本历史 了解版本变化。
开始之前
在接触任何代码前,请先确认以下前提。跳过任意一项,后续调试成本会翻倍。
前置清单
- 有效的 API 密钥 – 在 console.anthropic.com 获取。注意:密钥仅创建时显示一次,丢失后无法找回,只能重新生成。建议使用环境变量或密钥管理服务(如 AWS Secrets Manager)存储。
- 确认 API 端点与版本 – 截至本文编辑时间,官方推荐端点为
https://api.anthropic.com/v1/messages,请求头须携带anthropic-version: 2023-06-01。新旧版本的消息结构不同,请务必检查你参考的文档是否匹配此版本。建议订阅 Anthropic 更新日志 以获取版本通知。 - 网络环境检查 – 国内网络可能无法直连外网 API,需提前确认服务器或手机是否具备访问条件。可考虑使用代理或专线,但需确保延迟和稳定性。
- 移动框架熟悉度 – 你至少应知道如何在项目中发起 HTTP 请求(例如
URLSession或OkHttp)及处理 JSON。若不熟悉,建议先学习 OkHttp 官方教程 或 URLSession 文档。
常见陷阱:许多人从某博客直接复制
curl示例,将其中的 URL 和密钥对应到客户端代码,却忽略了版本号。结果 API 返回 400 错误,花费数小时排查密钥或网络,实际上只是请求头少了一个anthropic-version字段。为避免此问题,始终从官方示例 获取基础模板。
操作步骤
以下步骤基于“从零开始让移动应用成功调用一次 API”这一场景。假设你的后端是 Anthropic Messages API,客户端是原生 Android (Kotlin),但原理适用于 iOS (Swift) 或其他框架。
第 1 步:在项目中配置网络权限与依赖
Android (Kotlin)
打开 app/src/main/AndroidManifest.xml,在 <manifest> 内添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
如果应用目标 API 28+,默认已启用明文流量限制。若 API 是 HTTPS 地址,则无需额外配置。建议使用 OkHttp 或 Retrofit 库管理网络,这些库已处理线程和缓存。
iOS (Swift)
Info.plist 中默认允许 HTTPS,无需额外操作。仅当使用 HTTP 时才需配置 App Transport Security,但生产环境强烈不推荐。建议使用 URLSession 原生 API,或第三方库如 Alamofire 以减少样板代码。
第 2 步:构造请求体
Messages API 要求 POST 请求,请求体为 JSON。以一次简单的“翻译”任务为例:
{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, please translate this to Chinese: 'Good morning'"}
]
}
注意:model 字段的值会随官方更新而变化。不要直接复制他人的代码而忽略模型版本,请从官方模型列表 或控制台确认当前可用的模型名称。此外,建议使用 system 参数设置提示词上下文,而非在每条消息中添加。
第 3 步:编写网络请求代码
以 Kotlin + OkHttp 为例:
val client = OkHttpClient()
val json = """
{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello, please translate this to Chinese: 'Good morning'"}]
}
""".trimIndent()
val request = Request.Builder()
.url("https://api.anthropic.com/v1/messages")
.addHeader("x-api-key", "YOUR_API_KEY")
.addHeader("anthropic-version", "2023-06-01")
.addHeader("Content-Type", "application/json")
.post(json.toRequestBody("application/json".toMediaType()))
.build()
关键检查点:请求头必须包含 x-api-key(而非 Authorization: Bearer)和 anthropic-version。漏掉后者将直接返回 400。对于 iOS,类似实现使用 URLRequest 和 URLSession,代码结构类似。
第 4 步:发起请求并处理响应
使用异步方式发起调用,避免阻塞主线程:
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// 网络异常:无网络、超时、DNS 解析失败
// 建议记录日志,并通知 UI 显示友好提示
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
val body = response.body?.string()
// 解析 JSON,提取 response.content[0].text
// 注意:响应体可能包含多种内容类型(如图像),需根据 type 字段处理
} else {
// 打印 response.code 和 response.body?.string() 查看具体错误
// 常见错误码:400(请求错误)、401(认证失败)、429(速率限制)
}
}
})
第 5 步:解析返回内容并展示给用户
成功响应示例(简化后):
{
"content": [
{
"type": "text",
"text": "早上好"
}
],
"stop_reason": "end_turn",
"model": "claude-sonnet-4-20250514"
}
提取 content[0].text 即可得到翻译结果。注意:content 数组可能包含多个元素(如文本和图像),请根据 type 字段判断。
完整示例边界情况
假设用户输入是空字符串。你必须在客户端做前置检查:
if (userInput.isBlank()) {
// 直接提示用户输入内容,不发起网络请求
return
}
否则 API 会返回 400 错误,提示 messages[0].content 不应为空。在移动端,一次网络往返耗时可能达 5 秒以上,提前拦截无效请求能明显提升体验。此外,考虑处理输入长度限制(如超过模型最大 token 数),减少后端拒绝。
检查清单
完成上述步骤后,用以下清单快速验证是否无误:
| 检查项 | 正确做法 | 典型错误 |
|---|---|---|
| API 密钥 | 存在安全存储(如 Android Keystore / iOS Keychain) | 硬编码在代码或 SharedPreferences |
| 请求头版本 | anthropic-version: 2023-06-01 |
缺失或使用 2023-01-01 |
| 网络请求方式 | 异步(非主线程) | 在主线程发起导致 ANR |
| 模型名称 | 来自官方最新列表 | 复制旧代码中的已废弃模型名 |
| 错误处理 | 区分 400/401/429/500 | 只检查 isSuccessful,不读 body |
| 重试逻辑 | 仅针对 429 或 5xx 重试 | 对所有错误都重试,浪费额度 |
故障排查
新手最常卡在以下三个地方。每遇到一个异常,先做这一步:
1. 收到 401 错误
停止排查代码逻辑。先去确认:
- 密钥是否在控制台复制正确(特别注意末尾有无隐藏空格)。
- 请求头