Cordova 클라이언트 SDK

중요

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 앱을 시작할 수 있습니다.

cordova plugin add cordova-plugin-code-push@latest

CodePush 플러그 인이 설치된 상태에서 다음 단계를 통해 사용하도록 앱을 구성합니다.

  1. 배포 키를 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)를 잡을 수 있습니다.

중요

위의 샘플에서 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>

각 플랫폼에 대해 동일한 프라이빗/공개 키 쌍을 사용할 수 있습니다.

  1. 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" />
  1. 앱이 CSP 규격 플랫폼의 CodePush 서버에 액세스할 수 있도록 파일의 Content-Security-Policymeta 태그에 를 추가 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 *" />
  1. 마지막으로 플러그 인이 이미 cordova-plugin-whitelist 설치되어 검사(대부분의 앱은). 이를 검사 다음 명령을 실행합니다.
    cordova plugin ls    

가 목록에 있는 경우 cordova-plugin-whitelist 이동하는 것이 좋습니다. 그렇지 않으면 다음 명령을 실행하여 추가합니다.

    cordova plugin add cordova-plugin-whitelist

이제 애플리케이션 코드에서 플러그 인을 사용할 준비가 되었습니다. 자세한 내용은 예제 및 API 설명서에 대한 샘플 애플리케이션을 참조하세요.

플러그 인 사용량

CodePush 플러그 인을 설치하고 구성하면 다음 정책을 제어하는 데 필요한 코드를 앱에 추가하는 것만 남았습니다.

  1. 언제(그리고 얼마나 자주) 업데이트를 검사? (e.g. app 설정 페이지에서 단추를 클릭하는 것에 대한 응답으로 일부 고정 간격으로 주기적으로 시작)
  2. 업데이트를 사용할 수 있는 경우 최종 사용자에게 업데이트를 제공하는 방법은 무엇인가요? 이 작업을 수행하는 가장 간단한 방법은 앱의 deviceready 이벤트 처리기에서 다음을 실행하는 것입니다.
codePush.sync();

업데이트를 사용할 수 있는 경우 자동으로 다운로드되고 다음에 앱을 다시 시작할 때(최종 사용자 또는 OS에서 명시적으로) 설치되므로 최종 사용자에게 가장 침습적인 환경이 최소화됩니다. 사용 가능한 업데이트가 필수인 경우 즉시 설치되어 최종 사용자가 가능한 한 빨리 업데이트를 받을 수 있도록 합니다.

앱이 업데이트를 더 빨리 검색하도록 하려면 앱 시작 동작의 일부로 다음 코드(또는 이와 동등한 코드)를 추가하여 앱이 백그라운드에서 다시 시작될 때마다 를 호출 sync 하도록 선택할 수도 있습니다. 원하는 만큼 자주 호출 sync 할 수 있으므로 언제 어디서 호출하느냐는 개인적인 선호도에 따라 달라집니다.

document.addEventListener("resume", function () {
    codePush.sync();
});

또한 업데이트 확인 대화 상자("활성 설치")를 표시하거나, 사용 가능한 업데이트를 설치할 때(예: 즉시 다시 시작) 구성하거나, 어떤 방식으로든 업데이트 환경을 사용자 지정하려면 이 기본 동작을 조정하는 방법에 대한 자세한 내용은 메서드의 API 참조를 참조 sync 하세요.

중요

Apple의 개발자 계약은 JavaScript 및 자산의 무선 업데이트를 완전히 허용하지만(CodePush!를 사용하도록 설정하는 것은) 앱이 업데이트 프롬프트를 표시하는 정책에 위배됩니다. 따라서 App Store 분산 앱은 를 호출sync할 때 옵션을 사용하도록 설정 updateDialog 하지 않는 것이 좋습니다. 반면 Google Play 및 내부적으로 분산된 앱(예: Enterprise, Fabric, HockeyApp)은 이 옵션을 사용/사용자 지정하도록 선택할 수 있습니다.

업데이트 릴리스

