1
0
mirror of https://gitcode.com/gh_mirrors/re/react-native-pushy.git synced 2025-09-17 23:46:15 +08:00
Code Issues Packages Projects Releases Wiki Activity GitHub Gitee

bugfix: switchVersion failed on Android after 0.29

This commit is contained in:
tdzl2003
2016-08-17 21:25:11 +08:00
parent 5e5a214c13
commit 7bf0fb12de
4 changed files with 81 additions and 13 deletions

View File

@@ -1,15 +1,22 @@
package cn.reactnative.modules.update; package cn.reactnative.modules.update;
import android.app.Activity; import android.app.Activity;
import android.app.Application;
import android.content.Intent; import android.content.Intent;
import android.util.Log;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.cxxbridge.JSBundleLoader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -112,10 +119,32 @@ public class UpdateModule extends ReactContextBaseJavaModule{
@Override @Override
public void run() { public void run() {
updateContext.switchVersion(hash); updateContext.switchVersion(hash);
Activity activity = getCurrentActivity(); try {
Intent intent = activity.getIntent(); Activity activity = getCurrentActivity();
activity.finish(); Application application = activity.getApplication();
activity.startActivity(intent); ReactInstanceManager instanceManager = ((ReactApplication) application).getReactNativeHost().getReactInstanceManager();
if (instanceManager.getClass().getSimpleName().equals("XReactInstanceManagerImpl")) {
JSBundleLoader loader = JSBundleLoader.createFileLoader(application, UpdateContext.getBundleUrl(application));
Field jsBundleField = instanceManager.getClass().getDeclaredField("mBundleLoader");
jsBundleField.setAccessible(true);
jsBundleField.set(instanceManager, loader);
} else {
Field jsBundleField = instanceManager.getClass().getDeclaredField("mJSBundleFile");
jsBundleField.setAccessible(true);
jsBundleField.set(instanceManager, UpdateContext.getBundleUrl(application));
}
final Method recreateMethod = instanceManager.getClass().getMethod("recreateReactContextInBackground");
final ReactInstanceManager finalizedInstanceManager = instanceManager;
recreateMethod.invoke(finalizedInstanceManager);
activity.recreate();
} catch (Throwable err) {
Log.e("pushy", "Failed to restart application", err);
}
} }
}); });
} }

View File

@@ -11,22 +11,37 @@
## 安装 ## 安装
在你的项目根目录下运行以下命令(不要输入开头的美元符号) 在你的项目根目录下运行以下命令(不要输入开头的美元符号)
RN 0.29及以上:
```bash
$ npm install -g react-native-update-cli
$ npm install --save react-native-update
$ react-native link react-native-update
```
`npm install -g react-native-update-cli`这一句在每一台电脑上仅需运行一次。
RN 0.27-0.28:
```bash ```bash
$ npm install -g react-native-update-cli rnpm $ npm install -g react-native-update-cli rnpm
$ npm install --save react-native-update $ npm install --save react-native-update@2.x
$ rnpm link react-native-update $ rnpm link react-native-update
``` ```
`npm install -g react-native-update-cli rnpm`这一句在每一台电脑上仅需运行一次。 `npm install -g react-native-update-cli rnpm`这一句在每一台电脑上仅需运行一次。
* 注意 * RN 0.26及以下:
如果你的react-native版本小于或等于0.26,第二句请修改为
```bash ```bash
$ npm install -g react-native-update-cli rnpm
$ npm install --save --save-exact react-native-update@1.0.x $ npm install --save --save-exact react-native-update@1.0.x
$ rnpm link react-native-update
``` ```
`npm install -g react-native-update-cli rnpm`这一句在每一台电脑上仅需运行一次。
* 注意 * * 注意 *
如果访问极慢或者显示网络失败,请使用淘宝镜像: 如果访问极慢或者显示网络失败,请使用淘宝镜像:
@@ -41,7 +56,31 @@ npm config set disturl https://npm.taobao.org/dist --global
2、如果使用VS2015你需要设置`npm config set msvs_version 2015 --global` 2、如果使用VS2015你需要设置`npm config set msvs_version 2015 --global`
## 手动安装
如果第一步已成功(iOS工程和安卓工程均能看到依赖),可以跳过此步骤
#### iOS
1. 在XCode中的Project Navigator里,右键点击`Libraries``Add Files to [你的工程名]`
2. 进入`node_modules``react-native-update``ios 并选中 `RCTHotUpdate.xcodeproj`
3. 在XCode中的project navigator里,选中你的工程,在 `Build Phases``Link Binary With Libraries` 中添加 `libRCTHotUpdate.a`
4. Run your project (`Cmd+R`)<
#### Android
1. `android/settings.gradle`中添加如下代码:
```
include ':react-native-update'
project(':react-native-update').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-update/android')
```
2. 在`android/app/build.gradle`的 dependencies 部分增加如下代码:
```
compile project(':react-native-update')
```
3. 检查你的RN版本,如果是0.29及以上, 打开`android/app/src/main/java/[...]/MainApplication.java`,否则打开`android/app/src/main/java/[...]/MainActivity.java`
- 在文件开头增加 `import cn.reactnative.modules.update.UpdatePackage;`
- 在`getPackages()` 方法中增加 `new UpdatePackage()`(注意上一行可能要增加一个逗号)
## 配置Bundle URL(iOS) ## 配置Bundle URL(iOS)

View File

@@ -56,7 +56,7 @@ export const commands = {
name, name,
hash, hash,
}); });
console.log('Ipa uploaded: id'); console.log(`Ipa uploaded: ${id}`);
}, },
uploadApk: async function({args}) { uploadApk: async function({args}) {
const fn = args[0]; const fn = args[0];
@@ -72,7 +72,7 @@ export const commands = {
name, name,
hash, hash,
}); });
console.log('Apk uploaded: id'); console.log(`Apk uploaded: ${id}`);
}, },
packages: async function({options}) { packages: async function({options}) {
const platform = checkPlatform(options.platform || await question('Platform(ios/android):')); const platform = checkPlatform(options.platform || await question('Platform(ios/android):'));

View File

@@ -1,6 +1,6 @@
{ {
"name": "react-native-update", "name": "react-native-update",
"version": "2.1.0", "version": "3.0.1",
"description": "react-native hot update", "description": "react-native hot update",
"main": "lib/index.js", "main": "lib/index.js",
"scripts": { "scripts": {
@@ -38,7 +38,7 @@
"read": "^1.0.7", "read": "^1.0.7",
"request": "^2.69.0", "request": "^2.69.0",
"rimraf": "^2.5.2", "rimraf": "^2.5.2",
"yauzl": "^2.4.1", "yauzl": "2.4.1",
"yazl": "2.3.0" "yazl": "2.3.0"
}, },
"devDependencies": { "devDependencies": {