인사말
업데이트 시스템을 즐기기 시작하면 Capgo와 같은 앱을 만들 때 “더 많은 것을 원한다면?”하는 생각이 들게 됩니다.
저도 그 생각을 했었는데, Capgo의 제작자이기 때문에 Capgo의 코드를 확인할 수 있었습니다.
모든 것이 오픈 소스이기 때문에, 당신도 그 권한을 가지고 있습니다 :)
Capacitor 앱 배포 프로세스에서 다음으로 고통스러운 것은 다른 팀원들이 업데이트를 테스트하는 것입니다!
TestFlight의 경우 문제는 간단합니다. 팀원들을 끌어들이고 업데이트를 받는 방법을 이해시키는 데 시간이 걸립니다.
애플에 업데이트를 제출할 때마다 봇이 랜덤으로 리뷰 프로세스를 진행하고 5분에서 5시간까지 걸릴 수 있습니다.
이것 때문에 나의 발표가 여러 번 지연되었습니다...
구글의 경우 thậm chí còn tồi tệ hơn, 내 삶의 큰 bí ẩn, 생산 버전을 릴리즈하는 데는 2시간 미만이 걸리지만, 근접 베타 버전을 릴리즈하는 데는 1-2일이 걸립니다.
해결책
Capgo에서 채널 시스템을 만들었습니다.
npx @capgo/cli@latest bundle upload -c production 모든 사용자에게 업데이트를 적용할 수 있습니다 (기본 채널이 프로덕션 채널일 경우)
그렇다면 버전이 다른 채널로 이동할 수 있습니다. 이 과정을 자동화할 수 있습니다. npx @capgo/cli@latest bundle upload -c development __CAPGO_KEEP_0__ 액션을 사용하면 됩니다. GitHub action.
__CAPGO_KEEP_0__ 액션을 사용하면 됩니다.
Super automatic Way
이 기능을 사용하면 채널 세트에 대한 백엔드를 직접 만들지 않고도 유용할 수 있습니다. 이 기능은 빠르게 구현할 수 있습니다.
백엔드 없이 채널 세트를 구현할 수 있습니다. 이 기능은 빠르게 구현할 수 있습니다.

code에 이 코드를 추가하여 Ionic 앱에서 최적의 경험을 제공하십시오. 사용자가 '베타 등록' 버튼을 클릭한 후에 이 기능을 사용하는 것을 권장합니다.
import { CapacitorUpdater } from '@capgo/capacitor-updater'
const deviceId = await CapacitorUpdater.setChannel({ channel: 'beta' })
Manual way
내부 팀에 유용할 수 있는 기능입니다. 이 기능은 빠르게 구현할 수 있습니다. code을 사용하여 사용자가 장치 ID를 복사하고 수동으로 전송할 수 있도록 허용하십시오.
import { CapacitorUpdater } from '@capgo/capacitor-updater'
const deviceId = await CapacitorUpdater.getDeviceId()
앱 내에서 버튼을 숨기거나, 연결된 사용자만 보여주려면 역할을 사용하십시오. 예를 들어. admin __CAPGO_KEEP_0__으로 가서 앱 관리자로 로그인한 후 앱을 선택한 후 장치 목록을 클릭하십시오.
Capgo에서 장치 ID를 입력한 후 찾은 장치를 클릭한 후 채널 링크를 클릭하십시오.
__CAPGO_KEEP_0__에서 30초 후에 앱을 열고 닫아보십시오. development__CAPGO_KEEP_0__에서 30초 후에 앱을 열고 닫아보십시오.
__CAPGO_KEEP_0__
자동화된 방법
__CAPGO_KEEP_2__
__CAPGO_KEEP_3__
import { CapacitorUpdater } from '@capgo/capacitor-updater'
const deviceId = await CapacitorUpdater.getDeviceId()
__CAPGO_KEEP_4__
__CAPGO_KEEP_5__
Then in your backend you have to send it to Capgo backend too. Below two code examples:
__CAPGO_KEEP_7__
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)
}
__CAPGO_KEEP_9__
__CAPGO_KEEP_10__
__CAPGO_KEEP_11__ null __CAPGO_KEEP_0__
__CAPGO_KEEP_1__
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())
__CAPGO_KEEP_2__
__CAPGO_KEEP_3__ __CAPGO_KEEP_4__ __CAPGO_KEEP_5__ __CAPGO_KEEP_6__ __CAPGO_KEEP_7__ __CAPGO_KEEP_8__ __CAPGO_KEEP_9__ __CAPGO_KEEP_10__ __CAPGO_KEEP_11__ Beta Testing Solution Beta 테스트 솔루션의 제품 워크플로우에 대해, 그리고 Version Targeting Solution 버전 목표 솔루션의 제품 워크플로우에 대해.