앱이 구성되고 사용자에게 배포되고 코드 또는 자산을 변경한 후에는 즉시 릴리스할 차례입니다. 이 작업을 수행하는 가장 간단한(권장) 방법은 CodePush CLI에서 명령을 사용하는 release-cordova 것입니다. 이 명령은 CodePush 서버에 대한 업데이트 준비 및 릴리스를 처리합니다.

참고

업데이트 릴리스를 시작하기 전에 명령을 실행 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: 앱을 즉시 다시 시작합니다. 보류 중인 업데이트가 있는 경우 최종 사용자에게 즉시 표시됩니다.
  • sync: 업데이트를 확인하고, 다운로드하고, 설치할 수 있으며, 모두 한 번의 호출로 수행할 수 있습니다. 사용자 지정 UI 또는 동작이 필요하지 않는 한 대부분의 개발자는 CodePush를 앱에 통합할 때 이 방법을 사용하는 것이 좋습니다.

또한 다음 개체와 열거형은 CodePush API의 일부로 전역적으로도 노출됩니다.

  • InstallMode: 업데이트에 사용할 수 있는 설치 모드를 정의합니다.
  • LocalPackage: 로컬로 설치된 패키지에 대한 정보를 포함합니다.
  • RemotePackage: 다운로드할 수 있는 업데이트 패키지에 대한 정보를 포함합니다.
  • SyncStatus: 동기화 작업의 가능한 중간 및 결과 상태를 정의합니다.

codePush.checkForUpdate

codePush.checkForUpdate(onSuccess, onError?, deploymentKey?: String);

CodePush 서비스를 쿼리하여 구성된 앱 배포에 사용 가능한 업데이트가 있는지 확인합니다. 기본적으로 config.xml파일에 구성된 배포 키를 사용하지만 선택적 deploymentKey 매개 변수를 통해 값을 지정하여 재정의할 수 있습니다. 이 기능은 부활절 달걀 또는 사용자 설정 스위치를 통해 "조기 액세스"를 허용하는 등 사용자를 특정 배포로 동적으로 "리디렉션"하려는 경우에 유용할 수 있습니다.

업데이트 검사 완료되면 가능한 두 값 중 하나를 사용하여 콜백을 트리거 onUpdateCheck 합니다.

  1. null 사용할 수 있는 업데이트가 없으면 입니다. 이 문제는 다음 시나리오에서 발생합니다.
    • 구성된 배포에는 릴리스가 없으므로 업데이트할 내용이 없습니다.
    • 구성된 배포 내의 최신 릴리스는 현재 실행 중인 버전(이전 버전 또는 최신 버전)과 다른 이진 버전을 대상으로 합니다.
    • 현재 실행 중인 앱에는 구성된 배포의 최신 릴리스가 이미 있으므로 릴리스가 다시 필요하지 않습니다.
  2. RemotePackage 검사하고 나중에 다운로드할 수 있는 사용 가능한 업데이트를 나타내는 instance.

매개 변수

  • 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 합니다.

  1. null 앱이 현재 CodePush 업데이트가 아닌 이진 파일에서 HTML 시작 페이지를 실행하고 있으면 입니다. 이 문제는 다음 시나리오에서 발생합니다.
    • 최종 사용자가 앱 이진 파일을 설치했으며 아직 CodePush 업데이트를 설치하지 않았습니다.
    • 최종 사용자는 이전 CodePush 업데이트를 지우고 이진 파일에 우선 순위를 부여한 이진 파일(예: 저장소에서)의 업데이트를 설치했습니다.
  2. LocalPackage 현재 실행 중인 CodePush 업데이트의 메타데이터를 나타내는 instance.

매개 변수

  • 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?);

