商界观察员 發表於 2020-11-11 19:44:00

cordova混合App开发:Cordova+Vue实现Android APP开发 (热更新) (六)

<h3>第一步</h3>
<blockquote>
<p>在已有项目目录下添加插件 cordova plugin add cordova-hot-code-push-plugin</p>
</blockquote>
<h3>第二步</h3>
<blockquote>
<p>全局安装npm install -g cordova-hot-code-push-cli(前提是node环境已经配置好),安装完成后执行cordova-hcp server查看是否正常。如果运行报错则有可能是因为端口占用。</p>
</blockquote>
<h3>第三步</h3>
<blockquote>
<p>在服务器可访问路径下创建一个目录,比如:hotcode 或者其他目录都行</p>
</blockquote>
<h3>第四步</h3>
<blockquote>
<p>在项目的根目录app下新建一个cordova-hcp.json的文件添加以下内容:</p>
</blockquote>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">test</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">autogenerated</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">release</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2016.11.08-15.13.26</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">content_url</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">你的服务器访问路径/hotcode</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">update</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">resume</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p>&nbsp;</p>
<p>【name】:项目名称</p>
<p>【<span style="color: rgba(128, 0, 0, 1)">autogenerated</span>】:不设置或者false不会自动更新</p>
<p>【ios_identifier】:ios开发者识别号</p>
<p>【android_identifier】:android包名</p>
<p>【update】:何时触发进行安装(install)代码热更新</p>
<blockquote><strong>Tips:</strong><br>代码热更新涉及两个主要过程:fetch update 和 install update。前者获取热更新变更文件,后者将获取到的更新文件安装到 App 中生效。此字段是针对后者,何时 install update,可选值:<br>i、<code>start</code>:应用启动,默认项(install update when application is launched)<br>ii、<code>resume</code>:应用从后台恢复(install the update when application is resumed from background state)【推荐】<br>iii、<code>now</code>:下载更新后立即执行(install update as soon as it has been downloaded)</blockquote>
<p>【content_url】:web 项目文件在服务器上的存储路径(即 www 目录在云存储中的目录路径),热更新插件将此 URL 作为 base url,用于下载配置文件和项目更新文件(必需的配置项)</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 18pt">修改vue项目</span> </strong></p>
<p><span style="font-size: 14pt; color: rgba(255, 0, 0, 1)">(一)增加cordova.js引用&nbsp; </span></p>
<p><img src="https://img2020.cnblogs.com/blog/782227/202011/782227-20201111112341917-18960444.png"></p>
<p>打包会copy www目录下的文件到下图路径 并备份到 \platforms\android\app\src\main\assets\www 目录 所以 上图的引用是找得到的</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/782227/202011/782227-20201111124100247-1802389067.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt; color: rgba(255, 0, 0, 1)">(二) vue项目src目录下增加update.js文件 <br></span></p>
<p><span style="font-size: 14pt; color: rgba(255, 0, 0, 1)">相关事件参考插件的wiki &nbsp;&nbsp; https://github.com/nordnet/cordova-hot-code-push/wiki/Check-if-update-was-loaded-and-ready-to-be-installed</span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> app =<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Application Constructor</span>
<span style="color: rgba(0, 0, 0, 1)">    initialize: function () {
      document.addEventListener(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">deviceready</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(0, 0, 255, 1)">this</span>.onDeviceReady.bind(<span style="color: rgba(0, 0, 255, 1)">this</span>), <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      document.addEventListener(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">resume</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 0, 255, 1)">this</span>.onDeviceReady.bind(<span style="color: rgba(0, 0, 255, 1)">this</span>), <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
    },
    onDeviceReady: function () {

      let chcp </span>=<span style="color: rgba(0, 0, 0, 1)"> window.chcp;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检测更新</span>
      chcp.fetchUpdate((error, data) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">进度条</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, data.progress);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检测是否是否可以进行安装了,双重判断吧,有时候会出现有更新版本但是暂时无法安装的情况(也可以去掉这一层)</span>
            chcp.isUpdateAvailableForInstallation((error, ckeckData) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
                  console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Nothing to install. Executing fetch.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">
                }

                chcp.fetchUpdate((error, data) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
                        console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Failed to load the update with error code: </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> error.code);
                        console.log(error.description);
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                  console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fetchUpdate:</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> data);
                  let msg </span>=<span style="color: rgba(0, 0, 0, 1)"> `当前版本:${ckeckData.currentVersion}, 新版本:${ckeckData.currentVersion}`
                  console.log(msg);
                  
                  chcp.installUpdate((error) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
                            console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Failed to install the update with error code: </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> error.code);
                            console.log(error.description);
                        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                            console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Update installed!</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
                        }
                  })
                });

            });
      });

    },
};

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> app;</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt; color: rgba(255, 0, 0, 1)">&nbsp;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>然后再main.js 调用下 或者直接写在main.js也行</p>
<div class="cnblogs_code">
<pre>import up <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./update</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
up.initialize();</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>第五步:</h3>
<blockquote>
<p>在vue路径下 执行 yarn build 会在父级目录(也就是cordova根目录下的www文件夹下生成打包后的html,css,js文件)</p>
<p>在cordova项目根目录下运行 cordova-hcp build,运行后会在www目录下生成chcp.json和chcp.manifest文件</p>
</blockquote>
<h3>第六步:</h3>
<blockquote>
<p>将cordova项目中的www目录下所有文件上传到服务器刚才新建的目录hotcode下面</p>
</blockquote>
<h3>第七步:</h3>
<blockquote>
<p>将以下代码加入项目的config.xml中,然后运行cordova build</p>
</blockquote>
<div class="cnblogs_code">
<pre>&lt;chcp&gt;
    &lt;config-file url=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">你的服务器访问路径/hotcode/chcp.json</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;auto-download enabled=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;auto-install enabled=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;native-<span style="color: rgba(0, 0, 255, 1)">interface</span> version=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span>
