mirror of
				https://gitcode.com/gh_mirrors/re/react-native-pushy.git
				synced 2025-11-04 23:33:11 +08:00 
			
		
		
		
	bugfix: switchVersion failed on Android after 0.29
This commit is contained in:
		@@ -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);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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):'));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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": {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user