현재 보류 중인 업데이트에 대한 메타데이터를 가져옵니다(있는 경우). 업데이트가 다운로드 및 설치되었지만 앱 다시 시작을 통해 아직 적용되지 않은 경우 "보류 중"으로 간주됩니다. 또는 LocalPackage.install을 호출 sync 할 때 또는 InstallMode.ON_NEXT_RESUME 가 지정되고 앱이 아직 다시 시작되거나 다시 시작되지 않은 경우에만 InstallMode.ON_NEXT_RESTART 업데이트가 이 상태에 있을 수 있습니다(각각). 이 메서드는 보류 중인 업데이트가 있는지 여부를 확인한 다음 사용자에게 즉시(를 통해 codePush.restartApplication) 다시 시작하여 적용할지 묻는 메시지를 표시하려는 경우에 유용할 수 있습니다.

업데이트 검색이 완료되면 가능한 두 값 중 하나를 사용하여 콜백을 트리거 onSuccess 합니다.

  1. null 앱에 현재 보류 중인 업데이트가 없는 경우(예: 앱이 이미 사용 가능한 최신 버전을 실행하고 있음)
  2. LocalPackage 현재 보류 중인 CodePush 업데이트의 메타데이터를 나타내는 instance.

매개 변수

  • 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 사용하고 앱 시작 시 업데이트 검사 수행하는 경우 이 함수를 호출하므로 수동으로 호출 notifyApplicationReadysync 할 필요가 없습니다. 이 동작은 앱에서 가 호출되는 경우 sync 성공적인 시작의 근사치를 나타낸다는 가정 때문에 존재합니다.

매개 변수

  • notifySucceeded: 플러그 인에 성공적으로 알림이 표시되면 호출되는 선택적 콜백입니다.
  • notifyFailed: 플러그 인에 알리는 오류가 있는 경우 호출되는 선택적 콜백입니다.

codePush.restartApplication

codePush.restartApplication();

앱을 즉시 다시 시작합니다. 이 메서드는 고급 시나리오를 위한 것이며, 다음 조건이 충족될 때 주로 유용합니다.

  1. 앱이 또는 LocalPackage.install 메서드를 호출 sync 할 때 또는 ON_NEXT_RESUMEON_NEXT_RESTART 설치 모드 값을 지정합니다. 이렇게 하면 앱이 다시 시작되거나(최종 사용자 또는 OS에서) 다시 시작될 때까지 업데이트가 적용되지 않으므로 업데이트가 최종 사용자에게 즉시 표시되지 않습니다.
  2. 앱별 사용자 이벤트(예: 최종 사용자가 앱의 홈 경로로 다시 이동)를 통해 눈에 거슬리지 않는 방식으로 업데이트를 적용할 수 있으며, 다음 다시 시작 또는 다시 시작할 때까지 기다리지 않고 최종 사용자 앞에서 업데이트를 받을 수 있습니다.

codePush.sync

codePush.sync(syncCallback?, syncOptions?, downloadProgress?, syncErrback?);

앱의 코드 및 이미지를 최신 릴리스와 구성된 배포와 동기화합니다. 업데이트가 checkForUpdate 있는지 확인하고 다음에 sync 수행할 작업을 제어할 수 있는 메서드와 달리 업데이트 검사, 다운로드 및 설치 환경을 처리합니다.

이 메서드는 서로 다른 요구 사항이 있는 앱을 쉽게 사용하도록 설정하는 두 가지 (사용자 지정 가능한) "모드"를 지원합니다.

  1. 자동 모드(기본 동작)는 사용 가능한 업데이트를 자동으로 다운로드하고 다음에 앱을 다시 시작할 때 적용합니다(예: OS 또는 최종 사용자가 종료했거나 디바이스가 다시 시작됨). 이렇게 하면 업데이트 프롬프트 또는 "가상" 앱이 다시 시작되지 않으므로 전체 업데이트 환경은 최종 사용자에게 "자동"입니다.
  2. 업데이트를 사용할 수 있는 활성 모드는 다운로드하기 전에 최종 사용자에게 사용 권한을 묻는 메시지를 표시한 다음 즉시 업데이트를 적용합니다. 필수 플래그를 사용하여 업데이트가 릴리스된 경우 최종 사용자에게 업데이트에 대한 알림이 계속 표시되지만 무시할 수 없습니다.

