https://github.com/reactnativecn/react-native-pushy/blob/master/docs/guide.md

Android NDK暂时没有安装

在你的项目根目录下运行以下命令:

  1. 1.       npm install -g react-native-update-cli rnpm

成功截图

2. 安装命令示例:(我的0.37)npm install --save react-native-update@4.x

把此工程的相关操作关掉,否则好像会报错(npm ERR! errno -4048)

成功截图:

  1. 3.手动link react-native link react-native-update

如果link没有成功就手动添加下面的配置,成功的跳过

iOS

在XCode中的Project Navigator里,右键点击Libraries ➜ Add Files to [你的工程名]

进入node_modules ➜ react-native-update ➜ ios 并选中RCTHotUpdate.xcodeproj`

在XCode中的project navigator里,选中你的工程,在 Build Phases ➜ Link Binary With Libraries 中添加 libRCTHotUpdate.a

Run your project (Cmd+R)

Android

在android/settings.gradle中添加如下代码:  include ':react-native-update' project(':react-native-update').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-update/android')

在android/app/build.gradle的 dependencies 部分增加如下代码:  compile project(':react-native-update')

检查你的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()(注意上一行可能要增加一个逗号)

4.配置Bundle URL(Android)(ios的自己去网上看吧,没有验证不写)

0.29及以后版本:在你的MainApplication中增加如下代码:

  1. // ... 其它代码
  2.  
  3. import cn.reactnative.modules.update.UpdateContext;
  4. public class MainApplication extends Application implements ReactApplication {
  5.  
  6. private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
  7. @Override
  8. protected String getJSBundleFile() {
  9. return UpdateContext.getBundleUrl(MainApplication.this);
  10. }
  11. // ... 其它代码
  12. }
  13. }

0.28及以前版本:在你的MainActivity中增加如下代码:

  1. // ... 其它代码
  2.  
  3. import cn.reactnative.modules.update.UpdateContext;
  4.  
  5. public class MainActivity extends ReactActivity {
  6.  
  7. @Override
  8. protected String getJSBundleFile() {
  9. return UpdateContext.getBundleUrl(this);
  10. }
  11. // ... 其它代码
  12. }

5. 登录与创建应用

首先请在http://update.reactnative.cn注册帐号,然后在你的项目根目录下运行以下命令:

$ pushy login

email: <输入你的注册邮箱>

password: <输入你的密码>

cmd允许会出现不是内部命令,

此时用git

这会在项目文件夹下创建一个.update文件,注意不要把这个文件上传到Git等CVS系统上。你可以在.gitignore末尾增加一行.update来忽略这个文件。

登录之后可以创建应用。注意iOS平台和安卓平台需要分别创建:一定要另开一个git窗口输入创建应用的命令或者选择的命令

创建之前:网页截图

创建之后:网页截图,(可以直接网页上创建,也可以用命令行)

创建应用:

$ pushy createApp --platform ios

App Name: <输入应用名字>

$ pushy createApp --platform android

App Name: <输入应用名字>

如果你已经在网页端或者其它地方创建过应用,也可以直接选择应用:

$ pushy selectApp --platform ios

1) 鱼多多(ios)

3) 招财旺(ios)

 

Total 2 ios apps

Enter appId: <输入应用前面的编号>

截图:

工程根目录:

这主意平台暂时只能创建三个应用,,多了回报错;

选择应用之后,update.json文件内容如下:

添加热更新

1.获取appKey

  1. import {
  2. Platform,
  3. } from 'react-native';
  4.  
  5. import _updateConfig from './update.json';
  6. const {appKey} = _updateConfig[Platform.OS];

2.检查更新/下载更新

  1. checkUpdate(appKey)
  2. .then(info => {
  3. })

3.切换版本

4.首次启动/回滚

完整代码

  1. import React, { Component,} from 'react';
  2. import {AppRegistry, StyleSheet, Platform, Text, View, Alert, TouchableOpacity, Linking,} from 'react-native';
  3. import { isFirstTime, isRolledBack,packageVersion,currentVersion, checkUpdate, downloadUpdate, switchVersion,
  4. switchVersionLater, markSuccess,} from 'react-native-update';
  5.  
  6. import _updateConfig from './update.json';
  7. const {appKey} = _updateConfig[Platform.OS];
  8.  
  9. class MyProject extends Component {
  10. componentWillMount(){
  11. if (isFirstTime) {
  12. Alert.alert('提示', '这是当前版本第一次启动,是否要模拟启动失败?失败将回滚到上一版本', [
  13. {text: '是', onPress: ()=>{throw new Error('模拟启动失败,请重启应用')}},
  14. {text: '否', onPress: ()=>{markSuccess()}},
  15. ]);
  16. } else if (isRolledBack) {
  17. Alert.alert('提示', '刚刚更新失败了,版本被回滚.');
  18. }
  19. }
  20. doUpdate = info => {
  21. downloadUpdate(info).then(hash => {
  22. Alert.alert('提示', '下载完毕,是否重启应用?', [
  23. {text: '是', onPress: ()=>{switchVersion(hash);}},
  24. {text: '否',},
  25. {text: '下次启动时', onPress: ()=>{switchVersionLater(hash);}},
  26. ]);
  27. }).catch(err => {
  28. Alert.alert('提示', '更新失败.');
  29. });
  30. };
  31. checkUpdate = () => {
  32. checkUpdate(appKey).then(info => {
  33. if (info.expired) {
  34. Alert.alert('提示', '您的应用版本已更新,请前往应用商店下载新的版本', [
  35. {text: '确定', onPress: ()=>{info.downloadUrl && Linking.openURL(info.downloadUrl)}},
  36. ]);
  37. } else if (info.upToDate) {
  38. Alert.alert('提示', '您的应用版本已是最新.');
  39. } else {
  40. Alert.alert('提示', '检查到新的版本'+info.name+',是否下载?\n'+ info.description, [
  41. {text: '是', onPress: ()=>{this.doUpdate(info)}},
  42. {text: '否',},
  43. ]);
  44. }
  45. }).catch(err => {
  46. Alert.alert('提示', '更新失败.');
  47. });
  48. };
  49. render() {
  50. return (
  51. <View style={styles.container}>
  52. <Text style={styles.welcome}>
  53. 欢迎使用热更新服务
  54. </Text>
  55. <Text style={styles.instructions}>
  56. 这是版本一 {'\n'}
  57. 当前包版本号: {packageVersion}{'\n'}
  58. 当前版本Hash: {currentVersion||'(空)'}{'\n'}
  59. </Text>
  60. <TouchableOpacity onPress={this.checkUpdate}>
  61. <Text style={styles.instructions}>
  62. 点击这里检查更新
  63. </Text>
  64. </TouchableOpacity>
  65. </View>
  66. );
  67. }
  68. }
  69.  
  70. const styles = StyleSheet.create({
  71. container: {
  72. flex: 1,
  73. justifyContent: 'center',
  74. alignItems: 'center',
  75. backgroundColor: '#F5FCFF',
  76. },
  77. welcome: {
  78. fontSize: 20,
  79. textAlign: 'center',
  80. margin: 10,
  81. },
  82. instructions: {
  83. textAlign: 'center',
  84. color: '#333333',
  85. marginBottom: 5,
  86. },
  87. });
  88.  
  89. AppRegistry.registerComponent('MyProject', () => MyProject);

运行会出现如下错误

装NDK吧

解压下载包并配置环境变量

重启电脑,不然还是会报刚才的错误

接着报了这个错误:

接着又报了另外一个错误:

这个错误就有点坑爹了,不管吧,一次又一次的去重新运行或者重新写index.android.js

终于解决了:

react-native start

react-native run-android

发布应用:

设置签名生成不成功

1.生成一个签名密钥

用keytool命令生成一个私有密钥。在Windows上keytool命令放在JDK的bin目录中(比如C:\Program Files\Java\jdkx.x.x_x\bin),你可能需要在命令行中先进入那个目录才能执行此命令。

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

执行如下:

现在发现$的命令只要不复制前面的符号,只要不出现符号就可以在cmd里面运行了,

Keytools在C盘当前用户没法更改,只需要改权限

设置gradle变量:

把my-release-key.keystore文件放到你工程中的android/app文件夹下。

编辑~/.gradle/gradle.properties(没有这个文件你就创建一个),添加如下的代码(注意把其中的****替换为相应密码)

注意:~表示用户目录,比如windows上可能是C:\Users\用户名,而mac上可能是/Users/用户名。

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore

MYAPP_RELEASE_KEY_ALIAS=my-key-alias

MYAPP_RELEASE_STORE_PASSWORD=*****

MYAPP_RELEASE_KEY_PASSWORD=*****

添加签名到项目的gradle配置文件:android/app/build.gradle

  1. ...
  2. android {
  3. ...
  4. defaultConfig { ... }
  5. signingConfigs {
  6. release {
  7. storeFile file(MYAPP_RELEASE_STORE_FILE)
  8. storePassword MYAPP_RELEASE_STORE_PASSWORD
  9. keyAlias MYAPP_RELEASE_KEY_ALIAS
  10. keyPassword MYAPP_RELEASE_KEY_PASSWORD
  11. }
  12. }
  13. buildTypes {
  14. release {
  15. ...
  16. signingConfig signingConfigs.release
  17. }
  18. }
  19. }
  20. ...

生成发行APK包:

只需在终端中运行以下命令:

$ cd android && ./gradlew assembleRelease

译注:cd android表示进入android目录(如果你已经在android目录中了那就不用输入了)。./gradlew assembleRelease在macOS和Linux系统中表示执行当前目录下的名为gradlew的脚本文件,运行参数为assembleRelease,注意这个./不可省略;而在windows命令行下则需要去掉./

运行中:

成功:

测试应用的发行版本:

$ cd android && ./gradlew installRelease

注意installRelease参数只能在你完成了上面的签名配置之后才可以使用。 你现在可以关掉运行中的packager了,因为你所有的代码和框架依赖已经都被打包到apk包中,可以离线运行了。

同样在win上注意路径问题

发布安卓应用

首先参考文档-生成已签名的APK设置签名, 然后在android文件夹下运行./gradlew assembleRelease,你就可以在android/app/build/outputs/apk/app-release.apk中找到你的应用包。

然后运行如下命令

$ pushy uploadApk android/app/build/outputs/apk/app-release.apk

完成:

发布新的热更新版本(以后更改之后直接发布,不用重新上传)

pushy bundle --platform <ios|android>

react-native热更新从零到成功中的各种坑的更多相关文章

  1. react native 热更新

    一.安装codepush服务 npm install code-push-cli -gcode-push -v 二.创建codepush账号 code-push registercode-push l ...

  2. React Native热更新(iOS)-Pushy

    React Native的出现,使的开发iOS代码出现了更便捷的方式.由于RN是使用脚本语言编写的,实现了"解释执行"的方式,而这种执行方式的修改只需替换脚步即可,不需要重新发布程 ...

  3. react native 之 在现有的iOS工程中集成react native

    在现有的iOS工程中集成react native, 或者说将react native引入到iOS 项目,是RN和iOS混合开发的必经之路 参考官网教程:https://reactnative.cn/d ...

  4. react native jpush跳转页面不成功解决方法

    在点击事件时加入如下红色代码即可 import JPushModule from 'jpush-react-native'; ... componentDidMount() { // 新版本必需写回调 ...

  5. React Native商城项目实战06 - 设置安卓中的启动页

    1.Main 目录下新建LaunchImage.js: /** * 启动页 */ import React, { Component } from 'react'; import { AppRegis ...

  6. react-native热更新之CodePush详细介绍及使用方法

    react-native热更新之CodePush详细介绍及使用方法 2018年03月04日 17:03:21 clf_programing 阅读数:7979 标签: react native热更新co ...

  7. iOS 写给iOS开发者的React Native学习路线(转)

    我是一名iOS开发者,断断续续一年前开始接触React Native,最近由于工作需要,专职学习React Native也有一个多月了.网络上知识资源非常的多,但能让人豁然开朗.迅速学习的还是少数,我 ...

  8. 写给iOS开发者的React Native学习路线(转)

    我是一名iOS开发者,断断续续一年前开始接触React Native,最近由于工作需要,专职学习React Native也有一个多月了.网络上知识资源非常的多,但能让人豁然开朗.迅速学习的还是少数,我 ...

  9. 🙈 如何隐藏你的热更新 bundle 文件?

    如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦. 前段时间我们公司的一个大佬从一些渠道得知了一些小道消息,某国民级 APP 因为 Apple App Store ...

随机推荐

  1. NOIP2016愤怒的小鸟 [状压dp]

    愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0) 处,每次 Kiana 可以用它向第一象限发射一只红色的小鸟, ...

  2. gogole调试请求体的数据怎么知道

    在network---->header->request payload中看 详细情况见下图所示:

  3. AnnotationConfigApplicationContext.的用法的核心代码

    public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationCont ...

  4. org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in receiveBlock for block

    Hbase依赖的datanode日志中如果出现如下报错信息:DataXceiverjava.io.EOFException: INFO org.apache.hadoop.hdfs.server.da ...

  5. spring和Quartz的定时功能

    一:前沿 最近在做一个定时的功能,就是在一定时间内查询订单,然后告诉用户未付款,已付款等消息通知,而且要做集群的功能,这个集群的功能是指,我部署两套代码,其中一个定时的功能在运行,另外一个就不要运行. ...

  6. Java并发编程--ThreadPoolExecutor

    概述 为什么要使用线程池? 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立 ...

  7. python 文件操作 r w a

    python基础-文件操作   一.文件操作 对文件操作的流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件       打开文件时,需要指定文件路径和以何等方式打开文件, ...

  8. [Leetcode Week10]Minimum Time Difference

    Minimum Time Difference 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/minimum-time-difference/desc ...

  9. POJ3180(有向图强连通分量结点数>=2的个数)

    The Cow Prom Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1451   Accepted: 922 Descr ...

  10. 关于一些Java基础数据类型的常用方法的应用场景的小思考

    昨天遇到一个问题,按照我的一半解决方法是传一个参数,然后通过参数来控制逻辑处理:但是领导发现String的一个方法也可以完全完成该问题!而我完全没有get到这个点! so,我认识到了自己的知识盲区:基 ...