v5App FAQ

Q:APP 修改密码提示修改成功,但重新登录密码没修改成功
A:找到文件路径,将 java 文件放入即可ProductPadCommController.zip
例:文件相对路径com/epichust/unimax/appcloud/web/ProductPadCommController.java
则进入路径com/epichust/unimax/appcloud/web下,将java文件放入

Q:
1、使用 APICloud 创建新项目,使用 V5App 代码,提示调用模块失败 (模块正常引用情况下)
2、App 新建项目打包或真机调试时 状态栏跟页面顶部重合
3、App 自动更新出现问题
A:需检查在 config.xml 中有没有该行标签<preference name="userAgent" value="APICloud"/>,如没有需要添加

Q:App 使用 replaceAll() 方法替换空格报错
A:使用 replace(/s+/g,"") 方法替换 replaceAll()

Q:安装 node-sass 报 phyon 错误
A:重新设置淘宝源

$ npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

Q:App 更新问题

近期有项目反应,App 更新会出现大版本更新不上去问题,例如 0.0.100 版本 更新到 0.1.0 版本失败;

A:经问题分析与定位发现,是前台 App 做版本检测的时候没有进行完全校验

问题代码如下

//  login.html页面
let reslut = res.data.data.split(":"); // 检测服务器上的App版本 例如 S:0.0.100
	if (reslut[0] == "S") {
        let serverVersion = Number(reslut[1].replace(/\./g, "")); // 这里做了点号清除,值为 00100
        let thisVersion = Number(myVersion.replace(/\./g, ""));  // 本地版本 0.1.0 => 010
    }
// 上述版本进行比较,会大版本检测失败,导致重复更新安装问题

优化后代码

//  login.html页面

// 在methods代码下 新增方法
methods:{
    ...
        /**
     * 比较版本号
     * version1 > version2 返回 1
     * version1 > version2 返回 -1
     * version1 = version2 返回 0
     */
    compareVersion(version1, version2) {
      // 将两个版本号切割成由修订号组成的数组
      const arr1 = version1.split(".");
      const arr2 = version2.split(".");

      // 比较两个数组的长度,得到最大的数组长度 默认为3
      const maxLength = Math.max(arr1.length, arr2.length);

      // 遍历数组,分别比较同一个位置上的版本号
      for (let i = 0; i < maxLength; i++) {
        // 从左到右依次比较版本号
        const a = arr1[i] || 0;
        const b = arr2[i] || 0;
  
        if (Number(a) > Number(b)) {
          return 1;
        } else if (Number(a) < Number(b)) {
          return -1;
        }

        // 对比结束的时候,就返回 0
        if (i === maxLength - 1) {
          return 0;
        }
      }
    },
},
// 定位到问题代码 进行更改
let reslut = res.data.data.split(":");
if (reslut[0] == "S") {
    let serverVersion = reslut[1];
    let thisVersion = myVersion;
    if (serverVersion.length != 3 || thisVersion.length != 3) {
        window.api.toast({
            msg: "版本号出错",
            duration: 2000,
            location: "middle",
        });
    }
    // 1 为前大于后 -1 后大于前 0 前等于后
    let updateControl = this.compareVersion(serverVersion, thisVersion);
    if (updateControl === 1) {
        ...
    }else if(updateControl === -1){
        ...
    }
}

在 Mine 页面,checkUpdate()检查更新方法 做相同修改
Q:ApiCloud 模块 调用 cameraTool 失效替代方法

image.png

A:

可以使用 ApiCloud 自带的 window.api.getPicture + UIImageEdit + trans 实现图片拍照加编辑功能

getPicture() {
      const UIImageEdit = window.api.require("UIImageEdit");
      const trans = window.api.require("trans");
      let imgBase64 = "";
      let img = "";

      window.api.getPicture(
        {
          sourceType: "camera", // 默认打开相机
          encodingType: "jpg",  // jpg/png
          mediaValue: "pic",	
          destinationType: "url",
          allowEdit: true,
          quality: 100,         // 拍照质量
          saveToPhotoAlbum: false,
        },
        (res, err) => {
          if (res) {
            UIImageEdit.open(
              {
                path: res.data, // 图片路径
                savePath:
                  "fs://test/" +
                  res.data.split("/")[res.data.split("/").length - 1],
              },
              (result) => {
                let savePath = result.savePath;
                trans.decodeImgToBase64(
                  {
                    imgPath: savePath,
                  },
                  (ret, err) => {
                    if (ret.status) {
                      // alert(JSON.stringify(ret));
                      imgBase64 = "data:image/jpg;base64," + ret.base64Str;
                      img = ((dataurl, filename) => {
                        let arr = dataurl.split(",");
                        let mime = arr[0].match(/:(.*?);/)[1];
                        let bstr = atob(arr[1]);
                        let n = bstr.length;
                        let u8arr = new Uint8Array(n);
                        while (n--) {
                          u8arr[n] = bstr.charCodeAt(n);
                        }
                        return new File([u8arr], filename, { type: mime });
                      })(
                        imgBase64,
                        res.data.split("/")[res.data.split("/").length - 1]
                      );
                      this.imags.push({
                        name: res.data.split("/")[
                          res.data.split("/").length - 1
                        ],
                        type: "jpg",
                        file: img,
                        image: URL.createObjectURL(img), // 可通过 iframe 标签展示
                        img:imgBase64  // base64图片 可通过 img 标签展示
                      });
                    } else {
                      alert(JSON.stringify(err));
                    }
                  }
                );
              }
            );
          } else {
            api.alert({
              msg: JSON.stringify(err),
            });
          }
        }
      );
    }