사용 예:

// 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(Number) - 다운로드 진행률을 추적하는 데 사용할 수 있는 지금까지 다운로드한 바이트 수입니다.
  • syncErrback: 동기화 내부 단계에 오류가 있을 때 호출됩니다. 메서드는 표준 javascript Error 개체를 첫 번째 인수로 사용하여 호출됩니다.

SyncOptions

메서드는 sync 구성이 거의 없는 자동 및 활성 업데이트를 쉽게 수행하려고 하지만 위에서 언급한 기본 동작의 다양한 측면을 사용자 지정할 수 있는 "options" 개체를 허용합니다.

  • deploymentKey(String) - 업데이트를 쿼리할 배포 키를 지정합니다. 기본적으로 이 값은 config.xml 파일에서 파생되지만, 특정 호출에 다른 배포를 동적으로 사용해야 하는 경우 스크립트 쪽에서 재정의할 sync수 있습니다.
  • installMode(InstallMode) - 선택적 업데이트(즉, 필수로 표시되지 않은 업데이트)를 설치할 시기를 지정합니다. 기본값은 InstallMode.ON_NEXT_RESTART입니다. InstallMode 사용 가능한 옵션 및 작업에 대한 설명은 열거형 참조를 참조하세요.
  • mandatoryInstallMode(InstallMode) - 필수로 표시된 업데이트를 설치할 시기를 지정합니다. 기본값은 InstallMode.IMMEDIATE입니다. InstallMode 사용 가능한 옵션 및 작업에 대한 설명은 열거형 참조를 참조하세요.
  • minimumBackgroundDuration(Number) - 앱을 다시 시작하기 전에 앱이 백그라운드에 있을 최소 시간(초)을 지정합니다. 이 속성은 를 사용하여 InstallMode.ON_NEXT_RESUME설치된 업데이트에만 적용되며 너무 눈에 띄지 않고 최종 사용자 앞에서 업데이트를 더 빨리 가져오는 데 유용할 수 있습니다. 기본값은 로 설정 0되며, 이는 다시 시작 직후 업데이트를 적용합니다. 단, 백그라운드에 있는 기간은 입니다.
  • ignoreFailedUpdates(Boolean) - 이전에 클라이언트에 설치되고 롤백된 경우(성공적으로 호출되지 않았기 때문에 notifyApplicationReady ) 사용 가능한 업데이트를 무시할지 여부를 지정합니다. 기본값은 true입니다.
  • updateDialog(UpdateDialogOptions) - 업데이트를 사용할 수 있을 때 최종 사용자에게 확인 대화 상자를 표시할지 여부와 사용할 문자열을 결정하는 데 사용되는 "옵션" 개체입니다. 기본값은 null대화 상자를 사용하지 않도록 설정하는 입니다. 이 값을 임의의 true 값으로 설정하면 기본 문자열이 있는 대화 상자가 활성화되고 개체를 이 매개 변수에 전달하면 대화 상자를 사용하도록 설정하고 하나 이상의 기본 문자열을 재정의할 수 있습니다.

