前言
当你开始像我一样在应用中使用 Capgo 的更新系统并爱上它时,你可能会产生这样的想法:“如果我想实现更精细的控制呢?”
我也曾有过这种感觉,但好在我正是 Capgo 的开发者,所以我可以直接研究一下!
既然一切都是开源的,你也可以拥有这种能力 :)
在 Capacitor 应用分发流程中,我遇到的下一个痛点是让其他同事测试更新!
用 TestFlight 时,问题很明确:把人拉进团队并让他们搞懂怎么获取版本,非常耗时!
当然,每次提交给 Apple,你都会遇到一个随机的机器人审核流程,可能 5 分钟,也可能 5 小时,完全说不准。
因为这个,我的演示多次被推迟……
而 Google 的情况更糟,这简直是我人生中最大的谜团:发布正式版不到 2 小时,但发布封闭测试版却要 1 到 2 天。
解决方案
为了解决这个问题,我在 Capgo 中创建了 Channel 系统。
npx @capgo/cli@latest bundle upload -c production 将更新推送给所有用户(如果 production channel 设为默认)
如果你这样做 npx @capgo/cli@latest bundle upload -c development 那么该版本会进入另一个 channel,这可以在 GitHub action 中自动化.
然后,你有两种方式让用户从 channel 获取更新
全自动方式
如果你不想为设置 Channel 自建后端,这种方式会很有用,而且实现起来很快。
使用这种方式,你只需将其中一个 Channel 设为允许 self set 即可。

然后在你的 Ionic app 的 code 中添加这段代码;为了获得最佳体验,请在用户点击“注册 beta”这类按钮后再执行。
import { CapacitorUpdater } from '@capgo/capacitor-updater'
const deviceId = await CapacitorUpdater.setChannel({ channel: 'beta' })
手动方式
这对你的内部团队很有用,而且实现起来很快。 让用户从 App 中复制 deviceID 并手动发给你,这个 code 可以帮你拿到它:
import { CapacitorUpdater } from '@capgo/capacitor-updater'
const deviceId = await CapacitorUpdater.getDeviceId()
把按钮藏在 App 的某个地方,或者只向已登录用户显示按钮,且该用户具有 admin 角色,例如。
然后前往 Web app 或 native app 的 Capgo,以 App 管理员身份登录,选择你的 App,然后点击设备列表。
然后在搜索栏输入 deviceID,点击找到的设备,再点击 Channel 链接,选择 development,让你的队友重新打开 App,等待 30 秒后打开再关闭。
他应该能收到你的版本。
自动化方式
这对于 Beta 测试人员非常有用,但实现起来更复杂。
与手动方式相同,你需要获取 deviceID
import { CapacitorUpdater } from '@capgo/capacitor-updater'
const deviceId = await CapacitorUpdater.getDeviceId()
但这次你需要将其自动发送到你的后端,具体实现方式由你决定。
我建议将其存储在数据库中,这样以后会方便很多。
然后,你需要在后端将其也发送到 Capgo 后端。以下是两个 code 示例:
NodeJS
import axios from 'axios'
await axios.post('https://api.capgo.app/device', {
app_id: 'YOUR_APP_ID',
device_id: 'DEVICE_ID',
channel: 'CHANNEL_NAME', // The name of the channel, or undefined if version_id provided
version_id: 'VERSION_NAME' // this is optional, if provide it will override the channel, that useful when you want to debug only one user.
}, {
headers: {
authorization: 'YOUR_API_KEY' // choose a key with 'write' or 'all' rights
}
})
Cloudflare
addEventListener('fetch', (event) => {
event.respondWith(
handleRequest(event.request).catch(
err => new Response(err.stack, { status: 500 })
)
)
})
async function handleRequest(request) {
const { pathname, method } = new URL(request.url)
const body = await request.json()
const newBody = JSON.stringify({
app_id: 'YOUR_APP_ID',
device_id: body.device_id,
channel: 'alpha'
})
const newUrl = new URL('https://api.capgo.app/device')
const options = {
headers: {
authorization: 'YOUR_API_KEY',
},
method: 'POST',
body: newBody
}
if (request.method === 'DELETE') {
// DELETE the channel link
options.method = 'DELETE'
return fetch(newUrl.toString(), options)
}
return fetch(newUrl.toString(), options)
}
只需通过 POST 请求将 device_id 放在 body 中发送至部署的 URL 即可添加,使用 DELETE 方法即可删除。
配置完成后,尝试在 App 中添加一个按钮用于加入该 channel,然后在 Web App 中检查是否设置成功。
你还可以发送 null 以移除 override
如果需要通过代码检查设备上设置了哪些 override,可以访问同一个 URL
import axios from 'axios'
const res = await axios.get('https://api.capgo.app/device?app_id=YOUR_APP_ID&device_id=DEVICE_ID', {
headers: {
authorization: 'YOUR_API_KEY' // choose a key with 'write' or 'all' rights
}
})
console.log('data', res.json())
继续阅读:如何向单个用户或用户组发送特定更新
如果你正在使用 如何向单个用户或用户组推送特定更新 要规划 Channel 路由和分阶段发布,请将其与 通道 有关 Channels 的实现细节, 通道 有关 Channels 的实现细节, 通道 有关 Channels 的实现细节, Beta 测试解决方案 适用于 Beta Testing Solution 产品工作流的,以及 版本定向解决方案 适用于 Version Targeting Solution 产品工作流的。