&lt;/chcp&gt;</pre>
</div>
<p>【config-file】:配置文件chcp.json从服务器上加载的路径(必填)</p>
<p>【auto-download】:是否自动下载热更新代码,默认是 true</p>
<p>【auto-install】:是否自动安装热更新代码,默认是 true</p>
<p>【native-interface】:当前 native side 的版本号</p>
<p>&nbsp;</p>
<h3>第八步:</h3>
<blockquote>
<p>每次代码更新 就重复56步骤, app就会热更新</p>
</blockquote>
<p>&nbsp;</p>
<hr>
<h2>之前基本是在客户端打开后自动请求后台自动更新,如果想要客户端提示更新...</h2>
<h3>第九步</h3>
<blockquote>
<p>将第七步中加入的代码 进行修改如下:</p>
<p>插件的wiki都给出了详细的步骤&nbsp;&nbsp; https://github.com/nordnet/cordova-hot-code-push/wiki/Check-if-update-was-loaded-and-ready-to-be-installed</p>
</blockquote>
<div class="cnblogs_code">
<pre>&lt;chcp&gt;
    &lt;config-file url=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">你的服务器访问路径/hotcode/chcp.json</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;auto-download enabled=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">false</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;auto-install enabled=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">false</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;native-<span style="color: rgba(0, 0, 255, 1)">interface</span> version=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span>
&lt;/chcp&gt;</pre>
</div>
<p>&nbsp;</p>
<blockquote>
<p>update.js中的代码就可以这样写&nbsp; 提示框可以换成自己的ui框架中的</p>
</blockquote>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> app =<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Application Constructor</span>
<span style="color: rgba(0, 0, 0, 1)">    initialize: function () {
      document.addEventListener(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">deviceready</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(0, 0, 255, 1)">this</span>.onDeviceReady.bind(<span style="color: rgba(0, 0, 255, 1)">this</span>), <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      document.addEventListener(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">resume</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 0, 255, 1)">this</span>.onDeviceReady.bind(<span style="color: rgba(0, 0, 255, 1)">this</span>), <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
    },
    onDeviceReady: function () {

      let chcp </span>=<span style="color: rgba(0, 0, 0, 1)"> window.chcp;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检测更新</span>
      chcp.fetchUpdate(() =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检测是否是否可以进行安装了,双重判断吧,有时候会出现有更新版本但是暂时无法安装的情况(也可以去掉这一层)</span>
            chcp.isUpdateAvailableForInstallation((error, ckeckData) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
                  console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Nothing to install. Executing fetch.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">
                }

                chcp.fetchUpdate((error, data) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
                        console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Failed to load the update with error code: </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> error.code);
                        console.log(error.description);
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                  console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fetchUpdate:</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> data);
                  let msg </span>=<span style="color: rgba(0, 0, 0, 1)"> `更新提示\n当前版本:${ckeckData.currentVersion}, 新版本:${ckeckData.currentVersion}`
                  console.log(msg);

                  </span><span style="color: rgba(0, 0, 255, 1)">var</span> r =<span style="color: rgba(0, 0, 0, 1)"> confirm(msg);
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span>(r == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">){
                        chcp.installUpdate((error) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
                              console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Failed to install the update with error code: </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> error.code);
                              console.log(error.description);
                            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                              console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Update installed!</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
                            }
                        })
                  }
                });

            });
      });

    },
};

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> app;</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/782227/202011/782227-20201111194958562-453693900.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>参考 https://github.com/Kelichao/cordova/issues/6</p><br><br>
来源:https://www.cnblogs.com/xtxtx/p/13960548.html
頁: [1]
查看完整版本: cordova混合App开发:Cordova+Vue实现Android APP开发 (热更新) (六)