다음 목록은 사용 가능한 옵션 및 기본값을 나타냅니다.

  • appendReleaseDescription(Boolean) - 최종 사용자에게 표시되는 알림 메시지에 사용 가능한 릴리스에 대한 설명을 추가할지 여부를 나타냅니다. 기본값은 false입니다.
  • descriptionPrefix(String) - 최종 사용자에게 업데이트 알림을 표시할 때 릴리스 설명을 접두사로 지정할 문자열(있는 경우)을 나타냅니다. 기본값은 " Description: "입니다.
  • mandatoryContinueButtonLabel(String): 최종 사용자가 필수 업데이트를 설치하기 위해 눌러야 하는 단추에 사용할 텍스트입니다. 기본값은 "Continue"입니다.
  • mandatoryUpdateMessage(String) - 업데이트가 필수로 지정된 경우 업데이트 알림의 본문으로 사용되는 텍스트입니다. 기본값은 "An update is available that must be installed."입니다.
  • optionalIgnoreButtonLabel(String) - 최종 사용자가 누를 수 있는 단추에 사용할 텍스트로, 사용 가능한 선택적 업데이트를 무시합니다. 기본값은 "Ignore"입니다.
  • optionalInstallButtonLabel(String) - 최종 사용자가 선택적 업데이트를 설치하기 위해 누를 수 있는 단추에 사용할 텍스트입니다. 기본값은 "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 트리거될 때 "패키지" 개체에 대한 액세스를 제공하는 성공 콜백을 호출합니다. 패키지는 코드 업데이트와 추가 메타데이터(예: 설명, 필수?)를 나타냅니다. CodePush API는 다음 유형의 패키지를 구분합니다.

  1. LocalPackage: 이미 실행 중이거나 설치되어 있고 앱 다시 시작을 보류 중인 다운로드한 업데이트를 나타냅니다.
  2. RemotePackage: 아직 다운로드되지 않은 CodePush 서버에서 사용 가능한 업데이트를 나타냅니다.

LocalPackage

로컬로 다운로드되었거나 이미 설치된 업데이트에 대한 세부 정보를 포함합니다. 메서드를 호출 codePush.getCurrentPackage 하거나 메서드의 성공 콜백에 제공된 값으로 이 개체의 instance 대한 참조를 RemotePackage.download 가져올 수 있습니다.

속성
  • appVersion: 이 패키지 업데이트가 의도한 애플리케이션의 네이티브 버전입니다. (문자열)
  • deploymentKey: 패키지의 배포 키입니다. (문자열)
  • description: 업데이트에 대한 설명입니다. 이는 업데이트를 릴리스할 때 CLI에서 지정한 값과 동일합니다. (문자열)
  • failedInstall: 이 업데이트가 이전에 설치되었지만 롤백되었는지 여부를 나타냅니다. 메서드는 sync 이전에 실패한 업데이트를 자동으로 무시하므로 를 사용하는 checkForUpdate경우에만 이 속성에 대해 걱정할 필요가 있습니다. (부울)
  • isFirstRun: 현재 애플리케이션 실행이 패키지가 적용된 후 첫 번째 애플리케이션 실행인지 여부를 나타내는 플래그입니다. (부울)
  • isMandatory: 업데이트가 필수로 간주되는지 여부를 나타냅니다. 업데이트가 릴리스되었을 때 CLI에 지정된 값입니다. (부울)
  • label: CodePush 서버에서 업데이트에 자동으로 지정된 내부 레이블(예: v5)입니다. 이 값은 배포 내에서 업데이트를 고유하게 식별합니다. (문자열)
  • packageHash: 업데이트의 SHA 해시 값입니다. (문자열)
  • packageSize: 업데이트에 포함된 코드의 크기(바이트)입니다. (Number)
메서드
  • install(installSuccess, installError, installOptions): 이 패키지를 애플리케이션에 설치합니다. 설치 동작은 제공된 installOptions에 따라 달라집니다. 기본적으로 업데이트 패키지는 자동으로 설치되고 애플리케이션은 다음 애플리케이션 시작 시 새 콘텐츠와 함께 다시 로드됩니다. 업데이트 후 첫 번째 실행에서 애플리케이션은 호출을 codePush.notifyApplicationReady() 기다립니다. 이 호출이 수행되면 설치 작업이 성공한 것으로 간주됩니다. 그렇지 않으면 설치 작업이 실패한 것으로 표시되고 다음 실행 시 애플리케이션이 이전 버전으로 되돌아갑니다.
InstallOptions

