Cordova 클라이언트 SDK
Important
Visual Studio App Center는 2025년 3월 31일에 사용 중지될 예정입니다. 완전히 사용 중지될 때까지 Visual Studio App Center를 계속 사용할 수 있지만 마이그레이션을 고려할 수 있는 몇 가지 권장 대안이 있습니다.
이 플러그 인은 CodePush 서비스에 대한 클라이언트 쪽 통합을 제공하므로 Cordova 앱에 동적 업데이트 환경을 쉽게 추가할 수 있습니다.
참고 항목
Cordova 앱에 대한 지원은 2022년 4월에 종료되었습니다. App Center 블로그에서 자세한 내용을 확인하세요.
작동 방식
Cordova 앱은 HTML, CSS 및 JavaScript 파일 및 함께 제공되는 이미지로 구성되며 Cordova CLI에서 함께 번들로 제공되고 플랫폼별 이진 파일(예: .ipa 또는 .apk 파일)의 일부로 배포됩니다. 앱이 릴리스되면 코드 또는 이미지 자산을 업데이트하려면 전체 이진 파일을 다시 컴파일하고 재배포해야 합니다. 이 프로세스에는 게시하려는 저장소에 대한 검토 시간이 포함됩니다.
CodePush 플러그 인은 코드 및 이미지를 CodePush 서버에 릴리스한 업데이트와 동기화된 상태로 유지하여 최종 사용자 앞에서 제품 향상을 즉시 얻을 수 있도록 도와줍니다. 이렇게 하면 앱이 오프라인 모바일 환경의 이점과 사용 가능한 즉시 테스트용으로 업데이트를 로드하는 "웹과 유사한" 민첩성을 얻을 수 있습니다. 그래서 더 좋습니다.
최종 사용자에게 항상 앱의 작동 버전이 있는지 확인하기 위해 CodePush 플러그 인은 이전 업데이트의 복사본을 유지 관리하므로 실수로 크래시가 포함된 업데이트를 푸시하는 경우 자동으로 롤백할 수 있습니다. 이렇게 하면 새로 발견된 릴리스 민첩성으로 인해 서버에서 롤백하기 전에 사용자가 차단되지 않는다는 것을 안심할 수 있습니다. 그것은 윈 - 윈 - 윈입니다!
참고 항목
네이티브 코드를 터치하는 제품 변경(예: Cordova 버전 업그레이드, 새 플러그 인 추가)은 CodePush를 통해 배포할 수 없으므로 적절한 저장소를 통해 업데이트해야 합니다.
지원되는 Cordova 플랫폼
Cordova 5.0.0 이상은 다음과 같은 연결된 플랫폼과 함께 완전히 지원됩니다.
- Android(cordova-android 4.0.0 이상) - CrossWalk 포함!
- iOS(cordova-ios 3.9.0 이상) - (플러그 인과 함께
cordova-plugin-wkwebview-engine
CodePush를 사용하려면 WebView를 사용하는 앱에 대한 모든 지원을 포함하여 설치v1.5.1-beta+
해야 합니다.)
현재 사용 중인 각 Cordova 플랫폼의 버전을 확인하려면 다음 명령을 실행하고 목록을 검사할 Installed platforms
수 있습니다.
cordova platform ls
위에서 언급한 것보다 이전 Android 또는 iOS 플랫폼을 실행하고 업그레이드할 수 있는 경우 다음 명령을 실행하여(필요하지 않은 경우 플랫폼을 생략) 쉽게 수행할 수 있습니다.
cordova platform update android
cordova platform update ios
시작
참고 항목
이 문서에는 Microsoft에서 더 이상 사용하지 않는 용어 인 허용 목록에 대한 참조가 포함되어 있습니다. 소프트웨어에서 용어가 제거되면 이 문서에서 해당 용어가 제거됩니다.
CodePush 계정을 설정하기 위한 범용 "시작" 지침을 따른 후에는 앱의 루트 디렉터리 내에서 다음 명령을 실행하여 CodePush-ifying을 시작할 수 있습니다.
cordova plugin add cordova-plugin-code-push@latest
CodePush 플러그 인이 설치되면 다음 단계를 통해 앱을 사용하도록 앱을 구성합니다.
- 배포 키를 config.xml 파일에 추가하여 각 Cordova 플랫폼에 적합한 키를 포함해야 합니다.
<platform name="android">
<preference name="CodePushDeploymentKey" value="YOUR-ANDROID-DEPLOYMENT-KEY" />
</platform>
<platform name="ios">
<preference name="CodePushDeploymentKey" value="YOUR-IOS-DEPLOYMENT-KEY" />
</platform>
이러한 키는 CLI를 통해 CodePush 앱을 만들 때 생성됩니다. 검색해야 하는 경우 실행appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys
하여 사용하려는 특정 배포(예: Staging
Production
)에 대한 키를 잡을 수 있습니다.
Important
위의 샘플에서 Android 및 iOS용 별도 키를 선언하는 이유인 iOS 및 Android용 별도의 CodePush 앱을 만드는 것이 좋습니다. 단일 플랫폼용으로만 개발하는 경우 Android 또는 iOS에 대한 배포 키만 지정하면 되므로 위에서 설명한 대로 추가 <platform>
요소를 추가할 필요가 없습니다.
버전 1.10.0 부터 업데이트 번들에 서명할 수 있습니다(코드 서명에 대한 자세한 내용은 관련 설명서 섹션 참조). Cordova 애플리케이션에 코드 서명을 사용하도록 설정하려면 다음 preference
설정을 config.xml
제공하여 번들 서명을 확인하는 공개 키를 설정해야 합니다.
<platform name="android">
...
<preference name="CodePushPublicKey" value="YOUR-PUBLIC-KEY" />
</platform>
<platform name="ios">
...
<preference name="CodePushPublicKey" value="YOUR-PUBLIC-KEY" />
</platform>
각 플랫폼에 대해 동일한 프라이빗/공개 키 쌍을 사용할 수 있습니다.
- config.xml 파일에서 요소를 사용하는
<access origin="*" />
경우 앱은 이미 CodePush 서버와 통신할 수 있으며 이 단계를 안전하게 건너뛸 수 있습니다. 그렇지 않으면 다음 추가 요소를 추가<access />
합니다.
<access origin="https://codepush.appcenter.ms" />
<access origin="https://codepush.blob.core.windows.net" />
<access origin="https://codepushupdates.azureedge.net" />
- 앱이 CSP 규격 플랫폼의 CodePush 서버에 액세스할 수 있도록 파일의 태그에
Content-Security-Policy
meta
추가https://codepush.appcenter.ms
합니다index.html
.
<meta http-equiv="Content-Security-Policy" content="default-src https://codepush.appcenter.ms 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *" />
- 마지막으로 플러그 인이 이미
cordova-plugin-whitelist
설치되어 있는지 다시 확인합니다(대부분의 앱은 설치됨). 이를 확인하려면 다음 명령을 실행합니다.
cordova plugin ls
목록에 있는 경우 cordova-plugin-whitelist
이동하는 것이 좋습니다. 그렇지 않으면 다음 명령을 실행하여 추가합니다.
cordova plugin add cordova-plugin-whitelist
이제 애플리케이션 코드에서 플러그 인을 사용할 준비가 되었습니다. 자세한 내용은 예제 및 API 설명서에 대한 샘플 애플리케이션을 참조하세요.
플러그 인 사용
CodePush 플러그 인을 설치하고 구성하면 다음 정책을 제어하는 데 필요한 코드를 앱에 추가하는 것만 남았습니다.
- 언제(그리고 얼마나 자주) 업데이트를 확인해야 합니까? (e.g. app 설정 페이지에서 단추를 클릭하면 일정한 간격으로 주기적으로 시작됩니다.
- 업데이트를 사용할 수 있는 경우 최종 사용자에게 업데이트를 제공하는 방법
이 작업을 수행하는 가장 간단한 방법은 앱의
deviceready
이벤트 처리기에서 다음을 실행하는 것입니다.
codePush.sync();
업데이트를 사용할 수 있는 경우 자동으로 다운로드되고 다음에 앱을 다시 시작할 때(최종 사용자 또는 OS에 의해 명시적으로) 설치되므로 최종 사용자에게 가장 침습적인 환경이 보장됩니다. 사용 가능한 업데이트가 필수인 경우 즉시 설치되어 최종 사용자가 가능한 한 빨리 업데이트를 받도록 합니다.
앱이 업데이트를 더 빨리 검색하도록 하려면 앱 시작 동작의 일부로 다음 코드(또는 이와 동등한 코드)를 추가하여 앱이 백그라운드에서 다시 시작될 때마다 호출 sync
하도록 선택할 수도 있습니다. 원하는 만큼 자주 호출 sync
할 수 있으므로 언제 어디서 호출할지는 개인적인 선호도에 따라 달라집니다.
document.addEventListener("resume", function () {
codePush.sync();
});
또한 업데이트 확인 대화 상자("활성 설치")를 표시하거나, 사용 가능한 업데이트가 설치될 시기를 구성하거나(예: 즉시 다시 시작) 어떤 방식으로든 업데이트 환경을 사용자 지정하려면 이 기본 동작을 조정하는 방법에 대한 자세한 내용은 메서드의 API 참조를 참조 sync
하세요.
Important
Apple의 개발자 계약은 JavaScript 및 자산(CodePush를 가능하게 하는 것)의 무선 업데이트를 완전히 허용하지만, 앱이 업데이트 프롬프트를 표시하는 정책에 위배됩니다. 이 때문에 App Store 분산 앱은 호출sync
할 때 옵션을 사용하도록 설정 updateDialog
하지 않는 것이 좋습니다. 반면 Google Play 및 내부적으로 분산된 앱(예: Enterprise, Fabric, HockeyApp)은 이를 사용/사용자 지정하도록 선택할 수 있습니다.
업데이트 릴리스
앱이 구성되고 사용자에게 배포되고 코드 또는 자산이 변경되면 즉시 릴리스할 차례입니다. 이 작업을 수행하는 가장 간단하고 권장되는 방법은 CodePush 서버에 대한 업데이트 준비 및 릴리스를 처리하는 CodePush CLI의 명령을 사용하는 release-cordova
것입니다.
참고 항목
업데이트 릴리스를 시작하기 전에 명령을 실행 appcenter login
하여 App Center에 로그인합니다.
가장 기본적인 형식에서 이 명령에는 소유자 이름 + "/" + 앱 이름이라는 매개 변수가 하나만 필요합니다.
appcenter codepush release-cordova -a <ownerName>/<appName>
appcenter codepush release-cordova -a <ownerName>/MyApp-ios
appcenter codepush release-cordova -a <ownerName>/MyApp-android
팁
App Center CLI set-current
함수를 사용하면 -a 플래그를 사용하여 명령이 지시되는 앱을 지정할 필요가 없습니다.
팁
CodePush에 대한 업데이트를 릴리스할 때 이진 버전을 전혀 수정하지 않으므로 config.xml 파일에서 앱의 버전을 충돌할 필요가 없습니다. Cordova 또는 플러그 인 중 하나를 업그레이드할 때만 이 버전을 범프해야 합니다. 이 시점에서 네이티브 저장소에 대한 업데이트를 릴리스해야 합니다. CodePush는 사용자가 만드는 각 릴리스(예: v3
)에 대해 "레이블"을 자동으로 생성하여 릴리스 기록 내에서 식별할 수 있도록 합니다.
이 release-cordova
명령은 Cordova 앱의 표준 레이아웃을 이해하기 때문에 이러한 간단한 워크플로를 사용하도록 설정하므로 업데이트를 생성하고 업로드할 파일을 정확히 알 수 있습니다. 또한 유연한 릴리스 전략을 release-cordova
지원하기 위해 이 명령은 업데이트를 최종 사용자에게 배포하는 방법을 사용자 지정할 수 있는 수많은 선택적 매개 변수를 노출합니다(예: 호환되는 이진 버전은 무엇인가요? 릴리스를 필수로 표시해야 하나요?).
# Release a mandatory update with a changelog
appcenter codepush release-cordova -a <ownerName>/MyApp-ios -m --description "Modified the header color"
# Release a dev Android build to 1/4 of your end users
appcenter codepush release-cordova -a <ownerName>/MyApp-android --rollout 25
# Release an update that targets users running any 1.1.* binary, as opposed to
# limiting the update to exact version name in the config.xml file
appcenter codepush release-cordova -a <ownerName>/MyApp-android --target-binary-version "~1.1.0"
# Release the update now but mark it as disabled
# so that no users can download it yet
appcenter codepush release-cordova -a <ownerName>/MyApp-ios -x
CodePush 클라이언트는 차등 업데이트를 지원하므로 모든 업데이트에서 앱 코드를 릴리스하더라도 최종 사용자는 필요한 파일만 실제로 다운로드합니다. 이 서비스는 이를 자동으로 처리하므로 멋진 앱을 만드는 데 집중할 수 있으며 최종 사용자 다운로드를 최적화하는 것에 대해 걱정할 수 있습니다.
명령의 작동 방식과 명령이 release-cordova
노출하는 다양한 매개 변수에 대한 자세한 내용은 CLI 문서를 참조하세요. 또한 명령 실행을 cordova prepare
직접 처리하려는 경우 보다 release-cordova
훨씬 더 유연한 솔루션을 원하는 경우 자세한 내용은 명령을 참조 release
하세요.
문제가 발생하거나 질문/의견/피드백이 있는 경우 전자 메일을 보내거나 이 리포지토리에서 새 문제를 열 수 있으며 최대한 빨리 응답하겠습니다. 도움말 및 피드백도 참조하세요.
API 참조
CodePush API는 이벤트가 발생한 후 사용할 수 있는 전역 codePush
개체를 통해 앱에 deviceready
노출됩니다. 이 API는 다음과 같은 최상위 메서드를 노출합니다.
- checkForUpdate: 구성된 앱 배포에 사용 가능한 업데이트가 있는지 여부를 CodePush 서비스에 요청합니다.
- getCurrentPackage: 현재 설치된 업데이트(예: 설명, 설치 시간, 크기)에 대한 메타데이터를 검색합니다.
- getPendingPackage: 다운로드 및 설치되었지만 다시 시작을 통해 아직 적용되지 않은 업데이트(있는 경우)에 대한 메타데이터를 검색합니다.
- notifyApplicationReady: 설치된 업데이트가 성공한 것으로 간주됨을 CodePush 런타임에 알립니다. 업데이트를 수동으로 확인하고 설치하는 경우(즉, 동기화 메서드를 사용하여 모든 작업을 처리하지 않음) 이 메서드 를 호출해야 합니다 . 그렇지 않으면 CodePush는 업데이트를 실패한 것으로 처리하고 앱이 다음에 다시 시작될 때 이전 버전으로 롤백합니다.
- restartApplication: 앱을 즉시 다시 시작합니다. 보류 중인 업데이트가 있는 경우 최종 사용자에게 즉시 표시됩니다.
- 동기화: 업데이트를 확인하고, 다운로드하고, 설치할 수 있으며, 모두 한 번의 호출로 가능합니다. 사용자 지정 UI 또는 동작이 필요하지 않는 한 대부분의 개발자는 CodePush를 앱에 통합할 때 이 방법을 사용하는 것이 좋습니다.
또한 다음 개체와 열거형은 CodePush API의 일부로 전역적으로 노출됩니다.
- InstallMode: 업데이트에 사용할 수 있는 설치 모드를 정의합니다.
- LocalPackage: 로컬로 설치된 패키지에 대한 정보를 포함합니다.
- RemotePackage: 다운로드할 수 있는 업데이트 패키지에 대한 정보를 포함합니다.
- SyncStatus: 동기화 작업의 가능한 중간 및 결과 상태를 정의합니다.
codePush.checkForUpdate
codePush.checkForUpdate(onSuccess, onError?, deploymentKey?: String);
CodePush 서비스를 쿼리하여 구성된 앱 배포에 사용 가능한 업데이트가 있는지 확인합니다. 기본적으로 config.xml 파일에 구성된 배포 키를 사용하지만 선택적 deploymentKey
매개 변수를 통해 값을 지정하여 재정의할 수 있습니다. 이 기능은 부활절 달걀 또는 사용자 설정 스위치를 통해 "조기 액세스"를 허용하는 등 사용자를 특정 배포로 동적으로 "리디렉션"하려는 경우에 유용할 수 있습니다.
업데이트 검사가 완료되면 가능한 두 값 중 하나를 사용하여 콜백을 트리거 onUpdateCheck
합니다.
null
사용할 수 있는 업데이트가 없으면 이 문제는 다음 시나리오에서 발생합니다.- 구성된 배포에는 릴리스가 포함되어 있지 않으므로 업데이트할 내용이 없습니다.
- 구성된 배포 내의 최신 릴리스는 현재 실행 중인 버전(이전 버전 또는 최신 버전)과 다른 이진 버전을 대상으로 합니다.
- 현재 실행 중인 앱에는 구성된 배포의 최신 릴리스가 이미 있으므로 다시 릴리스가 필요하지 않습니다.
RemotePackage
검사하고 나중에 다운로드할 수 있는 사용 가능한 업데이트를 나타내는 인스턴스입니다.
매개 변수:
- onSuccess: 서버에서 성공적인 응답을 받으면 호출되는 콜백입니다. 콜백은 위에서 설명한 단일 매개 변수를 받습니다.
- onError: 오류 발생 시 호출되는 선택적 콜백입니다. 콜백은 오류의 세부 정보를 포함하는 하나의 오류 매개 변수를 사용합니다.
- deploymentKey: config.xml 설정을 재정의하는 선택적 배포 키입니다.
예제 사용법:
codePush.checkForUpdate(function (update) {
if (!update) {
console.log("The app is up to date.");
} else {
console.log("An update is available! Should we download it?");
}
});
codePush.getCurrentPackage
codePush.getCurrentPackage(onSuccess, onError?);
현재 설치된 "패키지"(예: 설명, 설치 시간)에 대한 메타데이터를 검색합니다. 이 기능은 업데이트가 적용된 후 "새로운 기능?" 대화 상자를 표시하거나 다시 시작 또는 다시 시작을 통해 적용되기를 기다리는 보류 중인 업데이트가 있는지 확인하는 등의 시나리오에 유용할 수 있습니다.
업데이트 검색이 완료되면 가능한 두 값 중 하나를 사용하여 콜백을 트리거 onSuccess
합니다.
null
앱이 CodePush 업데이트가 아닌 이진 파일에서 HTML 시작 페이지를 현재 실행 중인 경우 이 문제는 다음 시나리오에서 발생합니다.- 최종 사용자가 앱 이진 파일을 설치했으며 CodePush 업데이트를 아직 설치하지 않았습니다.
- 최종 사용자는 이전 CodePush 업데이트를 지우고 이진 파일에 우선 순위를 부여한 이진 파일(예: 저장소에서)의 업데이트를 설치했습니다.
LocalPackage
현재 실행 중인 CodePush 업데이트의 메타데이터를 나타내는 인스턴스입니다.
매개 변수:
- onSuccess: 현재 실행 중인 업데이트에 대한 메타데이터를 수신할 때 호출되는 콜백입니다. 콜백은 위에서 설명한 단일 매개 변수를 받습니다.
- onError: 오류 발생 시 호출되는 선택적 콜백입니다. 콜백은 오류의 세부 정보를 포함하는 하나의 오류 매개 변수를 사용합니다.
사용 예:
codePush.getCurrentPackage(function (update) {
if (!update) {
console.log("No updates have been installed");
return;
}
// If the current app "session" represents the first time
// this update has run, and it had a description provided
// with it upon release, let's show it to the end user
if (update.isFirstRun && update.description) {
// Display a "what's new?" modal
}
});
codePush.getPendingPackage
codePush.getPendingPackage(onSuccess, onError?);
현재 보류 중인 업데이트에 대한 메타데이터를 가져옵니다(있는 경우). 업데이트가 다운로드 및 설치되었지만 앱 다시 시작을 통해 아직 적용되지 않은 경우 "보류 중"으로 간주됩니다. 업데이트는 호출 sync
시 LocalPackage.install
또는 InstallMode.ON_NEXT_RESUME
지정된 경우에만 InstallMode.ON_NEXT_RESTART
이 상태일 수 있으며 앱이 아직 다시 시작되거나 다시 시작되지 않았습니다(각각). 이 메서드는 보류 중인 업데이트가 있는지 여부를 확인한 다음, 즉시(통해 codePush.restartApplication
) 다시 시작하여 적용할지 묻는 메시지를 표시하려는 경우에 유용할 수 있습니다.
업데이트 검색이 완료되면 가능한 두 값 중 하나를 사용하여 콜백을 트리거 onSuccess
합니다.
null
앱에 현재 보류 중인 업데이트가 없으면(예: 앱이 이미 사용 가능한 최신 버전을 실행하고 있음)LocalPackage
현재 보류 중인 CodePush 업데이트의 메타데이터를 나타내는 인스턴스입니다.
매개 변수:
- onSuccess: 현재 보류 중인 업데이트에 대한 메타데이터를 수신할 때 호출되는 콜백입니다. 콜백은 위에서 설명한 단일 매개 변수를 받습니다.
- onError: 오류 발생 시 호출되는 선택적 콜백입니다. 콜백은 오류의 세부 정보를 포함하는 하나의 오류 매개 변수를 사용합니다.
사용 예:
codePush.getPendingPackage(function (update) {
if (update) {
// An update is currently pending, ask the
// user if they want to restart
}
});
codePush.notifyApplicationReady
codePush.notifyApplicationReady(notifySucceeded?, notifyFailed?);
새로 설치된 업데이트를 성공으로 간주하여 자동 클라이언트 쪽 롤백이 필요하지 않도록 CodePush 런타임에 알릴 수 있습니다. 업데이트된 번들의 코드 어딘가에서 이 함수를 호출해야 합니다. 그렇지 않은 경우 앱이 다음에 다시 시작되면 CodePush 런타임은 설치된 업데이트가 실패했다고 가정하고 이전 버전으로 롤백합니다. 이 동작은 최종 사용자가 끊어진 업데이트로 인해 차단되지 않도록 하기 위해 존재합니다.
함수를 sync
사용하고 앱 시작 시 업데이트 검사를 수행하는 경우 자동으로 호출되므로 수동으로 호출 notifyApplicationReady
sync
할 필요가 없습니다. 이 동작은 앱에서 호출되는 경우 sync
성공적인 시작의 근사치를 나타낸다는 가정 때문에 존재합니다.
매개 변수:
- notifySucceeded: 플러그 인이 성공적으로 알림을 받은 경우 호출되는 선택적 콜백입니다.
- notifyFailed: 플러그 인에 알리는 오류가 있는 경우 선택적 콜백이 호출됩니다.
codePush.restartApplication
codePush.restartApplication();
앱을 즉시 다시 시작합니다. 이 메서드는 고급 시나리오를 위한 것이며, 다음 조건이 충족될 때 주로 유용합니다.
- 앱이 설치 모드 값을
ON_NEXT_RESTART
지정하거나 메서드ON_NEXT_RESUME
LocalPackage.install
를 호출할sync
때 지정합니다. 앱이 다시 시작되거나(최종 사용자 또는 OS에서) 다시 시작될 때까지 업데이트가 적용되지 않으므로 업데이트가 최종 사용자에게 즉시 표시되지 않습니다. - 앱별 사용자 이벤트(예: 최종 사용자가 앱의 홈 경로로 다시 이동)를 통해 눈에 거슬리지 않는 방식으로 업데이트를 적용할 수 있으며, 다음 다시 시작 또는 다시 시작할 때까지 기다리는 것보다 빨리 최종 사용자 앞에서 업데이트를 받을 수 있습니다.
codePush.sync
codePush.sync(syncCallback?, syncOptions?, downloadProgress?, syncErrback?);
앱의 코드와 이미지를 구성된 배포에 대한 최신 릴리스와 동기화합니다. 업데이트가 checkForUpdate
있는지 확인하고 다음에 수행할 작업을 제어할 수 있는 메서드와 달리 업데이트 검사, sync
다운로드 및 설치 환경을 처리합니다.
이 메서드는 서로 다른 요구 사항이 있는 앱을 쉽게 사용하도록 설정하는 두 가지(사용자 지정 가능한) "모드"를 지원합니다.
- 자동 모드(기본 동작)는 사용 가능한 업데이트를 자동으로 다운로드하고 다음에 앱을 다시 시작할 때 적용합니다(예: OS 또는 최종 사용자가 종료했거나 디바이스가 다시 시작됨). 이렇게 하면 업데이트 프롬프트 또는 "가상" 앱이 다시 시작되지 않으므로 전체 업데이트 환경이 최종 사용자에게 "자동"입니다.
- 업데이트를 사용할 수 있는 활성 모드는 다운로드하기 전에 최종 사용자에게 사용 권한을 묻는 메시지를 표시한 다음 즉시 업데이트를 적용합니다. 필수 플래그를 사용하여 업데이트가 릴리스된 경우 최종 사용자에게 업데이트에 대한 알림이 계속 표시되지만 무시할 수 있는 선택은 없습니다.
사용 예:
// Fully silent update that keeps the app in
// sync with the server, without ever
// interrupting the end user
codePush.sync();
// Active update that lets the end user know
// about each update, and displays it to them
// immediately after downloading it
codePush.sync(null, { updateDialog: true, installMode: InstallMode.IMMEDIATE });
팁
최종 사용자의 디바이스 배터리 수준, 네트워크 조건 등에 따라 사용 가능한 업데이트를 확인하거나 다운로드할지 여부를 결정하려면 호출을 동기화할 때 원하는 경우에만 호출하도록 하는 조건으로 래핑합니다.
동기화 메서드는 구성이 거의 없는 자동 및 활성 업데이트를 쉽게 수행하려고 하지만 위에서 언급한 기본 동작의 다양한 측면을 사용자 지정할 수 있는 다음과 같은 선택적 매개 변수를 허용합니다.
- syncCallback: 전체 업데이트 프로세스에서 동기화 프로세스가 한 단계에서 다른 단계로 이동할 때 호출됩니다. 메서드는 현재 상태를 나타내는 상태 코드와 함께 호출되며 값이
SyncStatus
될 수 있습니다. - syncOptions: 동기화 작업의 동작을 구성하는 선택적
SyncOptions
매개 변수입니다. - downloadProgress: CodePush 서버에서 사용 가능한 업데이트를 다운로드할 때 주기적으로 호출됩니다. 메서드는 다음 두 속성을 포함하는 개체를 사용하여 호출
DownloadProgress
됩니다.- totalBytes(Number) - 이 업데이트에 대해 수신될 것으로 예상되는 총 바이트 수(예: 이전 릴리스에서 변경된 파일 집합의 크기)입니다.
- receivedBytes(숫자) - 다운로드 진행률을 추적하는 데 사용할 수 있는 지금까지 다운로드한 바이트 수입니다.
- syncErrback: 동기화 내부 단계에 오류가 있을 때 호출됩니다. 이 메서드는 표준 javascript
Error
개체를 첫 번째 인수로 사용하여 호출됩니다.
SyncOptions
이 메서드는 sync
구성이 거의 없는 자동 및 활성 업데이트를 쉽게 수행하려고 하지만 위에서 언급한 기본 동작의 다양한 측면을 사용자 지정할 수 있는 "options" 개체를 허용합니다.
- deploymentKey(String) - 업데이트를 쿼리할 배포 키를 지정합니다. 기본적으로 이 값은 config.xml 파일에서 파생되지만 이 옵션을 사용하면 특정 호출에 다른 배포를 동적으로 사용해야 하는 경우 스크립트 쪽에서 재정의할 수
sync
있습니다. - installMode(InstallMode) - 선택적 업데이트(즉, 필수로 표시되지 않은 업데이트)를 설치하려는 경우를 지정합니다. 기본값은
InstallMode.ON_NEXT_RESTART
입니다.InstallMode
사용 가능한 옵션 및 해당 옵션에 대한 설명은 열거형 참조를 참조하세요. - mandatoryInstallMode(InstallMode) - 필수로 표시된 업데이트를 설치할 시기를 지정합니다. 기본값은
InstallMode.IMMEDIATE
입니다.InstallMode
사용 가능한 옵션 및 해당 옵션에 대한 설명은 열거형 참조를 참조하세요. - minimumBackgroundDuration(숫자) - 앱을 다시 시작하기 전에 앱이 백그라운드에 있을 최소 시간(초)을 지정합니다. 이 속성은 사용 하 여
InstallMode.ON_NEXT_RESUME
설치 된 업데이트에만 적용 됩니다 및 너무 방해 하지 않고 더 빨리 최종 사용자 앞에 업데이트를 얻기 위해 유용할 수 있습니다. 기본값은0
다시 시작 직후 업데이트를 적용하는 것으로, 백그라운드에 있는 시간이 깁니다. - ignoreFailedUpdates(부울) - 사용 가능한 업데이트가 이전에 설치되어 클라이언트에 롤백된 경우(성공적으로 호출되지 않았기 때문에
notifyApplicationReady
) 무시할지 여부를 지정합니다. 기본값은true
입니다. - updateDialog(UpdateDialogOptions) - 업데이트를 사용할 수 있을 때 확인 대화 상자를 최종 사용자에게 표시할지 여부와 사용할 문자열을 결정하는 데 사용되는 "options" 개체입니다.
null
기본적으로 대화 상자를 사용하지 않도록 설정합니다. 이 값을 임의의true
값으로 설정하면 기본 문자열이 있는 대화 상자가 활성화되고 개체를 이 매개 변수에 전달하면 대화 상자를 사용하도록 설정하고 하나 이상의 기본 문자열을 재정의할 수 있습니다.
다음 목록은 사용 가능한 옵션 및 기본값을 나타냅니다.
- appendReleaseDescription(Boolean) - 최종 사용자에게 표시되는 알림 메시지에 사용 가능한 릴리스에 대한 설명을 추가할지 여부를 나타냅니다. 기본값은
false
입니다. - descriptionPrefix(문자열) - 최종 사용자에게 업데이트 알림을 표시할 때 릴리스 설명 앞에 추가하려는 문자열(있는 경우)을 나타냅니다. 기본값은
" Description: "
입니다. - mandatoryContinueButtonLabel(문자열): 최종 사용자가 필수 업데이트를 설치하기 위해 눌러야 하는 단추에 사용할 텍스트입니다. 기본값은
"Continue"
입니다. - mandatoryUpdateMessage(String) - 업데이트가 필수로 지정된 경우 업데이트 알림의 본문으로 사용되는 텍스트입니다. 기본값은
"An update is available that must be installed."
입니다. - optionalIgnoreButtonLabel(String) - 최종 사용자가 누를 수 있는 단추에 사용할 텍스트로, 사용 가능한 선택적 업데이트를 무시합니다. 기본값은
"Ignore"
입니다. - optionalInstallButtonLabel(문자열) - 최종 사용자가 선택적 업데이트를 설치하기 위해 누를 수 있는 단추에 사용할 텍스트입니다. 기본값은
"Install"
입니다. - optionalUpdateMessage(String) - 업데이트가 선택 사항인 경우 업데이트 알림의 본문으로 사용되는 텍스트입니다. 기본값은
"An update is available. Would you like to install it?"
입니다. *- updateTitle(String) - 최종 사용자에게 표시되는 업데이트 알림의 헤더로 사용되는 텍스트입니다. 기본값은"Update available"
입니다.
사용 예:
// Download the update silently, but install it on
// the next resume, as long as at least 5 minutes
// has passed since the app was put into the background.
codePush.sync(null, { installMode: InstallMode.ON_NEXT_RESUME, minimumBackgroundDuration: 60 * 5 });
// Download the update silently, and install optional updates
// on the next restart, but install mandatory updates on the next resume.
codePush.sync(null, { mandatoryInstallMode: InstallMode.ON_NEXT_RESUME });
// Changing the title displayed in the
// confirmation dialog of an "active" update
codePush.sync(null, { updateDialog: { title: "An update is available!" } });
// Displaying an update prompt that includes the
// description for the CodePush release
codePush.sync(null, {
updateDialog: {
appendReleaseDescription: true,
descriptionPrefix: "\n\nChange log:\n"
},
installMode: InstallMode.IMMEDIATE
});
// Silently check for the update, but
// display a custom downloading UI
// via the SyncStatus and DownloadProgress callbacks
codePush.sync(syncStatus, null, downloadProgress);
function syncStatus(status) {
switch (status) {
case SyncStatus.DOWNLOADING_PACKAGE:
// Show "downloading" modal
break;
case SyncStatus.INSTALLING_UPDATE:
// Hide "downloading" modal
break;
}
}
function downloadProgress(downloadProgress) {
if (downloadProgress) {
// Update "downloading" modal with current download %
//console.log("Downloading " + downloadProgress.receivedBytes + " of " + downloadProgress.totalBytes);
}
}
이 메서드는 sync
업데이트를 확인하려는 모든 위치에서 호출할 수 있습니다. 이벤트 처리기, 단추의 이벤트, click
주기적 타이머의 콜백 또는 요구 사항에 적합한 다른 항목에 있을 deviceready
수 있습니다. 메서드와 checkForUpdate
마찬가지로 네트워크 요청을 실행하여 백그라운드에서 업데이트를 확인하므로 UI 스레드 또는 JavaScript 스레드의 응답성에 영향을 주지 않습니다.
패키지 개체
및 getCurrentPackage
메서드는 checkForUpdate
트리거될 때 "package" 개체에 대한 액세스를 제공하는 성공 콜백을 호출합니다. 패키지는 코드 업데이트와 추가 메타데이터(예: 설명, 필수?)를 나타냅니다. CodePush API는 다음 유형의 패키지를 구분합니다.
LocalPackage
: 이미 실행 중이거나 설치되었으며 앱 다시 시작을 보류 중인 다운로드한 업데이트를 나타냅니다.RemotePackage
: 아직 다운로드되지 않은 CodePush 서버에서 사용 가능한 업데이트를 나타냅니다.
LocalPackage
로컬로 다운로드되었거나 이미 설치된 업데이트에 대한 세부 정보를 포함합니다. 메서드를 호출 codePush.getCurrentPackage
하거나 메서드의 성공 콜백에 제공된 값으로 이 개체의 인스턴스에 대한 참조를 RemotePackage.download
가져올 수 있습니다.
속성
- appVersion: 이 패키지 업데이트가 의도한 애플리케이션의 네이티브 버전입니다. (문자열)
- deploymentKey: 패키지의 배포 키입니다. (문자열)
- description: 업데이트에 대한 설명입니다. 이 값은 업데이트를 릴리스할 때 CLI에서 지정한 값과 동일합니다. (문자열)
- failedInstall: 이 업데이트가 이전에 설치되었지만 롤백되었는지 여부를 나타냅니다. 메서드는
sync
이전에 실패한 업데이트를 자동으로 무시하므로 사용checkForUpdate
중인 경우에만 이 속성에 대해 걱정할 필요가 있습니다. (부울) - isFirstRun: 현재 애플리케이션 실행이 패키지가 적용된 후 첫 번째 애플리케이션 실행인지 여부를 나타내는 플래그입니다. (부울)
- isMandatory: 업데이트가 필수로 간주되는지 여부를 나타냅니다. 업데이트가 릴리스되었을 때 CLI에 지정된 값입니다. (부울)
- label: CodePush 서버에서 업데이트에 자동으로 지정된 내부 레이블(예:
v5
. 이 값은 배포 내에서 업데이트를 고유하게 식별합니다. (문자열) - packageHash: 업데이트의 SHA 해시 값입니다. (문자열)
- packageSize: 업데이트 내에 포함된 코드의 크기(바이트)입니다. (숫자)
메서드
- install(installSuccess, installError, installOptions): 이 패키지를 애플리케이션에 설치합니다.
설치 동작은 제공된
installOptions
에 따라 달라집니다. 기본적으로 업데이트 패키지는 자동으로 설치되고 애플리케이션은 다음 애플리케이션 시작 시 새 콘텐츠와 함께 다시 로드됩니다. 업데이트 후 첫 번째 실행에서 애플리케이션은 호출을codePush.notifyApplicationReady()
기다립니다. 이 호출이 수행되면 설치 작업이 성공한 것으로 간주됩니다. 그렇지 않으면 설치 작업이 실패한 것으로 표시되고 다음 실행 시 애플리케이션이 이전 버전으로 되돌아갑니다.
InstallOptions
설치 작업 동작을 사용자 지정하기 위한 몇 가지 옵션을 정의하는 인터페이스입니다.
- installMode: 설치 작업에 사용되는 InstallMode를 지정하는 데 사용됩니다. 기본값은
InstallMode.ON_NEXT_RESTART
입니다. - mandatoryInstallMode: 패키지가 필수인 경우 설치 작업에 사용되는 InstallMode 를 지정하는 데 사용됩니다. 기본값은
InstallMode.IMMEDIATE
입니다. - minimumBackgroundDuration: installMode인
InstallMode.ON_NEXT_RESUME
경우 업데이트를 다시 시작하기 전에 앱이 백그라운드에 있어야 하는 시간을 지정하는 데 사용됩니다. 기본값은0
입니다.
사용 예:
// App version 1 (current version)
var onError = function (error) {
console.log("An error occurred. " + error);
};
var onInstallSuccess = function () {
console.log("Installation succeeded.");
};
var onPackageDownloaded = function (localPackage) {
// Install regular updates after someone navigates away from the app for more than 2 minutes
// Install mandatory updates after someone restarts the app
localPackage.install(onInstallSuccess, onError, { installMode: InstallMode.ON_NEXT_RESUME, minimumBackgroundDuration: 120, mandatoryInstallMode: InstallMode.ON_NEXT_RESTART });
};
var onUpdateCheck = function (remotePackage) {
if (!remotePackage) {
console.log("The application is up to date.");
} else {
// The hash of each previously reverted package is stored for later use.
// This way, we avoid going into an infinite bad update/revert loop.
if (!remotePackage.failedInstall) {
console.log("A CodePush update is available. Package hash: " + remotePackage.packageHash);
remotePackage.download(onPackageDownloaded, onError);
} else {
console.log("The available update was attempted before and failed.");
}
}
};
window.codePush.checkForUpdate(onUpdateCheck, onError);
//------------------------------------------------
// App version 2 (updated version)
var app = {
onDeviceReady: function () {
// Calling this function is required during the first application run after an update.
// If not called, the application will be reverted to the previous version.
window.codePush.notifyApplicationReady();
// ...
}
}
잘못된 업데이트로부터 보호하는 방법에 대한 예제는 notifyApplicationReady() 설명서를 참조 하세요.
RemotePackage
CodePush 서버에서 다운로드할 수 있는 업데이트에 대한 세부 정보를 포함합니다. 업데이트를 사용할 수 있을 때 메서드를 호출하여 이 개체의 codePush.checkForUpdate
인스턴스에 대한 참조를 가져옵니다. 동기화 API를 사용하는 경우 다운로드 및 설치 프로세스가 자동으로 처리되므로 걱정할 RemotePackage
필요가 없습니다.
속성
이 속성은 RemotePackage
모두 동일한 속성을 상속하지만 추가 속성 LocalPackage
은 하나 더 포함됩니다.
- downloadUrl: 패키지를 다운로드할 수 있는 URL입니다. 이 속성은 고급 사용에
download
만 필요 합니다. 메서드는 자동으로 업데이트 구입을 처리 하므로. (문자열)
메서드
- abortDownload(abortSuccess, abortError): 현재 다운로드 세션(있는 경우)을 중단합니다.
- download(downloadSuccess, downloadError, downloadProgress): CodePush 서비스에서 패키지 업데이트를 다운로드합니다. 콜백은
downloadSuccess
다운로드한 패키지를 나타내는 LocalPackage 인수를 사용하여 호출됩니다. 선택적downloadProgress
콜백은 하나의DownloadProgress
매개 변수를 사용하여 다운로드 진행 중에 여러 번 호출됩니다.
DownloadProgress
업데이트 다운로드 진행률에 대한 정기 업데이트 알림을 보내는 데 사용되는 DownloadProgress 개체의 형식을 정의합니다.
속성
- totalBytes: 다운로드하는 업데이트 패키지의 크기(바이트)입니다. (숫자)
- receivedBytes: 이미 다운로드한 바이트 수입니다. (숫자)
사용 예:
var onError = function (error) {
console.log("An error occurred. " + error);
};
var onPackageDownloaded = function (localPackage) {
console.log("Package downloaded at: " + localPackage.localPath);
// you can now update your application to the downloaded version by calling localPackage.install()
};
var onProgress = function (downloadProgress) {
console.log("Downloading " + downloadProgress.receivedBytes + " of " + downloadProgress.totalBytes + " bytes.");
};
var onUpdateCheck = function (remotePackage) {
if (!remotePackage) {
console.log("The application is up to date.");
} else {
console.log("A CodePush update is available. Package hash: " + remotePackage.packageHash);
remotePackage.download(onPackageDownloaded, onError, onProgress);
}
};
window.codePush.checkForUpdate(onUpdateCheck, onError);
열거형
CodePush API에는 업데이트 환경을 사용자 지정하는 데 사용할 수 있고 개체에서 전역적으로 사용할 수 있는 다음과 같은 "열거형" 개체가 window
포함되어 있습니다.
InstallMode
이 열거형은 설치된 업데이트를 실제로 적용할 때 지정되며 또는 메서드에 sync
LocalPackage.install
전달할 수 있습니다. 여기에는 다음 값이 포함됩니다.
- 직접 실행: 업데이트가 실행 중인 애플리케이션에 즉시 적용됩니다. 애플리케이션은 새 콘텐츠로 즉시 다시 로드됩니다.
- ON_NEXT_RESTART: 업데이트를 설치하려고 하지만 강제로 앱을 다시 시작하지 않음을 나타냅니다. 앱이 "자연스럽게" 다시 시작되면(OS 또는 최종 사용자가 앱을 종료하기 때문에) 업데이트가 원활하게 선택됩니다. 이 값은 자동 업데이트를 수행할 때 적합합니다. 앱이 갑자기 갑자기 다시 시작되면 업데이트가 다운로드되었다는 사실을 깨닫지 못했기 때문에 최종 사용자에게 방해가 될 가능성이 높기 때문에 적합합니다. 이 모드는 메서드와 메서드 모두에
sync
사용되는 기본 모드입니다LocalPackage.install
.
잘못된 업데이트로부터 보호하는 방법에 대한 예제는 notifyApplicationReady() 설명서를 참조 하세요.
RemotePackage
CodePush 서버에서 다운로드할 수 있는 업데이트에 대한 세부 정보를 포함합니다. 업데이트를 사용할 수 있을 때 메서드를 호출하여 이 개체의 codePush.checkForUpdate
인스턴스에 대한 참조를 가져옵니다. 동기화 API를 사용하는 경우 다운로드 및 설치 프로세스가 자동으로 처리되므로 걱정할 RemotePackage
필요가 없습니다.
속성
이 속성은 RemotePackage
모두 동일한 속성을 상속하지만 추가 속성 LocalPackage
은 하나 더 포함됩니다.
- downloadUrl: 패키지를 다운로드할 수 있는 URL입니다. 이 속성은 고급 사용에
download
만 필요 합니다. 메서드는 자동으로 업데이트 구입을 처리 하므로. (문자열)
메서드
- abortDownload(abortSuccess, abortError): 현재 다운로드 세션(있는 경우)을 중단합니다.
- download(downloadSuccess, downloadError, downloadProgress): CodePush 서비스에서 패키지 업데이트를 다운로드합니다. 콜백은
downloadSuccess
다운로드한 패키지를 나타내는 LocalPackage 인수를 사용하여 호출됩니다. 선택적downloadProgress
콜백은 하나의DownloadProgress
매개 변수를 사용하여 다운로드 진행 중에 여러 번 호출됩니다.
DownloadProgress
업데이트 다운로드 진행률에 대한 정기 업데이트 알림을 보내는 데 사용되는 DownloadProgress 개체의 형식을 정의합니다.
# 속성
- totalBytes: 다운로드하는 업데이트 패키지의 크기(바이트)입니다. (숫자)
- receivedBytes: 이미 다운로드한 바이트 수입니다. (숫자)
사용 예:
var onError = function (error) {
console.log("An error occurred. " + error);
};
var onPackageDownloaded = function (localPackage) {
console.log("Package downloaded at: " + localPackage.localPath);
// you can now update your application to the downloaded version by calling localPackage.install()
};
var onProgress = function (downloadProgress) {
console.log("Downloading " + downloadProgress.receivedBytes + " of " + downloadProgress.totalBytes + " bytes.");
};
var onUpdateCheck = function (remotePackage) {
if (!remotePackage) {
console.log("The application is up to date.");
} else {
console.log("A CodePush update is available. Package hash: " + remotePackage.packageHash);
remotePackage.download(onPackageDownloaded, onError, onProgress);
}
};
window.codePush.checkForUpdate(onUpdateCheck, onError);
열거형
CodePush API에는 업데이트 환경을 사용자 지정하는 데 사용할 수 있고 개체에서 전역적으로 사용할 수 있는 다음과 같은 "열거형" 개체가 window
포함되어 있습니다.
InstallMode
이 열거형은 설치된 업데이트를 실제로 적용할 때 지정되며 또는 메서드에 sync
LocalPackage.install
전달할 수 있습니다. 여기에는 다음 값이 포함됩니다.
- 직접 실행: 업데이트가 실행 중인 애플리케이션에 즉시 적용됩니다. 애플리케이션은 새 콘텐츠로 즉시 다시 로드됩니다.
- ON_NEXT_RESTART: 업데이트를 설치하려고 하지만 강제로 앱을 다시 시작하지 않음을 나타냅니다. 앱이 "자연스럽게" 다시 시작되면(OS 또는 최종 사용자가 앱을 종료하기 때문에) 업데이트가 원활하게 선택됩니다. 이 값은 자동 업데이트를 수행할 때 적합합니다. 앱이 갑자기 갑자기 다시 시작되면 업데이트가 다운로드되었다는 사실을 깨닫지 못했기 때문에 최종 사용자에게 방해가 될 가능성이 높기 때문에 적합합니다. 이 모드는 메서드와 메서드 모두에
sync
사용되는 기본 모드입니다LocalPackage.install
. - ON_NEXT_RESUME: 업데이트를 설치하려고 하지만 다음에 최종 사용자가 백그라운드에서 다시 시작할 때까지 앱을 다시 시작하지 않음을 나타냅니다. 이렇게 하면 현재 세션이 중단되지 않지만 다음 자연 다시 시작을 기다리는 것보다 더 빨리 업데이트를 받을 수 있습니다. 이 값은 비침습적 방식으로 다시 시작 시 적용할 수 있는 자동 설치에 적합합니다.
SyncStatus
동기화 작업의 가능한 상태를 정의합니다. 상태 범주에는 중간 및 결과(최종)의 두 가지 범주가 있습니다. 중간 상태는 동기화 작업의 진행 상태를 나타내며 최종 상태가 아닙니다. 결과 상태는 동기화 작업의 최종 상태를 나타냅니다. 모든 동기화 작업은 하나의 결과 상태로 끝나지만 중간 상태는 0개 이상일 수 있습니다.
- UP_TO_DATE: 구성된 배포를 통해 앱이 완전히 최신 상태입니다.
- UPDATE_INSTALLED: 사용 가능한 업데이트가 설치되었으며 콜백 함수가 반환된 직후 또는 다음에
SyncOptions
지정된 항목에InstallMode
따라 앱이 다시 시작/다시 시작될 때 실행됩니다. - UPDATE_IGNORED: 최종 사용자가 무시하도록 선택한 선택적 업데이트가 앱에 있습니다. 이 기능은 사용되는 경우에만 적용됩니다
updateDialog
. - 오류: 작업 중에
sync
오류가 발생했습니다. 서버와 통신하거나 업데이트를 다운로드하거나 압축을 풀 때 오류가 발생할 수 있습니다. 콘솔 로그에는 발생한 일에 대한 자세한 정보가 포함되어야 합니다. 이 경우 업데이트가 적용되지 않았습니다. - IN_PROGRESS: 다른 동기화가 이미 실행 중이므로 이 동기화 시도가 중단되었습니다.
- CHECKING_FOR_UPDATE: CodePush 서버가 업데이트에 대해 쿼리되고 있습니다.
- AWAITING_USER_ACTION: 업데이트를 사용할 수 있으며 최종 사용자에게 확인 대화 상자가 표시되었습니다. 이 기능은 사용되는 경우에만 적용됩니다
updateDialog
. - DOWNLOADING_PACKAGE: CodePush 서버에서 사용 가능한 업데이트를 다운로드하고 있습니다.
- INSTALLING_UPDATE: 사용 가능한 업데이트가 다운로드되어 설치될 예정입니다.
PhoneGap 빌드
이 플러그 인은 PhoneGap Build와 호환되며 Android 및 iOS 빌드를 기본으로 만들 수 있습니다. 그러나 CodePush가 Android에서 이진 콘텐츠의 해시를 계산하려면 PhoneGap Build에서 Gradle을 사용하여 기본 동작이 아닌 앱을 빌드해야 합니다(Ant 사용). 이 문제를 해결하려면 프로젝트의 config.xml 파일에 다음 요소를 요소의 <platform name="android">
자식으로 추가합니다.
<preference name="android-build-tool" value="gradle" />
예제 앱
Cordova 커뮤니티는 시작하는 개발자를 위한 예제로 사용할 수 있는 멋진 오픈 소스 앱을 정중하게 만들었습니다. 다음 목록은 CodePush를 사용하는 OSS Cordova 앱이며 다른 사용자가 서비스를 사용하는 방법을 확인하는 데 사용할 수 있습니다.
- PGDay CodePush 데모 - PhoneGap Day Europe 2016에 사용되는 Rangle.io 의해 만들어진 데모 앱입니다.
참고 항목
CodePush를 사용하여 Cordova 앱을 개발한 경우 오픈 소스입니다. 이 목록에 추가하고 싶습니다.