명령어
이 플러그인의 설치 단계와 전체 마크다운 가이드가 포함된 설정 프롬프트를 복사하세요.
이 페이지는 가이드 개요입니다. 정확한 플래그는 최신 명령 레퍼런스를 참고하세요: app, bundle, 채널로 이동, 그리고 build.
사용량
“Usage” 섹션모든 명령은 capacitor 프로젝트가 올바르게 초기화된 앱 폴더에서 실행해야 합니다.
Init
“Init” 섹션npx @capgo/cli@latest init [apikey]
단계별 온보딩을 도와주는 메서드입니다.
Capgo에 앱을 추가합니다. 업데이트 검증을 위해 앱에 code을 추가합니다. 마찬가지로 앱을 빌드하고, 앱을 Capgo에 업로드합니다. 그리고 업데이트가 제대로 작동하는지 확인하는 데 도움을 줍니다.
로그인
“로그인” 섹션npx @capgo/cli login [apikey]
이 메서드는 다음을 기억하기 위한 것입니다: apikey 를 대신 처리해 줍니다.
선택적으로 다음을 지정할 수 있습니다:
--local 다음 항목을 저장합니다: apikey를 사용하세요 로컬 저장소에 저장하고 git ignore 처리합니다.
Doctor
“Doctor” 섹션npx @capgo/cli doctor
Capgo 패키지가 최신 버전인지 확인하는 명령입니다.
이 명령은 버그 리포트를 작성할 때도 유용합니다.
추가
“Add” 섹션npx @capgo/cli app add [appId]
[appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
💡 옵션을 지정하지 않으면 config에서 자동으로 추론됩니다.
선택적으로 다음을 지정할 수 있습니다:
--icon [/path/to/my/icon]Capgo 웹 앱에 커스텀 아이콘을 표시하려면 사용하세요.--name [test]목록에 표시할 커스텀 이름을 설정합니다.--apikey [key]계정을 연결하기 위한 API 키입니다.--retention [retention]앱 번들 보관 기간(일)이며, 기본값 0 = 무제한입니다.
예시: capacitor.config.json appId와 AppName의 경우, resources 폴더에서 아이콘을 자동으로 찾습니다.
{ "appId": "ee.forgr.capacitor_go", "appName": "Capgo", "webDir": "dist"}설정
“Set” 섹션npx @capgo/cli app set [appId]
[appId] 앱 ID이며, 형식은 아래에서 설명합니다. 여기.
선택적으로 다음을 지정할 수 있습니다:
--icon [/path/to/my/icon]Capgo 웹 앱에 커스텀 아이콘을 표시하려면 사용하세요.--name [test]목록에 표시할 커스텀 이름을 설정합니다.--retention [retention]앱 번들 보관 기간(일)이며, 기본값 0 = 무제한입니다.--expose-metadata [true|false]플러그인에 bundle 메타데이터(링크 및 코멘트)를 노출하기 위해 사용합니다.--preview또는--no-previewbundle 및 채널 미리보기 QR 코드를 켜거나 끄는 데 사용합니다.--allow-device-custom-id또는--no-allow-device-custom-id커스텀 device ID를 제어하는 데 사용합니다.--block-provider-infra-requests또는--no-block-provider-infra-requestsGoogle 및 Apple 데이터센터의 알려진 요청을 차단하도록 설정합니다.--build-timeout-minutes [5-360]네이티브 빌드 타임아웃을 설정합니다.--ios-store-url [url]또는--android-store-url [url]스토어 URL을 설정합니다.--default-upload-channel [channel]기본 업로드 채널을 설정합니다.--default-download-channel [channel]기본 다운로드 채널을 설정하거나--disable-download-channels모든 다운로드 채널을 비공개로 만듭니다.--apikey [key]계정을 연결하기 위한 API 키입니다.
npx @capgo/cli app list [appId]
[appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
선택적으로 다음을 지정할 수 있습니다:
--apikey [key]계정을 연결하기 위한 API 키입니다.
npx @capgo/cli app delete [appId]
[appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
선택적으로 다음을 지정할 수 있습니다:
--apikey [key]계정을 연결하기 위한 API 키입니다.--bundle버전 번호를 지정하면 해당 버전만 삭제됩니다.
디버그
“Debug” 섹션npx @capgo/cli app debug [appId]
[appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
선택적으로 다음을 지정할 수 있습니다:
--apikey [key]계정을 연결하기 위한 API 키입니다.--device디버깅하려는 특정 기기
npx @capgo/cli app setting [path]
Capacitor 설정을 수정합니다.
[path] - 변경하려는 설정의 경로입니다. 예를 들어, appId, 제공 appId.
자동 업데이트를 비활성화하려면 capacitor-updater, 제공 plugins.CapacitorUpdater.autoUpdate 포함 --string off.
다음 중 하나를 반드시 제공해야 합니다 --string 또는 --bool!
옵션:
--string <string>- 설정을 문자열로 설정합니다--bool <true | false>- 설정을 불리언으로 설정합니다
Bundle
“Bundle” 섹션업로드
“Upload” 섹션npx @capgo/cli bundle upload [appId]
[appId] 앱 ID이며, 형식은 아래에서 설명합니다. 여기.
선택적으로 다음을 지정할 수 있습니다:
--apikey <apikey>계정을 연결하기 위한 API 키입니다.--path <path>업로드할 폴더 경로.--channel <channel>연결할 채널.--external <url>Capgo Cloud에 업로드하는 대신 외부 URL로 링크합니다.--iv-session-key <key>외부 bundle URL의 IV와 세션 키를 설정합니다.--s3-endpoint <s3Endpoint>S3 엔드포인트 URL. delta 업로드 또는 external 옵션과 함께 사용할 수 없습니다.--s3-region <region>S3 버킷의 리전.--s3-apikey <apikey>S3 엔드포인트의 API 키.--s3-apisecret <apisecret>S3 엔드포인트용 API secret.--s3-bucket-name <bucketName>AWS S3 버킷 이름.--s3-port <port>S3 엔드포인트 포트.--no-s3-sslS3 upload 시 SSL 비활성화.--key <key>공개 서명 키(v1 시스템)의 커스텀 경로.--key-data <keyData>공개 서명 키(v1 시스템).--key-v2 <key>개인 서명 키(v2 시스템)의 커스텀 경로.--key-data-v2 <keyData>개인 서명 키(v2 시스템).--bundle-urlbundle URL을 stdout에 출력합니다.--no-key서명 키를 무시하고 평문 업데이트를 전송합니다.--no-code-check소스 code의 notifyAppReady() 호출 여부와 루트 폴더의 index 존재 여부 검사를 무시합니다.--display-iv-session업데이트 암호화에 사용된 IV와 session key를 콘솔에 표시합니다.--bundle <bundle>업로드할 번들의 버전 번호입니다.--auto-bump [level]채널에 연결된 번들에서 자동 증분 처리하거나, 그렇지 않으면 최신 원격 앱 버전을 사용합니다. 레벨:major,minor(기본값),patch(별칭fix),metadata, 또는ai(Workers AI는 로컬 파일을 이전 Capgo/채널 델타 매니페스트와 비교하여 레벨을 추론하고 짧은 이유를 로그로 기록합니다. AI를 건너뛰고patch이전 Capgo 버전이 없으면 증분 처리합니다. 이름이 비어 있을 때까지 증분 처리합니다(삭제된 이름은 여전히 점유 상태로 유지됩니다).--bundle.--min-update-version <minUpdateVersion>이 버전으로 업데이트하는 데 필요한 최소 버전입니다. 채널의 메타데이터에 자동 업데이트 비활성화가 설정된 경우에만 사용됩니다.--auto-min-update-version네이티브 패키지를 기반으로 최소 업데이트 버전을 설정합니다.--ignore-metadata-check업로드 시 메타데이터(node_modules) 확인을 무시합니다.--ignore-checksum-check업로드 시 체크섬 확인을 무시합니다.--timeout <timeout>업로드 프로세스의 타임아웃(초 단위)입니다.--delta전체 bundle와 함께 Delta(manifest) 파일을 업로드합니다.--delta-only전체 bundle을 건너뛰고 Delta(manifest) 업데이트만 업로드합니다.--no-deltaDelta(manifest) 업로드를 비활성화합니다(즉시 적용autoUpdate모드가 활성화되어 있지만 전체 bundle이 필요한 경우 유용합니다).--tustus 프로토콜을 사용하여 bundle을 업로드합니다.--multipartS3에 데이터를 업로드하기 위해 multipart 프로토콜을 사용합니다. 비추천되며, 대신 TUS를 사용하세요.--encrypted-checksum <encryptedChecksum>암호화된 체크섬(서명)입니다. 외부 번들을 업로드할 때만 사용됩니다.--package-json <packageJson>package.json 경로입니다. monorepo에 유용합니다.--auto-set-bundlecapacitor.config.json에 bundle을 설정합니다.--node-modules <nodeModules>node_modules 경로 목록입니다. 모노레포에서 유용합니다 (쉼표로 구분, 예: ../../node_modules,./node_modules)
⭐️ External 옵션은 2가지 경우를 해결하는 데 도움이 됩니다: 프라이버시를 우려하는 기업(서드파티에 code을 보내지 않음)과 200MB가 넘는 앱. 이 설정을 사용하면 Capgo은 zip 링크만 저장하고 모든 앱에 링크를 전송합니다.
👀 Capgo cloud는 (external 옵션의 경우) 링크 내용이나 저장된 code의 내용을 절대 확인하지 않습니다.
🔑 암호화를 사용하여 보안의 두 번째 계층을 추가할 수 있습니다. 이렇게 하면 Capgo이(가) 아무것도 조회하거나 수정할 수 없게 되어 'trustless' 상태가 됩니다.
예시: package.json 버전
{ "version": "1.0.2"}⛔ 버전은 "0.0.0"보다 커야 합니다.
💡 보안을 위해 버전 번호는 재사용할 수 없으며 삭제 후에도 재사용이 불가능합니다. 전송할 때마다 버전 번호를 업데이트하는 것을 잊지 마세요.
npx @capgo/cli bundle list [appId]
[appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
선택적으로 다음을 지정할 수 있습니다:
--apikey [key]계정을 연결하기 위한 API 키입니다.
npx @capgo/cli bundle delete [appId]
[appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
선택적으로 다음을 지정할 수 있습니다:
--apikey [key]계정을 연결하기 위한 API 키입니다.--bundle버전 번호를 지정하면 해당 버전만 삭제됩니다.
메이저 버전에 대한 SemVer 범위에서 Cloud로
npx @capgo/cli bundle cleanup [appId] --bundle=[majorVersion] --keep=[numberToKeep]
[appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
선택적으로 다음을 지정할 수 있습니다:
--apikey [key]계정을 연결하기 위한 API 키입니다.--bundle [majorVersion]이전 패키지를 삭제할 기준 버전입니다. 마지막 1개 +numberToKeep.--keep [numberToKeep]유지할 패키지 개수 (기본값 4).
예를 들어, 10.0.1부터 10.0.11까지 10개의 버전이 있고, npx @capgo/cli cleanup [appId] --bundle=10.0.0 10.0.1부터 10.0.6까지 삭제됩니다. 10.0.7부터 10.0.11까지는 유지됩니다.
총 20개의 버전이 있고, 아래처럼 bundle 번호를 지정하지 않으면: npx @capgo/cli cleanup [appId] --keep=2 18개의 버전을 삭제하고 마지막 2개만 유지합니다.
이 명령은 확인을 요청하며, 유지 및 삭제될 항목을 테이블로 보여줍니다.
암호화
“암호화” 섹션경고: 이 명령어는 비추천(deprecated)되며 다음 major release에서 제거됩니다. 새로운 암호화 시스템을 사용하세요.
npx @capgo/cli bundle encrypt [path/to/zip]
외부 소스를 사용하여 code를 저장하거나 테스트 목적으로 사용할 때 이 명령어를 사용합니다.
선택적으로 다음을 지정할 수 있습니다:
--key [/path/to/my/private_key] 개인 키의 경로입니다.
--key-data [privateKey] 인라인으로 사용하려는 경우 private key 데이터입니다.
명령어는 다음을 출력합니다: ivSessionKeyy를 생성하고 암호화된 zip을 만듭니다. 이 파일은 upload 명령어 또는 decrypt 명령어와 함께 사용할 수 있습니다.
V2 암호화
“Encrypt V2” 섹션npx @capgo/cli bundle encrypt [path/to/zip] [checksum]
이 명령어는 code를 외부 소스에 저장하거나 테스트할 때 사용합니다. 체크섬은 번들의 sha256 값(`--key-v2`로 생성)이며, 복호화 후 파일 무결성을 검증하는 데 사용됩니다. 체크섬은 개인 키로 암호화되어 번들과 함께 전송됩니다. Encryption v2에서는 체크섬이 번들의 “signature” 역할을 하도록 업그레이드되었습니다.
선택적으로 다음을 지정할 수 있습니다:
--key [/path/to/my/private_key] 개인 키의 경로입니다.
--key-data [privateKey] 인라인으로 사용할 때의 개인 키 데이터입니다.
--json 정보를 JSON으로 출력합니다.
명령어는 다음을 출력합니다: ivSessionKeyy를 생성하고 암호화된 zip을 만듭니다. 이 파일은 upload 명령어 또는 decrypt 명령어와 함께 사용할 수 있습니다.
복호화
“Decrypt” 섹션npx @capgo/cli bundle decrypt [path/to/zip] [ivSessionKey]
선택적으로 다음을 지정할 수 있습니다:
--key [/path/to/my/private_key] 개인 키의 경로입니다.
--key-data [privateKey] 인라인으로 사용하려는 경우의 개인 키 데이터입니다. 이 명령은 주로 테스트 목적으로 사용되며, zip 파일을 복호화한 후 콘솔에 base64로 복호화된 세션 키를 출력합니다.
V2 복호화
“Decrypt V2” 섹션npx @capgo/cli bundle decryptV2 [path/to/zip] [ivSessionKey]
선택적으로 다음을 지정할 수 있습니다:
--key [/path/to/my/private_key] 개인 키의 경로입니다.
--key-data [privateKey] 인라인으로 사용하려는 경우의 개인 키 데이터입니다. 이 명령은 주로 테스트 목적으로 사용되며, zip 파일을 복호화한 후 콘솔에 base64로 복호화된 세션 키를 출력합니다.
--checksum [checksum] 파일의 체크섬입니다. 복호화 후 체크섬을 검증합니다.
압축
“Zip” 섹션npx @capgo/cli bundle zip [appId]
[appId] 앱 ID이며, 형식은 아래에서 설명합니다. 여기.
선택적으로 다음을 지정할 수 있습니다:
--path [/path/to/my/bundle]특정 폴더를 업로드하려면.--bundle [1.0.0]파일명에 번들 버전 번호를 설정하려면.--name [myapp]파일명을 덮어쓰려면.--json정보를 JSON 형식으로 출력하려면.--no-code-checkcode 검사를 무시하고 번들을 전송하려면.--key-v2새로운 암호화 시스템을 사용하려면. 파일 무결성을 검증하는 데 더 나은 체크섬을 사용하므로 필수입니다.
호환성
“호환성” 섹션npx @capgo/cli bundle compatibility [appId] -c [channelName]
[appId] 앱 ID이며, 형식은 아래에서 설명합니다. 여기.
[channelName] 확인할 채널 이름.
선택적으로 다음을 지정할 수 있습니다:
--apikey [key]계정을 연결하기 위한 API 키입니다.--text표에서 이모지 대신 텍스트를 사용하세요--channel [channel]호환성을 확인할 채널입니다.--package-json <packageJson>package.json 경로입니다. 모노레포에서 유용합니다.--node-modules <nodeModules>node_modules 경로 목록입니다. 모노레포에서 유용합니다 (쉼표로 구분, 예: ../../node_modules,./node_modules)
추가
“Add” 섹션npx @capgo/cli channel add [channelName] [appId]
[channelName] 새 채널의 이름입니다. 예: production 또는 beta. [appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
npx @capgo/cli channel delete [channelName] [appId]
[channelName] 삭제하려는 채널의 이름입니다. [appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
npx @capgo/cli channel list [appId]
[appId] 앱 ID 형식: com.test.app 설명되어 있습니다 여기.
선택적으로 다음을 지정할 수 있습니다:
--apikey [key]계정을 연결하기 위한 API 키입니다.
설정
“Set” 섹션npx @capgo/cli channel set [channelName] [appId]
[appId] 앱 ID이며, 형식은 아래에서 설명합니다. 여기.
[channelName] 설정하려는 채널 이름, 예: production 또는 beta.
선택적으로 다음을 지정할 수 있습니다:
--bundle [1.2.3]클라우드에 이미 업로드된 앱 번들을 채널에 연결합니다.--latest번들 버전을 가져오는 소스:package.json:version, 다음과 함께 사용할 수 없습니다--bundle.--state [ normal | default ]채널 상태를 설정합니다. 값은normal또는default여야 합니다. 채널은 하나만default.--downgrade채널이 기기에 다운그레이드 버전을 보낼 수 있도록 허용합니다.--no-downgrade채널이 기기에 다운그레이드 버전을 보내지 못하도록 차단합니다.--upgrade채널이 기기에 업그레이드(메이저) 버전을 보낼 수 있도록 허용합니다.--no-upgrade채널이 기기에 업그레이드(메이저) 버전을 보내지 못하도록 차단합니다.--ios채널이 iOS 기기에 버전을 보낼 수 있도록 허용합니다.--no-ios채널이 iOS 기기에 버전을 보내지 못하도록 차단합니다.--android채널이 Android 기기에 버전을 보낼 수 있도록 허용합니다.--no-android채널이 Android 기기에 버전을 보내지 못하도록 차단합니다.--self-assign이 채널에 기기가 스스로 할당되도록 허용합니다.--no-self-assign이 채널에 기기가 스스로 할당되는 것을 허용하지 않습니다.--disable-auto-update STRATEGY이 채널의 자동 업데이트 전략을 비활성화합니다. 가능한 옵션: major, minor, patch, metadata, none.--apikey [key]계정을 연결하기 위한 API 키입니다.
업데이트 비활성화 전략
“업데이트 전략 비활성화” 섹션너무 오래된 버전의 업데이트를 비활성화하는 방법은 몇 가지 있습니다.
Capgo는 네이티브 code을 업데이트할 수 없으므로, 구버전 네이티브 code에서 업데이트된 네이티브 code 버전으로의 업데이트는 불가능해야 합니다.
이를 달성하는 방법은 몇 가지 있습니다.
첫째, major 전략입니다. 네이티브 베이스라인 0.0.0 -> 대상 번들 1.0.0로의 업데이트를 방지합니다. major는 강조된 숫자입니다(1.0.0 및 0.0.0).
두 번째는 minor 전략입니다. 디바이스 네이티브 베이스라인과 타깃 번들의 major 또는 minor가 다르면 업데이트를 방지합니다. 예: 0.0.0 -> 1.1.0 또는 1.1.0 -> 1.2.0.
세 번째, patch 전략입니다. capgo에 매우 엄격한 모드로 추가되었습니다. 동작 방식을 완전히 이해하지 않는 한 사용을 권장하지 않습니다.
업데이트를 허용하려면 다음 조건을 충족해야 합니다:
- 타깃 번들과의 major가 동일해야 합니다
version_build - 타깃 번들과의 minor가 동일해야 합니다
version_build - 타깃 번들과의 patch가 동일해야 합니다
version_build - 버전 접미사만 다를 수 있으며, 예: prerelease (
-beta.2) 또는 build metadata (+build.2)
업데이트가 허용되거나 거부되는 시나리오 예시입니다
- 1.0.0-beta.1 -> 1.0.0-beta.2 허용
- 1.0.0+build.1 -> 1.0.0+build.2 허용
- 1.0.0 -> 1.0.1 차단
- 1.0.0 -> 1.1.0 차단
- 1.0.0 -> 2.0.0 차단
전략 비교는 네이티브 베이스라인을 다음으로 전송하여 수행됩니다 version_build현재 다운로드된 번들을 전송한 것과는 비교하지 않습니다. version_name.
마지막으로 가장 복잡한 전략입니다. metadata 전략.
활성화 직후 업데이트가 반드시 채널에 필요한 메타데이터가 없어 실패합니다.
채널에 메타데이터가 없으면 다음과 같은 메시지가 표시됩니다:
이런 메시지가 보이면 실패한 채널의 현재 bundle로 이동하여 메타데이터를 설정해야 합니다.
먼저 어떤 채널이 실패했는지 확인하세요. 다음을 살펴보면 알 수 있습니다. misconfigured 열
이제 실패한 채널로 이동하여 다음을 클릭하세요. Bundle number이로써 bundle 페이지로 이동합니다.
이곳에서 다음을 채우세요. Minimal update version 필드. 이 값은 semver.
전달한 값이 semver가 아니면 에러가 발생하지만, 모든 것이 정상적으로 진행되면 다음과 비슷한 결과가 표시됩니다:
이제 업데이트할 때마다 이 데이터를 수동으로 설정하고 싶지는 않을 겁니다. 다행히 CLI 덕분에 이 메타데이터 없이 업데이트를 전송하는 일을 막을 수 있습니다.
번들을 제대로 업로드하려면 metadata 옵션을 사용할 때 --min-update-version 를 사용하여 유효한 semver를전달해야 합니다. 예시는 다음과 같습니다:
이 --min-update-version 호환성을 맞추는 방법이 이것뿐인 것은 아닙니다.
다음과 같은 방법도 있습니다: --auto-min-update-version. 작동 방식은 다음과 같습니다.
먼저, 채널에 현재 업로드된 버전을 확인합니다. bundle compatibility 명령과 동일한 방식으로 호환성을 확인합니다.
두 번째로, 새 버전이 100% 호환되면 채널의 최신 버전에서 min_update_version 를 재사용합니다.
호환되지 않으면 min_update_version 를 새로 업로드된 버전의 번들 번호로 설정합니다.
이 옵션을 사용하면 항상 min_update_version 에 대한 정보가 표시됩니다. 다음과 같은 형태입니다:
새 버전이 호환되지 않으면 다음과 같은 형태가 됩니다
종단간 암호화 (Trustless)
“End-to-End encryption (Trustless)” 섹션Capgo는 종단 간 암호화를 지원합니다. 즉, code 번들은 클라우드로 전송되기 전에 암호화되고 디바이스에서 복호화됩니다. 이를 위해 RSA 키 쌍을 생성해야 하며, 다음 명령어로 생성할 수 있습니다.
암호화 시스템은 RSA와 AES를 조합한 방식입니다. RSA 키는 AES 키를 암호화하고, AES 키는 파일을 암호화합니다.
암호화 시스템에 대한 자세한 내용은 아래에서 확인하세요.
암호화 스키마
앱용 키 생성
“앱용 키 생성” 섹션npx @capgo/cli key create
선택적으로 다음을 지정할 수 있습니다: --force 기존 키를 덮어쓰려면 이 명령어를 사용하세요. 이 명령어는 앱에 키 쌍을 생성하고, 개인 키를 안전한 곳에 저장하라고 안내합니다. 개인 키는 git commit하지 말고 누구와도 공유하지 않는 것이 좋습니다.
로컬 테스트 후 설정 파일에서 키를 제거하고, CI 단계에서 다음 명령어로 추가하세요.
key save
앱 설정에 키 저장
“앱 설정에 키 저장” 섹션npx @capgo/cli key save
선택적으로 다음을 지정할 수 있습니다:
--key [/path/to/my/public_key] 공개 키 파일의 경로.
--key-data [publicKey] 인라인으로 사용하려는 경우 공개 키 데이터. 권장 사항대로 앱 설정에 키를 커밋하지 않았다면 이 명령이 유용합니다.
CI 통합
“CI 통합” 섹션작업을 자동화하려면 GitHub action이 서버로 푸시하도록 설정하는 것을 추천합니다.
저희 데모 앱
“저희 데모 앱” 섹션CI 환경 변수에 API 키를 설정하는 것을 잊지 마세요.
Commands에서 계속하기
“Commands에서 계속하기” 섹션사용 중이라면 명령어 대시보드 및 API 운영을 계획하려면, 이를 다음과 연결하세요 API 개요 구현 세부 사항은 API 개요에서 소개 구현 세부 사항은 소개에서 API 키 구현 세부 사항은 API 키에서 기기 구현 세부 사항은 기기에서, 그리고 번들 Bundles의 구현 세부 사항은