설치 작업 동작을 사용자 지정하기 위한 몇 가지 옵션을 정의하는 인터페이스입니다.

  • installMode: 설치 작업에 사용되는 InstallMode 를 지정하는 데 사용됩니다. 기본값은 InstallMode.ON_NEXT_RESTART입니다.
  • mandatoryInstallMode: 패키지가 필수인 경우 설치 작업에 사용되는 InstallMode 를 지정하는 데 사용됩니다. 기본값은 InstallMode.IMMEDIATE입니다.
  • minimumBackgroundDuration: installModeInstallMode.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 하여 이 개체의 instance 대한 참조를 가져옵니다. 동기화 API를 사용하는 경우 다운로드 및 설치 프로세스가 자동으로 처리되므로 에 대해 RemotePackage걱정할 필요가 없습니다.

속성

RemotePackage 와 동일한 속성을 LocalPackage모두 상속하지만 하나 더 포함됩니다.

  • downloadUrl: 패키지를 다운로드할 수 있는 URL입니다. 이 속성은 메서드가 자동으로 업데이트 획득을 처리하므로 고급 사용에 download 만 필요합니다. (문자열)
메서드
  • abortDownload(abortSuccess, abortError): 현재 다운로드 세션(있는 경우)을 중단합니다.
  • download(downloadSuccess, downloadError, downloadProgress): CodePush 서비스에서 패키지 업데이트를 다운로드합니다. downloadSuccess 콜백은 다운로드한 패키지를 나타내는 LocalPackage 인수를 사용하여 호출됩니다. 선택적 downloadProgress 콜백은 하나의 DownloadProgress 매개 변수를 사용하여 다운로드 진행 중에 여러 번 호출됩니다.
DownloadProgress

업데이트 다운로드 진행률에 대한 정기 업데이트 알림을 보내는 데 사용되는 DownloadProgress 개체의 형식을 정의합니다.

속성
  • totalBytes: 다운로드하는 업데이트 패키지의 크기(바이트)입니다. (Number)
  • receivedBytes: 이미 다운로드한 바이트 수입니다. (Number)

사용 예:

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

이 열거형은 설치된 업데이트를 실제로 적용할 때 지정되며 또는 LocalPackage.install 메서드에 sync 전달할 수 있습니다. 여기에는 다음 값이 포함됩니다.

  • 직접 실행: 업데이트가 실행 중인 애플리케이션에 즉시 적용됩니다. 애플리케이션은 새 콘텐츠로 즉시 다시 로드됩니다.
  • ON_NEXT_RESTART: 업데이트를 설치하려고 하지만 강제로 앱을 다시 시작하지 않음을 나타냅니다. OS 또는 최종 사용자로 인해 앱이 "자연스럽게" 다시 시작되면 업데이트가 원활하게 선택됩니다. 이 값은 자동 업데이트를 수행할 때 적합합니다. 앱이 갑자기 갑자기 다시 시작되면 업데이트가 다운로드되었다는 것을 깨닫지 못했기 때문에 최종 사용자에게 방해가 될 수 있으므로 적합합니다. 및 메서드 모두 syncLocalPackage.install 에 사용되는 기본 모드입니다.

잘못된 업데이트로부터 보호하는 방법에 대한 예제는 notifyApplicationReady() 설명서를 참조하세요.

RemotePackage

CodePush 서버에서 다운로드할 수 있는 업데이트에 대한 세부 정보를 포함합니다. 업데이트를 사용할 수 있을 때 메서드를 호출 codePush.checkForUpdate 하여 이 개체의 instance 대한 참조를 가져옵니다. 동기화 API를 사용하는 경우 다운로드 및 설치 프로세스가 자동으로 처리되므로 에 대해 RemotePackage걱정할 필요가 없습니다.

속성

RemotePackage 와 동일한 속성을 LocalPackage모두 상속하지만 하나 더 포함됩니다.

  • downloadUrl: 패키지를 다운로드할 수 있는 URL입니다. 이 속성은 메서드가 자동으로 업데이트 획득을 처리하므로 고급 사용에 download 만 필요합니다. (문자열)
