All 79 versions

Version Release date
5.3.2 March 15, 2018
  • Updated code-push version to fix DoS zip attack
5.3.1 March 14, 2018
  • Fixed bug with run-android on windows
5.3.0 March 13, 2018
  • Android Gradle Plugin 3.x integration
5.2.2 February 26, 2018
  • Documentation improvement
  • Bug fixes
5.2.1 December 05, 2017

React Native Code Push is moved out of beta! Please see this link for more details!


  1. Update Acquisition Code Push package dependency to latest version
5.2.0-beta November 21, 2017

Breaking Changes

  1. UWP: Enable CodePush for react-native-windows v0.50+ Thanks @rozele


  1. Add requiresMainQueueSetup to prevent warning and future side-effects Thanks @djalmaaraujo
  2. Hoist non-react static methods in decorator Thanks @deecewan
5.1.3-beta October 03, 2017

Bug Fixes

  1. Fixed failing signature check on iOS 9.3 #1027
5.1.2-beta September 28, 2017

Bug Fixes

  1. Fix proguard error in Android build (#1018) Thanks @AndrewJack!
  2. Typings: fix order in SyncStatus enum (
5.1.1-beta September 19, 2017


  1. Improve security for CodeSigning feature by using additional integrity check based on hash generated by service in addition to JWT signature hash (hash computed on device should match JWT hash and hash calculated on service) #1005

Bug Fixes

  1. Fix Android dex index overflow exception #1007
  2. Fix postlink script issue related to subsequent scripts run #1003
5.1.0-beta September 14, 2017

New Features and Improvements

  1. Implement Code Signing feature for Android/iOS SDKs. Follow this link for more details.

  2. Restore compatibility with RN v0.46 #980 Thanks @cooperka

Bug Fixes

  1. Fix incorrect long value restoration from strings.xml #956

  2. Fix WPF. Application crashes on startup #973 Thanks @abodalevsky

  3. Fix check if package metadata is null #992 Thanks @AndrewJack

Document Upgrade

  1. Added create-react-native-app information to README #979 Thanks @Zakeelm

  2. Update the debug message for missing bundles #923 Thanks @cooperka

5.0.0-beta August 02, 2017

Breaking Changes

  1. Added support for RN 0.47x versions for Android (#895)

NOTE: Current version of React Native Code Push is compatible with RN 0.47x versions only

Document Upgrade

  1. Clarify store rulings (#936) Thanks @kelset
4.1.0-beta July 20, 2017

New Features and Improvements

  1. Added tvOS target for iOS (#824) Thanks @JulienKode

  2. Added an optional callback function that can be used to notify user if there are any binary updates (#920) Thanks @akki-ng and @disharmonized

Bug Fixes

  1. Fix declaration of "_installMode" to remove warnings (#922) Thanks @newyankeecodeshop

  2. Prevent Rollback crash when binary was updated (#924) Thanks @AndrewJack

Document Upgrade

  1. Added InstallMode.ON_NEXT_SUSPEND option description (#928) Thanks @disharmonized
4.0.0-beta July 11, 2017

Breaking Changes

  1. Added support for RN 0.46x versions for Android (#905)

NOTE: Current version of React Native Code Push is compatible with RN 0.46x versions only

3.0.1-beta July 04, 2017

Bug Fixes

  1. Fixed issue when React native app on Android fails to restart after an update, crashing #910
3.0.0-beta June 28, 2017

Breaking Changes

  1. Current version of React Native Code Push is compatible with RN 0.45x versions only (#901)

Fixes and Improvements

  1. Fix dependency issue with codepush.gradle (#902) Thanks @mikelambert

  2. Improved logic for searching plist path (case when package name is not equal to iOS ProductName) (#903)

  3. [WPF] Fix application crash when storage file was deleted while app is being active. (#897) Thanks @abodalevsky

  4. [WPF:Windows] Added ability to update application installed in Program Files folder (#813) Thanks @abodalevsky

  5. [Windows] Implemented TelemetryManager (#812) Thanks @abodalevsky

  6. Fix typo in resourcesDirConfigName path configuration in codepush.gradle file (#876)

Document Upgrade

  1. Fixed incorrect link reference (#900)

  2. Removed @latest from npm install (#889) Thanks @GantMan

  3. Fixed import example for #import <React/RCTLog.h> (#884) @nerdmed

2.1.1-beta July 04, 2017

Bug Fixes

  1. Fixed issue when React native app on Android fails to restart after an update, crashing #910
2.1.0-beta June 07, 2017

New Features and Improvements

  1. Allow custom node path (#860) Thanks @iacopo87

  2. Use project.ext.react root prop to specify node_modules path (#869)

  3. Improved logic to show error msg dependent on debug/release config (#811)

  4. Improved gradle temp file naming strategy to allow concurrent android builds (#857) Thanks @oliversommer

  5. Avoid to set refs on stateless components (#866) Thanks @farwayer

Bug Fixes

  1. Fixed issue with error on parsing plist path (#842)

  2. Fixed packageHash not passed to /updateCheck on Android (#803) Thanks @jiaminglu

  3. Fixed issue with [Android] restartApp() throwing exception w/ release build (#861)

  4. Fixed return value for get update metadata (#864) Important: return type for getUpdateMetadata was changed to null instead of empty string to be consistent with iOS implementation and docs

  5. Fixed issue with attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference (#795) Thanks @AndrewJack

  6. Fixed [Android] App restart loop when using InstallMode.ON_NEXT_RESUME (#841) Thanks @AndrewJack

Document Upgrade

  1. Improved README doc (#794, #830) Thanks @almirfilho, @MichalRemis
2.0.3-beta May 03, 2017

New Features

  1. Implement new ON_NEXT_SUSPEND install mode (#770) (@sergey-akhalkov)

Bug Fixes

  1. Fix issue when CodePush update crashes silently on iOS #816 (@minhtc)
  2. Bump code-push dependency to fix warnings from yarn regarding node-uuid (#796) (@max-mironov)
  3. Fix issue when CodePush won't install updates if an error occurs in codePushStatusDidChange and downloadProgressCallback methods (#787) (@sergey-akhalkov)
2.0.2-beta April 11, 2017

Bug Fixes

  1. Fixed a couple of new compilation errors that occurred when building iOS app extensions (#783).
2.0.1-beta April 04, 2017

Breaking Changes

Due to platform changes, react-native-code-push@2.x.x will only support react-native@0.43.0 and onwards. Users on react-native@0.42.x and lower should consult our compatibility table to determine the latest react-native-code-push version to install.

New Features

  1. This release adds support for React Native 0.43 (@sergey-akhalkov, @silhouettes, @nihgwu)

Bug Fixes

  1. Fixed state issue where SyncStatus would transition to UP_TO_DATE prior to an update being installed.

  2. Bumped XCode dependency in package.json, bump should eliminate some warning messages

2.0.0-beta April 04, 2017  
1.17.4-beta May 03, 2017

Bug Fixes

  1. Fix issue when CodePush update crashes silently on iOS #816 (@minhtc)
1.17.3-beta March 22, 2017

This is a small bug fix release. Thank you to @ymusiychuk-lohika, @buptkang, @abodalevsky, @max-mironov, @sergey-akhalkov, @timscott and @legalosLOTR for your contributions since the last release!

Bug Fixes (Android)

  1. Fix build issues by reverting Android SDK Build Tools version to 23.0.1, the version specified in the React Native docs.
  2. Address Flow type checking error caused by CodePush hash file being named CodePushHash.json despite not containing JSON.

Bug Fixes (Windows)

  1. Fix an exception caused by the destination folder already existing when unzipping packages.
  2. Fix an exception thrown when the ProcessorID property cannot be determined.

Note that support for react-native@0.43.0 is coming, and will be introduced in v2.0.0-beta!

1.17.2-beta March 02, 2017  
1.17.1-beta February 28, 2017

New Feature

  1. Added React Native Windows dotNet46 support, thanks @abodalevsky and @rozele.

Bug Fixes

  1. (Android) Fixed the issue that the timestamp returned in getBinaryResourcesModifiedTime() always returns 312796800000 (11/30/1979, 12:00:00 AM). Thanks @sergey-akhalkov.
  2. (Both iOS and Android) Fixed the issue that AsyncStorage(get/set...) operation will be blocked while downloading the bundle. Thanks @sergey-akhalkov.
  3. (iOS) Fixed the issue that react-native link bug when using firebase . Thanks @max-mironov.

Document Upgrade

Since the documentation becomes more complex, we decomposed the document to have a better user experience. Thanks @jeremistadler.

1.17.0-beta January 24, 2017

New Features

  1. This release adds support for React Native 0.40.0 (@christopherdro, @sergey-akhalkov, @vladimir-kotikov, @buptkang)
  2. Significantly reduced final size of app once CodePush is integrated (@vladimir-kotikov)

Bug Fixes

  1. Support build for 'Android Plugin for Gradle' versions lower than 1.3.0 (@sergey-akhalkov)
  2. The linking/installation process is now significantly more robust (@matrosov-nikita) to conditions such as:
    1. No iOS or android directory
    2. The main application file is not named
    3. The Info.plist file is not in the same directory as the AppDelegate.m file
    4. The .mm extension is used instead of .m
    5. Single quotes are used in the react.gradle file
1.16.1-beta December 03, 2016

This release fixes a compilation error when integrating CodePush using CocoaPods into a Swift-based iOS app.

1.16.0-beta November 16, 2016

New Features

  1. This release adds support for React Native 0.36.0 (and 0.37.0). For details about issues with using prior versions of CodePush with RN 36/37, please see

Bug Fixes

  1. Fix a possible installation failure when using react-native link on Windows. (@Lughino)
  2. Fetch React Native Android artifacts from the node_modules folder instead of Maven. (@mkonicek)
1.15.1-beta November 04, 2016

Thank you @piyushjo for verifying this release!

Bug Fixes

  1. Fix a comparison check on Android that could cause an issue in the bundle loading behavior on some devices. We highly recommend upgrading to this version if you were previously on react-native-code-push@1.15.0-beta. (@Swordsman-Inaction)
  2. Fix linking errors that may occur when the user has multiple AppDelegate.m files (@hilkeheremans)
  3. Prevent the app's project name from possibly being overriden by CodePush's settings.gradle
1.15.0-beta October 12, 2016

This release improves stability across a wide range of platforms and React Native versions.

New Features

  1. Adds support for both React Native 0.34 and 0.35. Thanks so much for your patience!
  2. Updates will now be downloaded from a CDN to improve performance for users globally. To maintain backwards compatibility for those using a whitelist of approved URL endpoints, this will only apply from this release onwards.
  3. Allows the node_modules path to be overriden in codepush.gradle. Thanks @geof90!

Bug Fixes (iOS)

  1. Uses NativeEventEmitter and RCTEventEmitter instead of the deprecated DeviceEventEmitter. Thanks for kicking this off @Pho3nix!
  2. Adds a class guard in initialize methods to allow for clean sub-classing, and fix a build warning about implicit type conversion. Thanks @daniel-beard!

Bug Fixes (Android)

  1. Fixes a crash that may happen when CodePush.getUpdateMetadata() is called when running against the binary version and an update is pending. Thanks @cmcewen!
  2. Prevents a hash mismatch issue that may sometimes occur due to .DS_Store and __MACOSXfiles generated on OS X (this was previously fixed on iOS only).
  3. Removes unnecessary config from AndroidManifest.xml to fix manifest merging issues. Thanks @felipecsl!

Bug Fixes (Universal Windows Platform)

  1. Fixes an issue where rollbacks can occur erroneously when using InstallMode.SILENT. Thanks @rozele!
  2. Fixes an issue where the app can hang when resuming while using InstallMode.ON_NEXT_RESUME. Thanks @rozele!
  3. Fixes an issue where update check results were being cached for the lifetime of the app. Thanks for diagnosing this @rozele!
  4. Numerous style and code cleanliness improvements, including using best practices for async methods. Thanks @rozele!
1.14.6-beta September 01, 2016

New Features

  1. Adds support for setting a custom ReactNativeHolder via CodePush.setReactInstanceHolder(). This is useful if you're explicitly launching a React Native instance without an Activity (for example, from within a native push notification receiver). For these situations, CodePush must be told how to find your React Native instance in order to execute a forced restart whenever an update is installed. Thanks @igrayson for your contribution!
  2. Exposes isPendingUpdate and isFailedHash publicly on the iOS native API, however these are not documented methods, so they may run the risk being broken by future releases. Thanks @daniel-beard!

Bug Fixes

  1. For android users using React Native v0.32, during forced app restarts, due to changes in React Native internal APIs we would end up using the legacy logic that recreates the current activity, which does not result in the best experience. This is fixed in this release.
  2. Fixes a nil object insertion crash which occurs when a rollback is triggered while there is no current update present.
  3. Prevent crashes caused by NSError nil pointer dereferences throughout the iOS native API. Thanks @daniel-beard!
1.14.5-beta August 19, 2016

Bug Fixes

  1. @CodePush decorator no longer binds lifecycle hooks if root component instance is not ES6 declared, because components declared via React.createClass have their functions autobound by default. Binding them again like how we did previously results in a warning.
  2. Fixed iOS download handler to properly handle HTTP >=400 errors and empty responses. Thanks @ymmuse!
1.14.4-beta August 18, 2016

Bug Fixes

  1. Allows activities hosting the React Native root view that don't extend com.facebook.react.ReactActivity to also use the new loadBundle logic which has a better user experience.
  2. Fixed the hash mismatch happening after a diff update is installed due to .DS_Store files on iOS.
1.14.3-beta August 16, 2016

New Features

  1. This release simply adds the ability the option to specify an NSBundle other than the mainBundle in iOS.

     jsCodeLocation = [CodePush bundleURLForResource:@"main"
                                              bundle:[NSBundle bundleWithIdentifier: customBundleIdentifier]];

    If left unspecified, it will default to [NSBundle mainBundle] as per the original behavior.

1.14.2-beta August 13, 2016

This release improves the linking experience and fixes a bug with not being able to resolve the SoLoader library during runtime.

New Features

  1. react-native link react-native-code-push now automates all of the linking process for you. For Android, it imports the react-native-code-push library project for you and adds the codepush.gradle build step in settings.gradle and android/app/build.gradle, prompts you for your deployment key and modifies the MainApplication / MainActivity java file for you to include the CodePush react package and consult CodePush for the path to the root JS bundle file. For iOS, it similarly also adds the CodePush project to your XCode project, prompts you for your deployment key, adds it to your Info.plist file, and updates your AppDelegate.m file to consult CodePush for the path to your root JS bundle file.

Bug Fixes

  1. Removed the dependency on SoLoader. We earlier relied on it being there as a transitive dependency of React Native, however after the release of React Native 0.31 where it was made an external dependency, there were some reported runtime issues with being unable to resolve the library.
1.14.1-beta August 03, 2016

This release primarily adds a decorator function which can be used to wrap your root component in a higher order component that handles syncing updates with the CodePush server. Refer to the README for ways to use it.

New Features

  1. The default export of react-native-code-push can now also be used as a decorator function which takes in some options and wraps your root component in a higher order "CodePush" component. This component then handles syncing with the server for updates for you. Internally, the higher order component calls codePush.sync() at the right trigger events (e.g. when the app resumes). It also ensures that notifyAppReady() is called when the component mounts, so issues like wouldn't happen.

Going forward, we intend to have this new decorator function be the primary way in which users instrument their app with CodePush instead of calling codePush.sync() directly, although the old method still works and can be used.

1.14.0-beta August 02, 2016  
1.13.6-beta August 02, 2016

This release primarily adds support for overriding the app version used to query for updates, along with a few bug fixes.

New Features (General)

  1. Adds an overrideAppVersion() function that can be used to specify a custom application binary interface version, which would otherwise default to the app store version built into the app. This is an option for advanced users who have their own app store versioning system that they'd like to update independently to their ABI version. It also enables beta distribution for developers who would not like to increment their app store version between each iteration.

Bug Fixes

  1. When the updateDialog is shown while the app is in the background (such as when a new activity is launched), a NullPointerException can arise. This has been fixed in this release.
1.13.5-beta July 14, 2016

This release simply includes an enhancement by @joshuafeldman to allow users to specify the binary packaged root JS bundle in a subdirectory of the main bundle via

[CodePush bundleURLForResource:withExtension:subdirectory:]


1.13.4-beta July 13, 2016

This release simply includes an enhancement by @joshuafeldman to allow users to specify the binary packaged root JS bundle in a subdirectory of the main bundle via [CodePush bundleURLForResource:withExtension:subdirectory:]


1.13.3-beta July 12, 2016

This includes a few bug fixes:

  • Ensures that lint errors in our plugin don't break the build of the host app
  • Guards against NullPointerExceptions in getConfiguration for Android by using the reactContext instead of getCurrentActivity which is nullable.
  • Fixes 'unchecked call' warnings on classes obtained through reflection on Android
  • Fixes an issue with the currentActivity going into the background during an IMMEDIATE install on Android causing a NullPointerException when trying to invoke methods on the result of getCurrentActivity. The fix adds the resume handler on IMMEDIATE installs so that when the activity returns to the foreground, the update will be applied.
1.13.2-beta July 01, 2016

This release

  • Fixes a bug with the app crashing as a result of installing the same update multiple times
  • Improves the legacy restart logic by using the finalized currentActivity from loadBundle to prevent null pointer exceptions, and by using the Activity.recreate() method instead of finishing and re-launching the Activity via an Intent, which results in a better user experience
1.13.1-beta June 27, 2016  
1.13.0-beta June 27, 2016

This release primarily adds support for configuring CodePush in Android apps using React Native v0.29+. It also adds a few bug fixes and minor enhancements. It is available now on NPM and can be installed via the following command: npm i --save react-native-code-push@latest.

New Features (Android)

  1. Added support for Android in React Native v0.29! The CodePush class includes a new constructor which accepts the MainApplication instance, instead of the MainActivity instance, which allows it to be initialized within the new ReactNativeHost object which is used in React Native v0.29. Check out the updated docs for details on how to configure CodePush with this React Native version.

  2. We aliased the CodePush.getBundleFile Java method as CodePush.getJSBundleFile to be more idiomatic with the respective methods in the ReactNativeHost and ReactActivity classes. CodePush.getBundleFile is now marked as deprecated and will be removed in a future release.

New Features (General)

  1. The object returned from getUpdateMetadata is now a fully-compliant LocalPackage instance (e.g. includes an install method). Thanks @nevir for this contribution!

  2. The notifyAppReady method now returns a StatusReport object which indicates whether an update was successfully installed or rolled back. Thanks @nevir for this contribution!

Bug Fixes

  1. Binary hashing has been fixed in React Native v0.29+ Our plugin supports hashing the contents of the binary in order to prevent installing an update that is equivalent to what was shipped in the store. Unfortunately, this feature was broken for a few releases due to a change in React Native itself, but it now works correctly in React Native v0.29+.
1.12.2-beta June 08, 2016

This is simply a patch release that addresses a few user-reported issues. It available now on NPM and can be acquired by running npm i react-native-code-push@latest.

Bug Fixes (General)

  1. Fixed an issue where the Promise returned by sync wouldn't get resolved/rejected if the update dialog was being used and an exception happened while downloading an update (rare but possible).

Bug Fixes (iOS)

  1. Fixed an issue where the downloadProgressCallback option passed to sync wasn't getting triggered (thanks @mikedouglas!). Android wasn't affected by this issue.
  2. Improved our Podspec by marking the SSZipArchive headers as private, and adding the Core subspec that allows you to link to CodePush without the additional SSZipArchive dependency (thanks @nevir!)
1.12.1-beta June 06, 2016

This release simply fixes an issue when trying to install the CodePush plugin via CocoaPods.

1.12.0-beta May 27, 2016

This release includes a few bug fixes as well as a really cool feature contribution from @dbasedow. It is now available on NPM and can be installed via npm i --save react-native-code-push@latest.

New Features

  1. Restarts can be disallowed during critical end user workflows The Javascript API exposes a new disallowRestart method which allows a component to ensure that no programmatic update restarts can occur while it is mounted (resulting in a "quick flash" that some users may think is a crash). This can help prevent end user interruptions during periods where it would be unacceptable (e.g. an on boarding process), but without preventing the app to discover and download available updates as soon as possible (via a call to allowRestart). Check out the docs for more details.

Bug Fixes

  1. Our podspec includes a new NoZip subspec to allow apps that already include SSZipArchive to link with CodePush, without receiving duplicate symbol errors
  2. A bug was fixed with install metrics reporting when an update is successfully installed after a previous update had been rolled back.
  3. Our package.json file now indicates where our *.d.ts file is located, so that supporting editors (e.g. VS Code) can provide auto-completion support for our API out-of-the-box.
1.11.0-beta May 13, 2016

This release includes support for React Native app's targeting Windows (UWP), fixes support for iOS7 and improves the reliability of the install metrics reporting. It is now available on NPM and can be installed via npm i --save react-native-code-push@latest.

New features (Windows)

  1. Windows (UWP) support – Adds initial pass at supporting the Windows platform. Code as well as asset updates are fully supported but we still need to add metrics support, hashing of the stored binary contents as well as recent perf improvements generated by throttling of download progress events.

Bug Fixes (General)

  1. Retry install metrics after failure - Improves the install metrics mechanism in order to make sure that telemetry isn't lost due to poor network conditions.

Bug Fixes (iOS)

  1. Fix support for iOS7 – Changes our implementation to provide iOS7 workarounds for Obj-C APIs only supported on iOS8+.
1.10.6-beta April 29, 2016

This release primarily includes performance improvements to the update download process (for both iOS and Android), and also fixes a critical user-reported bug on iOS. It is now available on NPM and can be installed via npm i --save react-native-code-push.

Performance Improvements

  1. The download progress events that are triggered when calling either sync or are no longer dispatched to the JS thread unless the app actually specified a downloadProgressCallback. Additionally, even if an app subscribed to download progress events, we now throttle them along with the device's vsync, so that the CodePush plugin doesn't overwhelm the JS thread with more events than it can actually render, and ensures that we impose a small impact as little an impact on the app's frame rate as possible.

Bug Fixes (iOS)

  1. CodePush updates are now explicitly excluded from iTunes and/or iCloud backups, which ensures that they don't impact the end users storage capacity, and also prevents any App Store rejections based on their storage guidelines.
1.10.5-beta April 26, 2016

This is just a quick bug fix release that addresses a regression with the client-side rollback feature on Android devices.

1.10.4-beta April 22, 2016

This is just a quick bug fix release that addresses an issue that could occur when an update is downloaded while the app is in the foreground, but finished installing after it has been put into the background.

1.10.3-beta April 20, 2016

This is just a quick bug fix release that also improves upon the existing getCurrentPackage method. It is now available on NPM and can be updated immediately by running npm i --save react-native-code-push@latest.

New Features

  1. Metadata about the currently running update can now be reliably retrieved The existing getCurrentPackage method allowed programmatically retrieving the metadata for CodePush updates (e.g. what is its label? is it mandatory?), but unfortunately, it would always return the "latest" locally available update, which could either be the running update or a pending update. Therefore, there wasn't a reliable way to get the metadata for the update that is currently running, that disregarded any pending updates To address this, we are deprecating the getCurrentPackage method and replacing it with a new getUpdateMetadata method that allows explicitly specifying whether you want the metadata for the running, pending or latest (using the same behavior as getCurrentPackage) update. Check out the docs for more details.

    import codePush, { UpdateState } from "react-native-code-push";
    // Reliably get the running update metadata
    // Both of these calls are equivalent
    // Check if there is a pending update, and if so, get its metadata
    // Provides the same behavior as the existing getCurrentPackage method.
    // The return object still contains the isPending property to determine
    // if the latest update is pending or not.
  2. The notifyApplicationReady method has been aliased as notifyAppReady to be more consistent with the use of "App" instead of "Application" in most React Native APIs (e.g. AppRegistry, AppState). To prevent a breaking change, notifyApplicationReady isn't removed, but our docs will prescribe the new alias moving forward.

Bug Fixes (iOS)

  1. We resolved a bug where CodePush updates on disk weren't correctly being cleared after bumping the app version when using React Native packager as opposed to specifying [CodePush bundleURL] as your JS bundle location.
1.10.2-beta April 14, 2016

This is just a quick bug fix release that addresses a few commonly reported issues. It is now available on NPM and can be updated immediately by running npm i --save react-native-code-push@latest.

Bug Fixes

  1. Fixed an issue with programmatic restarts (e.g. calling CodePush.restartApp, specifying any InstallMode value other than ON_NEXT_RESTART when calling sync) on pre-KitKat Android devices.
  2. Removed the pre-release version tag from our podspec (-beta), which was causing issues for apps being submitted to iTunes Connect. We could have just documented this workaround, but it seemed like a better solution for our users to just remove it on our end, since our NPM packages and GitHub releases already include the -beta semantics.
1.10.1-beta April 08, 2016

This release primarily improves some of the fundamentals of CodePush for Android and deepens our integration with RNPM (we hope to do more more in the future!). It is now available on NPM and can be updated immediately by running npm i --save react-native-code-push@latest.

New Features (Android)

  1. App restarts are now much smoother for the end user Previously, when an app was restarted in order to apply a CodePush update, we would stop and re-start the Activity that represented the current React Native app. While this method worked, it had the effect of being a fairly obtrusive user experience. This release improves the restart by doing a reload of the React Native bridge, which is able to re-use the existing Activity and simply results in a quick "flash" when reloading the new JS bundle file. This experience mirrors what we already have on iOS and should be a lot nicer for your users.

  2. RNPM-based installs now generate the CodePush package code correctly When you run rpm link react-native-code-push, it will update your MainActivity class with the right constructor call to the CodePush class (instead of generating new CodePush() which isn't a valid signature), which further simplifies the installation experience.

  3. RNPM-based installs now prompt you for your CodePush deployment key If you're using RNPM >=1.6.0 (we recommend it!), when you run rpm link react-native-code-push, you will be prompted for your Android deployment key, which will be used to auto-populate your MainActivity file. You can choose to ignore this for now and specify it later using our configuration instructions. We hope to add support for iOS as soon as RNPM allows automating the creation of Info.plist entries.

    Install prompt

1.10.0-beta March 25, 2016

This release primarily introduces a simplified public Java API, that is also more compatible with RNPM, and should make integrating CodePush into React Native Android apps a little easier. It is now available on NPM and can be updated immediately by running npm i --save react-native-code-push@latest.

New Features (Android)

  1. RNPM-based installation is now fully supported and documented We had to make a few breaking changes to our Java API to achieve this (see below for details), but we believe it will be worth it in the long run, since RNPM will greatly simplify adding CodePush to new projects and/or re-installing it in existing projects after performing a React Native upgrade. View the updated Android install docs for more details.
  2. The CodePush.getBundleUrl Java method now includes an overloaded version that takes no parameters, and assumes your JS bundle name is This is what most people name it, so this is just a simple codification of an already ubiquitous convention. More details

Breaking Changes (Android)

  1. The CodePush class itself is now a ReactPackage, and therefore, you can construct an instance of it, and directly add it to the list of packages in your MainActivity.getPackages method. Because of this, the CodePush.getReactPackage method has been removed from the CodePush class since it is no longer needed. View the updated Android install docs for more details about how this class is expected to be used now.
  2. The CodePush.getBundleUrl method is now static, which allows you to easily call it from within your MainActivity.getJSBundleFile method, without needing to maintain a local member variable for the CodePush class instance. View the updated Android install docs for more details about how this method is expected to be used now.
1.9.0-beta March 18, 2016

This release introduces a couple of highly-requested features, as well as some key bug fixes. It is now available on NPM and can be updated immediately by running npm i --save react-native-code-push@latest.

New Features

  1. Added client-side support for the new release rollout feature in the CLI This version of the React Native SDK is required in order to begin taking advantage of this new capability, so make sure to upgrade your apps before attempting to release updates with a rollout percentage. More details

    code-push release-react MyApp ios --rollout 25%
  2. Added support for throttling resume-based installs We've seen a lot of developers want to use the resume-based install strategy, in order to get their updates in front of their end users sooner. However, forcing a restart on the next resume might be too obtrusive if the user switched away from the app for only a few seconds (e.g. to respond to a text). In order to help get updates in front of users sooner, while still respecting their workflow, the sync method now accepts a new option called minimumBackgroundDuration that specifies the number of seconds that the app needs to have been in the background before forcing the install. More details

    // If the app was in the background for 10 minutes, we assume that it is "safe" to restart to install the update
    codePush.sync({ installMode: codePush.InstallMode.ON_NEXT_RESUME, minimumBackgroundDuration: 10 * 60 });

Bug Fixes (General)

  1. When an update is downloaded from the CodePush server, the plugin now looks for the JS bundle file using the exact same file name that was specified as being contained in the binary (via either [CodePush bundleURL] or CodePush.getBundleURL), as opposed to looking for the first file with a .jsbundle, .bundle or .js extension. This makes the update E2E more reliable, and prevents issues for apps that use local <WebView> hosted content.

Bug Fixes (iOS)

  1. The contents of the app binary are now successfully hashed for apps that aren't using React Native assets
  2. A custom error message is displayed when using [CodePush bundleURL] in your AppDelegate.m file, and deploying a debug build to the iOS Simulator. React Native doesn't generate a JS bundle in the binary in this circumstance, and it has confused many CodePush users. To help alleviate the confusion, we now explain the issue as well as a few possible workarounds.

Bug Fixes (Android)

  1. Cleaned up a bunch of lint warnings that didn't impact behavior, but may have been noisy for devs integrating CodePush into a native Android app
  2. Fixed an interop bug for apps that are using CodePush along with the Fabric SDK
1.8.0-beta March 08, 2016

This release introduces a handful of highly requested features and some key bug fixes. It is now available on NPM and can be updated immediately by running npm i --save react-native-code-push@latest.

New Features

  1. The sync method now accepts a new option called mandatoryInstallMode, which allows you to individually customize the install mode that is used for optional and mandatory updates. This new property defaults to InstallMode.IMMEDIATE (which is what we've found most devs want), but can be changed by passing a different value when calling sync (e.g. codePush.sync({ mandatoryInstallMode: codePush.InstallMode.ON_NEXT_RESUME })).
  2. The contents of the binary are now hashed and sent to the CodePush server so that we can detect whether an available update is equivalent to what the end-user is already running. This helps prevent the unnecessary first-run update issue, and we now encourage developers to release their binary contents to CodePush to help solve this scenario, as well as enable diff updates for the initial CodePush update after a fresh binary install/update.
  3. When we download a diff update from the server, and merge its contents together with the previous update (or binary contents), we now validate the contents of the entire update on the client-side to ensure integrity.

Bug Fixes

  1. We removed our use of Promise.prototype.done for compatibility with all Promise implementations, since we were seeing instances where folks were overriding the default React Native polyfill
  2. We fixed our podspec to support CodePush being built as a framework in Swift apps using CocoaPods.
  3. We removed the requirement for apps to include a patch component in their version (e.g. 2.0 as opposed to 2.0.0), so you can now release updates for apps, without needing to change your versioning policies
  4. Added some better diagnostic logging in certain scenarios (e.g. when the native module wasn't properily configured).

Breaking Changes (General)

  1. With the addition of the new mandatoryInstallMode option for sync (described above), by default, mandatory updates will now be installed immediately. From our experience, this is what most developers were already doing or wanted to do, but just keep this change in mind, since it's possible that it would impact your existing update experience once you upgrade the plugin.

Breaking Changes (iOS)

  1. We refactored the code a little bit, and because of this, when you update, you'll need to fix the Xcode project reference for CodePush. This just requires re-running step #2 from here again, using the new xcodeproj path in the docs.
1.7.3-beta February 13, 2016

This is a bug fix release which addresses a user-reported iOS issue and also introduces a small breaking change for apps using getCurrentPackage. It is now available on NPM and can be updated immediately by running npm i --save react-native-code-push@latest.

Bug Fixes (iOS)

  1. When the Promise returned by getCurrentPackage was rejected (rare but possible), the native-side wasn't properly returning from the method, and therefore, it would attempt to resolve the Promise as well, which would result in a "Callback with id [ID] not found" error.

Breaking Changes

  1. The getCurrentPackage method now returns null when the currently running JS bundle is coming from the binary and not from a CodePush update. This is the behavior that most people expected, but in case you're using getCurrentPackage and not currently checking for a null object as the resolved value of its Promise, you need to make sure to update that. Note that this isn't a server change, and therefore, existing production apps are unaffected. This breaking change only affects apps that upgrade to 1.7.3+ and continue calling getCurrentPackage without checking for null.
1.7.2-beta February 09, 2016

This is a bug fix release which addresses some key user-reported issues. It is now available on NPM and can be updated immediately by running npm i --save react-native-code-push@latest.

Bug Fixes (General)

  1. We saw a few cases where apps were inadvertently calling the sync method multiple times concurrently (e.g. they called sync in componentDidMount as well as an AppState change handler), which had the potential to put the app in a weird state. Now, when sync is called, and a previous sync call is still in progress (e.g. an update is downloading), it will resolve the promise with a new sync status of SYNC_IN_PROGRESS. That way, we can safeguard the runtime from getting into a bad state, while still providing the app with an indication of why each sync call completed.

Bug Fixes (iOS)

  1. If a developer's desktop clock wasn't synchronized with their testing device (i.e. it was significantly ahead of it), it would be possible to hit an issue where your app downloads a CodePush update, but after restart, continues to use the JS bundle that was shipped with the binary. This was because the [CodePush bundleURL] logic saw that the binary bundle was newer than the CodePush update, and therefore, gave it precedence. We no longer rely on this time-based heuristic for detecting whether to use the binary or CodePush update on app start, and therefore, this issue would no longer be possible in the rare cases that we saw it.

Bug Fixes (Android)

  1. We removed the superfluous NDK config from our build.grade file (we don't have any C++ code!), which was causing compilation errors for apps that use both the NDK and CodePush.
1.7.1-beta February 03, 2016

This is simply a bug fixing release that adds better logging for diagnostic purposes and re-enables install telemetry to be reported while debugging.

1.7.0-beta February 03, 2016

This release introduces the long-awaited support for updating assets on Android! This feature depends on React Native v0.19.0, so you'll need to update to that version of the platform in order to consume this CodePush release. We think it's extremely worth it though! (e.g. you get new debugging support for unhandled promises). This update is now available in NPM and can be installed immediately!

New Features (Android)

  1. Deploy updates to your assets on Android via CodePush. This works exactly like it does for iOS: instead of simply uploading your JS bundle to CodePush, you upload a directory containing your bundle and assets, and everything works great. The server supports differential updates, so your end-users will only get the files that changed between releases (i.e. they won't have to download all of your assets every time you release an update). Check out the CLI docs for the release command for more details.

New Features (iOS)

  1. We added a new method to the CodePush class called setDeploymentKey which allows you to dynamically set your deployment key in Objective-C, as opposed to specifying it in the Info.plist file.

Breaking Changes

  1. This release depends on React Native 0.19.0, so if you choose to upgrade CodePush, then you need to also upgrade your React Native dependency.
  2. The newly added install metrics feature now only reports data to the server in release builds. Therefore, if you are testing your app and want to see this data populated in the CLI, you'll need to generate a release build first. This change was made to reduce noise from the metrics that are generated during debugging.
1.6.0-beta January 23, 2016

This release primarily introduces the necessary client-side telemetry to support the new install metrics of the CLI. You can view the details of this feature here. This version is now available in NPM and can be installed immediately!

New Features

  1. Update installations and rollbacks are now reported to the CodePush server in order to enable the CLI to display these metrics. You can find details about this feature here.

Bug Fixes

  1. The Android platform implementation no longer requires your app's Activity to inherit from FragmentActivity in order to display an update dialog prompt. This was necessary for enabling React Native 0.18.0, since it now makes use of a base class (ReactActivity) which doesn't itself inherit from FragmentActivity.
1.5.3-beta January 09, 2016

This release is primarily meant to address an iOS compilation error that was introduced by React Native 0.18.0-RC (see details below), but it also includes a few other fixes and a minor feature enhancement. It is now available on NPM and can be upgraded to immediately.

Bug Fixes (iOS)

  1. In order to perform a programmatic app restart after an update has been installed, the CodePush plugin needs to update the RCTBridge.bundleURL property to point at the latest JS bundle file on disk. React Native 0.18.0 made this property readonly (in it's interface), and therefore, cause a compilation error with our plugin, since we could no longer set it. At runtime, this property is still readwrite, so we simply use KVC to set the property, instead of relying on the "dot syntax" that the compiler didn't like. In the future, we'll use the more appropriate solution of importing the new RCTBridge+Private.h header file, but for now, we wanted to maintain backwards combat so that this release didn't force all of our users to upgrade to React Native 0.18.0-RC.

Bug Fixes (General)

  1. Update assets (e.g. the JS bundle and images) weren't being removed from disk after being automatically rolled back due to a crash. This wouldn't have impacted the user experience, and unless you released a significant amount of CodePush updates that included a crash (please don't do this!), this wouldn't result in much disk space being used either. That said, we don't want to consume any more of the end users storage capacity than is absolutely necessary, so this was an important fix for cleanliness sake.
  2. Internal CodePush state (e.g. the list of updates that have previously failed) wasn't being properly cleared when a new binary was installed. It would be pretty rare for this behavior to have caused any issues, but it's more deterministic for us to treat each new binary installation as a "clean slate" since we can't make many assumptions about the new "environment" (e.g. which CodePush updates will work within it).

Feature Enhancements

  1. The restartApp method now includes an optional parameter that lets you specify whether you want to always restarts the app, or only if there is a pending update. This makes it simpler to implement a "forced restart" solution at some well-known point within your app (after installing a non-immediate update), without having to check LocalPackage.isPending before calling restartApp.
1.5.2-beta December 21, 2015

This release fixes a bug with the rollback protection feature that would occur in some circumstances on iOS when deploying React Native assets.

1.5.1-beta December 19, 2015

This is largely a bug-fix release to address a regression, but it also introduces a small feature request. It can be immediately acquired from NPM and includes the following improvements:

New Features (iOS and Android)

  1. The LocalPackage object returned by calling getCurrentPackage now includes an isPending property which indicates whether or not the most recently installed update has actually been applied yet via a restart.

Bug fixes (iOS and Android)

  1. We fixed a regression that caused immediately-applied updates to automatically rollback in certain situations.
1.5.0-beta December 12, 2015

This is largely a bug fix release for the Android platform, that also introduces a breaking change for both iOS and Android (hence the minor version bump). Because of this breaking change, you need to uninstall your app from the emulator/devices your testing against before upgrading. It can be immediately acquired from NPM, and includes the following improvements:

Breaking Changes (iOS and Android)

  1. The rollbackTimeout parameter of both the sync and LocalPackage.install methods have been removed. We received a lot of feedback regarding this parameter being pretty confusing, and it also required devs to opt-in to receiving client-side rollback protection. We believe that this behavior is extremely important for doing production deployments, and therefore, in order to be more prescriptive, calling sync and LocalPackage.install will now automatically enable rollback protection, and it cannot be disabled (why would you want to do that anyways?)

    If you are calling sync on app start (e.g. the componentDidMount method of your root component), then you don't need to do anything else. Your updates will be made available to users, but if you accidentally release something bad, you can rest assured that your users will be automatically rolled back. However, if you are calling sync somewhere else (e.g. button click, within a periodic timer), you MUST call notifyApplicationReady after your app has successfully started (e.g. in your root component's componentDidMount event), which lets the CodePush runtime know that the update is valid and won't automatically roll the end-user back to the previous version.

    We've found that the vast majority of users are calling sync in componentDidMount, and therefore, this change automatically makes your deployments more reliable, without doing any work!

Bug Fixes (Android)

  1. When dev support is enabled, the React Native runtime attempts to load the JS bundle from a locally available cache. This can create a confusing workflow when using CodePush, since it's possible to install an update, restart the app, and not see the changes applied. This occurs because the app might still be using the older cached file, and CodePush is effectively not being consulted. The CodePush plugin now deletes the React Native cache whenever an update is installed. This will have the effect of loading the JS bundle from the packager (if running), or the bundle file downloaded from CodePush.
  2. There were some instances where an installed update wouldn't be correctly applied when running your app in an emulator. This has now been addressed, and updates should work great across all emulators and devices.
1.4.2-beta December 09, 2015

This is a bug fix release that addresses the following issues and can be immediately acquired via NPM:

  1. When an error occurs during a call to sync (e.g. missing deployment key in Info.plist file), that error message is now logged to the console (e.g. adb logcat, Chrome, Xcode console). Previously, we would only log "Unknown error", which wasn't particularly useful. If an app was calling done on the Promise returned by sync, any errors would have resulted in a red box, so this issue only really impacted scenarios where the error was being completely swallowed and the console didn't provide any indication of the cause.
  2. We were previously writing the update contents (e.g. JS bundle, images) to the app's Documents folder, whereas the iOS guidelines recommend using the Library\Application Support directory for content that shouldn't be end-user visible. Because of this change, you should uninstall your app from any devices or simulators in order to clean out the Documents folder. The plugin automatically cleans out old updates when installing a new one, but with this fix, it won't attempt to clean out the Documents folder anymore. This won't impact any user experience, however, it's just for cleanliness sake.
  3. The iOS plugin was erroneously giving priority to the JS bundle contained in the binary in some instances. If you're installing an update but still seeing an older version of your app after restarting, it it likely this bug, and you should update your NPM dependency to this release.
1.4.1-beta December 07, 2015

This is a bug fix release which addresses the following two issues:

  1. The sync method wasn't calling notifyApplicationReady as was intended. This has been addressed, and therefore, when you are calling sync on app start, and specifying a rollbackTimeout, you don't have to manually call notifyApplicationReady, since
  2. The bug reported (and fixed!) via #94. Thanks @oney for being such a consistently amazing contributor!
1.4.0-beta December 05, 2015

This release introduces support for updating images via CodePush using the new React Native assets system. It currently only works for iOS, but we're working on Android support. In the meantime, you can still use CodePush and the new assets system on Android, and nothing will break, you just won't be able to add/edit images via CodePush like you can with iOS.

In order to support this change, we needed to rely on v0.15.0 of React Native, so if you're still using v0.14.*, we recommend sticking with v1.3.0 of CodePush. That said, we think the new asset system is awesome, and is way worth upgrading, so we encourage you to do it :)

Additionally, once you are using the assets system, you are no longer simply releasing updates of your JS bundle file, and therefore, you'll need to change your CodePush workflow a little bit. Refer to the docs for all the details here. We promise that it's still simple!

Note: If you aren't using the new React Native assets system, then you can continue to release only your JS bundle to CodePush, and rely on your images to be loaded from the binary. CodePush won't break this workflow in any way.

Breaking Changes (General)

  1. As mentioned above, this version of CodePush requires v0.15.0 of React Native. Even if you're not using the assets system or you are but on Android, this release of the CodePush plugin requires you to upgrade your RN dependency.

Breaking Changes (iOS)

  1. This upgrade requires an additional setup step for iOS to link the libz library with your app (we use it to unzip updates which contain the JS bundle and images). Refer to step #5 in the iOS installation section of the docs to see how to do this. If you upgrade your plugin and see a bunch of weird errors, this is likely the reason.
  2. If your app was already using the new assets system and deployed updates to CodePush that only specified a JS bundle, you need to do another release via the CLI which includes your assets and bundle (details here). When the plugin installs an update that contains only a JS bundle, it assumes you aren't using the React Native assets system, and therefore, won't copy over your existing assets in the binary to the location that the update is written to (and your app layout will be broken). As mentioned above, if you aren't using the new assets system, you can keep releasing just the JS bundle, and your release workflow doesn't need to change.
1.3.1-beta November 29, 2015

This is a bug fix release that ensures the actual update download runs on a background thread (Android only), and fixes a regression with the mandatory update message displayed as part of the sync method. Thanks to @oney for these contributions!

1.3.0-beta November 27, 2015

This is a significant release that contains many new features as well as some breaking changes. Please refer to the docs for more information regarding the behavior of the following API additions/modifications. You can update your react-native-code-push installation from NPM immediately to take advantage of these improvements.

New features (General)

  • Android support! This has been our #1 user request thus far, and so we're excited to get it out there. The Android API includes complete parity with iOS, including the new features mentioned in this release below.
  • The sync method now include a syncStatusChangedCallback parameter, which allows you to listen for state changes in the overall update process (e.g. update is available, download starting) and respond accordingly. This allows you to let the sync method handle the entire update process, while still having the option to display custom UI and/or perform additional behavior as needed.
  • The sync and methods now include a downloadProgressCallback parameter, which allows you to listen to progress events when an available update is being downloaded. This was a very common request and allows you to choose to show a download progress modal experience in your app.
  • The sync and LocalPackage.install method now accept an InstallMode parameter which allows you to determine whether the update should be installed immediately (the previous behavior), on the next app restart (to support fully silent installs) or on the next app resume.
  • The sync method now accepts an updateDialog parameter, which allows you to enable/disable the user confirmation, as well as customize its strings when displayed. The change, along with the InstallMode change above is what fully enables "silent updates" (see below for breaking changes with sync).
  • The sync and checkForUpdate methods now accept an optional deploymentKey parameter, which allows you to override the value that was specified in the Info.plist file (iOS) or (Android). This enables you to build your app against a specific deployment (i.e. Production) and then dynamically "redirect" it at a different deployment
  • A new restartApp method was added to the react-native-code-push module, which allows your app to force a restart at any time. This can be useful when you choose not to install an available update immediately (e.g. when performing "silent" updates), but your app has a deterministic event that can be used to "force" the update instead of waiting for the user to restart/resume the app (e.g. when a form is submitted or a user navigates to the home route).
  • When your app is configured to used the packager for debugging, a CodePush update will no longer re-direct the React Native Bridge from the HTTP URL to the update file on disk. This change allows you to efficiently debug your app, as well as your CodePush update experience, without interrupting your flow as soon as an update is applied.

New features (iOS)

  • Besides the [CodePush bundleURL] method, which assumes your JS bundle is named main.jsbundle, the CodePush class now includes a bundleURLForResource: method (which lets you override the bundle name) and the bundleURLForResource:withExtension: method (which lets you override both the bundle name and extension).

Breaking changes (General)

  • This plugin now requires React Native v0.14.0 or greater. We needed to take advantage of some recent changes in the platform and choose to up our version requirement. If this is going to impact you, please let us know.
  • The sync method is now "silent" by default, and therefore, no longer displays the user prompt when an update is available, and also doesn't immediately restart the app after installing the update. This change was made based on lots of feedback. If you want to achieve the old behavior, you simply need to enable the updateDialog option and change the InstallMode to immediate when calling sync: codePush.sync({ userDialog: true, installMode: codePush.InstallMode.IMMEDIATE }).
  • The LocalPackage.apply method has been renamed to install to better reflect what it's actually doing.

Breaking changes (iOS)

  • The getBundleUrl method of the CodePush class has been renamed to bundleURL
1.2.1-beta November 20, 2015  
1.2.0-beta November 19, 2015  
1.1.2-beta November 08, 2015

This is a bug fix update, which addresses the following issues:

  1. #41 - Updates are now appropriately being "ignored" when they are associated with an app store version other than the one which the end-user is currently running. This was always the intended behavior, but it was regressed with a feature release. Therefore, if the end-user is running v1.0.0 of your app, and the app queries CodePush for an update, it will only accepts updates that have been explicitly "tagged" as v1.0.0. Older versions were already ignored (for obvious reasons), and with this update, so are newer versions (e.g. v1.0.1), since it isn't clear that they would work with the end-users running version of the app binary.
  2. #38 - If the JS bundle in the app binary is newer then the JS bundle from the latest CodePush update, it will be used instead of simply always using the CodePush update when one is available. This behavior is necessary so that if an end-user updates the app from the store (or whatever other means they could acquire a newer IPA file), the contents of that update will take precedent as long as it's newer. Thanks @qingfeng for handling this PR!

This release has been published to NPM and is the recommended version for all developers.

1.1.1-beta November 04, 2015  
1.1.0-beta October 30, 2015  
1.0.1-beta October 23, 2015  
1.0.0 October 09, 2015  
1.0.0-beta October 21, 2015