메서드
  • abortDownload(abortSuccess, abortError): 현재 다운로드 세션(있는 경우)을 중단합니다.
  • download(downloadSuccess, downloadError, downloadProgress): CodePush 서비스에서 패키지 업데이트를 다운로드합니다. downloadSuccess 콜백은 다운로드한 패키지를 나타내는 LocalPackage 인수를 사용하여 호출됩니다. 선택적 downloadProgress 콜백은 하나의 DownloadProgress 매개 변수를 사용하여 다운로드 진행 중에 여러 번 호출됩니다.
DownloadProgress

업데이트 다운로드 진행률에 대한 정기 업데이트 알림을 보내는 데 사용되는 DownloadProgress 개체의 형식을 정의합니다.

# 속성
  • totalBytes: 다운로드하는 업데이트 패키지의 크기(바이트)입니다. (Number)
  • receivedBytes: 이미 다운로드한 바이트 수입니다. (Number)

사용 예:

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

이 열거형은 설치된 업데이트를 실제로 적용할 때 지정되며 또는 LocalPackage.install 메서드에 sync 전달할 수 있습니다. 여기에는 다음 값이 포함됩니다.

  • 직접 실행: 업데이트가 실행 중인 애플리케이션에 즉시 적용됩니다. 애플리케이션은 새 콘텐츠로 즉시 다시 로드됩니다.
  • ON_NEXT_RESTART: 업데이트를 설치하려고 하지만 강제로 앱을 다시 시작하지 않음을 나타냅니다. OS 또는 최종 사용자로 인해 앱이 "자연스럽게" 다시 시작되면 업데이트가 원활하게 선택됩니다. 이 값은 자동 업데이트를 수행할 때 적합합니다. 앱이 갑자기 갑자기 다시 시작되면 업데이트가 다운로드되었다는 것을 깨닫지 못했기 때문에 최종 사용자에게 방해가 될 수 있으므로 적합합니다. 및 메서드 모두 syncLocalPackage.install 에 사용되는 기본 모드입니다.
  • ON_NEXT_RESUME: 업데이트를 설치하려고 하지만 다음에 최종 사용자가 백그라운드에서 다시 시작할 때까지 앱을 다시 시작하지 않음을 나타냅니다. 이렇게 하면 현재 세션을 중단하지는 않지만 다음 자연스러운 다시 시작을 기다리는 것보다 빨리 업데이트를 받을 수 있습니다. 이 값은 비침습적 방식으로 다시 시작 시 적용할 수 있는 자동 설치에 적합합니다.

SyncStatus

동기화 작업의 가능한 상태를 정의합니다. 상태 범주에는 중간 및 결과(최종)의 두 가지 범주가 있습니다. 중간 상태는 동기화 작업의 진행 상태를 나타내며 최종 상태가 아닙니다. 결과 상태는 동기화 작업의 최종 상태를 나타냅니다. 모든 동기화 작업은 하나의 결과 상태 종료되지만 중간 상태가 0개 이상일 수 있습니다.

  • UP_TO_DATE: 앱은 구성된 배포를 통해 완전히 최신 상태입니다.
  • UPDATE_INSTALLED: 사용 가능한 업데이트가 설치되었으며 콜백 함수가 반환된 직후 또는 다음에 지정된 에 따라 InstallModeSyncOptions앱이 다시 시작/다시 시작될 때 실행됩니다.
  • 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 사용). 이 resolve 위해 프로젝트의 config.xml 파일에 다음 요소를 요소의 <platform name="android"> 자식으로 추가합니다.

<preference name="android-build-tool" value="gradle" />

예제 앱

Cordova 커뮤니티는 시작하는 개발자를 위한 예로 사용할 수 있는 멋진 오픈 소스 앱을 정중하게 만들었습니다. 다음 목록은 CodePush를 사용하는 OSS Cordova 앱이며 다른 사용자가 서비스를 사용하는 방법을 확인하는 데 사용할 수 있습니다.

참고

CodePush를 사용하여 Cordova 앱을 개발한 경우 오픈 소스임을 알려주세요. 이 목록에 추가하고 싶습니다!