北京政务服务平台(Ionic/Vue3 移动端) 问题记录

目录

1. 北京政务 App 打包流程、调试流程

1.1 debug 包(调试包)

1.2 release 包(正式包)

1.3 包名包含 public 后,导致打包失败的解决方案

1.4 如何进行手机 usb 调试?

1.5 如何进行 Android Studio 快速打包安装?

2. 解决 北京政务 App 在真机上无法访问网络的问题

3. 替换 App 应用名 / 包名 / 唯一标识 scheme

4. ionic 可直接修改标签样式,elementplus 不可

5. 为什么在 vue3 项目中,要引入 ionic 组件

6. 如何使用 ionic 主题色 variables.css

7. async/await VS promise.all()【select and list】

8 ion-select 自带属性 和 自定义配置项 会同时生效

9. 区分Vue3 获取路由信息、路由跳转

10. iframe 涉及的谷歌安全策略,实现单点登录存在的问题

11. Ionic 安装 capacitor 插件的三行命令的含义


1. 北京政务 App 打包流程、调试流程

1.1 debug 包(调试包)

Vue3/Ionic 打包需要依靠 Android Studio + 命令行工具,环境配置类似于 Angular/Ionic

在项目根目录下,任意命令行工具中,执行如下操作:

  1. 添加平台: ionic capacitor add android 【结束后命令行换行】
  2. 构建 原生app 资源:ionic capacitor build android 【结束后命令行换行,且自动打开 Android Studio 执行下述操作(构建app)】
  3. 构建完 原生app 资源之后,自动通过 Android Studio 构建 app 【可以观察面板右下角,会显示构建进度,初次构建app会比较慢】 
  4. 点击 Android Studio 导航栏中的 Build → Build Bundles/APKs → Build APKs 【通过下方导航条的 build 可以查看打包进度】

后续在 vscode 中编写app,需要将 vscode 中的 静态资源/插件 更新到 Android Studio 中,执行下面两条命令的任意一条

  • ionic capacitor update android
  • ionic capacitor sync(推荐)

我的电脑上执行第一条不太行,执行第二条可以成功同步

同步完成之后,再次执行 Build APKs,即可获得新的 .apk 文件

1.2 release 包(正式包)

如果没有安装 node_modules 依赖的话,是无法进行打包操作的,测试包也不行

正式包,又名 release 包,无法进行联机调试操作(手机调试),debug 包才能进行联机调试

调试时,可以通过 chrome://inspect 查看控制台,也可以通过 Android Studio 打断点

release 包 的打包步骤,和 debug 包 的打包步骤,基本一致,如下所示:

添加平台:ionic capacitor add android

打包静态资源(比 debug 多了 --prod):ionic capacitor build android --prod  执行完这个命令之后,css/js 会被压缩

点击 Android Studio 这里进行正式打包:

 
打正式包,需要添加公司的签名文件: 

 

接下来,选择 release,代表打正式包:

 

1.3 包名包含 public 后,导致打包失败的解决方案

在 vscode 中,修改 capacitor.config.json 里的包名,再执行 ionic capacitor sync

发现代码无法同步到 Android Studio 上,后者包名一直包含 public,没被修改

解决方案:

  • 删除 android 文件夹(相当于移除平台),此时要关闭 Android Studio,否则 android 文件夹处于被占用状态,无法进行删除;然
  • 后重新添加平台,打包静态资源,开始打包

1.4 如何进行手机 usb 调试?

连接手机,将手机调到 开发者模式,下面以小米手机为例:

  • 设置-我的设备-全部参数-MIUI版本 —— 不断点击 MIUI版本 即可进入开发者模式
  • 设置-更多设置-开发者选项 —— 打开 开启开发者选项 / USB调试 两个开关
  • 连接手机后,手机跳出提示框,选择 “文件传输”,而不是 “仅充电”

在 chrome 中输入:chrome://inspect 回车,进入如下页面,点击 inspect

加载不出来?不要着急,因为这个窗口必须挂 VPN 才可以打开

这样,我们对手机的操作,就会反映在浏览器中,同时还能看控制台

有时由于数据线连接出现问题,或者手机本身权限没打开,都可能导致无法连接

此时可以重启手机,或者检查数据线等等

1.5 如何进行 Android Studio 快速打包安装?

为什么要这样调试呢?
原来都是把 build 好的 apk 文件,通过 qq 发送到手机安装,非常麻烦
其实 Android Studio 可以直接将打包好的程序安装到手机上,步骤如下:

首先,确定需要打包的项目已经在 Android Studio 中打开
必须确保打开的是某项目执行 capacitor 添加平台命令之后的 android 文件夹,只有他才可以打包
直接将整个项目在 Android Studio 中打开,是无法进行调试及打包的

接着,需要保证手机已经开启 USB 调试模式,并链接至电脑
在Android Studio 界面又设备链接的标志,如下图所示:

 

在 Android Studio 中,打开如下窗口,点击 Run 

会出现下面的窗口,点击 Run,就会自动执行编译(Build)操作,并自动将最新的应用安装到手机上

有的时候会出现提示,是否打断手机上当前正在运行的程序,选择 Tr... 就行

2. 解决 北京政务 App 在真机上无法访问网络的问题

在 res/xml 下,创建 network_security_config.xml 文件,并添加如下内容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

接着,在 AndroidManifest.xml 文件下的 application 标签中,增加以下属性:

<application
  ...
  android:networkSecurityConfig="@xml/network_security_config"
  ...
/>

3. 替换 App 应用名 / 包名 / 唯一标识 scheme

AndroidManifest.xml 是 app入口文件

从下图的位置可以点进配置 App 应用名 / 包名 / 唯一标识 scheme 的文件 【必须是在 Android Studio 中才能点进去】

 点开之后长这样子:

唯一标识的作用:比如我从 a应用 跳转到 b应用,就需要 b应用的唯一标识

包名命名规则:域名反向+项目名

4. ionic 可直接修改标签样式,elementplus 不可

ionic 在 <style lang="scss" scoped> 中,可以直接修改标签样式

  • ion-label {
      display: flex !important;
      height: 40px;
    }

需要区分 element-plus,在带 scoped 标签下修改它时,是通过 类名(不是标签名)修改样式,且需要添加 :deep()

5. 为什么在 vue3 项目中,要引入 ionic 组件

在 vue3 中使用 ionic 时,页面中用到的 ionic 组件,都需要引入,举个栗子:

import { IonList, IonItem, IonLabel, IonThumbnail } from '@ionic/vue'
components: { IonList, IonItem, IonLabel, IonThumbnail },

如果不声明组件,也可以正常使用 ionic 组件,但网页会把他们当成 web component,而不是 Vue组件,也就是说,不能使用类似于 v-model 的 Vue 语法

举个栗子:

ion-select 组件,绑定的值是通过 :value="xx" 这么写的,但是这么写不是响应式的

在 vue 里通过 v-model 进行双向绑定实现响应式,而 ion-input 上不能直接使用 v-model 替代 :value,因为他是 web component

如果想在 ion-input 上使用 v-model 的话,需要将 ion-input 进行引入并声明

6. 如何使用 ionic 主题色 variables.css

 variables.css 中有常见的主题色变量,可以把 自定义颜色 放在该文件的 :root { } 里

在 ionic 中,使用 主题色变量/全局变量:

  • ion-content {
      --background: var(--bg-color-black);
    }

全局样式文件,可以在 assets/style/ 中创建文件,并在 main.ts 中进行引入

ionic 的全局样式,就可以在上述文件中修改

7. async/await VS promise.all()【select and list】

promise.all() 获得的 成功结果数组里的 数据顺序,和 promise.all() 接收 异步方法数组的 顺序是一致的

举个栗子:假设执行 promise.all([p1, p2]),即便 p1 结果 获取的比 p2结果晚,最终 p1结果在前

作用:没有逻辑关系的异步方法,在 onMounted 中同时调用

注意:promise.all() 让方法同时执行,而不是先后执行

async/await 可以控制方法执行的顺序,不是同步执行异步方法

假设现在有一个页面:里面包含了需要接口请求的下拉框及列表,列表的内容是根据下拉框的内容决定的,此时就应该考虑 async/await 决定异步请求顺序

也就是说,必须 await 下拉框请求,且拿到结果之后,才能执行列表获取请求

此时不能使用 promise.all(),因为此方法只能保证结果获取的顺序,而不能保证方法执行的顺序,也就是说,会同时执行 下拉框获取 / 列表获取 两个方法,而不是先执行下拉框获取并且拿到结果,再执行列表获取方法

8 ion-select 自带属性 和 自定义配置项 会同时生效

自带属性:cancelText="取消" 

自定义配置项: :interface-options="customActionSheetOptions"

  •     const customActionSheetOptions = {
          cssClass: 'my-custom-interface', // 自定义类名
          header: '事件类型', // 下拉框标题
          translucent: true, // 让选中项高亮
        };
<ion-select
  v-model="eventTypeModel"
  @ionChange="handleSecOrInpChange($event)"
  cancelText="取消"
  :interface-options="customActionSheetOptions"
  interface="action-sheet"
>
    <ion-select-option
        v-for="(item, index) of eventTypeOptions"
        :value="item.value"
        :key="index">
              {{ item.label }}
    </ion-select-option>
</ion-select>

关于双向绑定:

  • 官方给的示例是 :value="eventTypeModel" 绑定下拉框当前绑定的值
  • 如果想使用 vue 实现 --- 双向绑定 --- 的话,可替换为 v-model="eventTypeModel"
  • 引入和声明 ionic 组件之后,才能让浏览器把它们当成 vue 组件,识别 vue 语法哦

关于下拉框列表获取方式【枚举 vs 接口获取】:

  • 应该通过接口获取下拉框列表
  • 假设本地使用了枚举,如果需求变更,就需要修改枚举,重新打包发布 app,并让用户安装以获取更新,用户体验感会降低,因此必须使用接口获取下拉列表

使用枚举示例:

  • // 事项类型枚举
    export enum eventType {
      XZXK = '行政许可',
      XZQR = '行政确认',
    }
  • // 下拉框双向绑定的值
    eventTypeModel: eventType.XZXK,
          // 下拉框列表
          eventTypeOptions: [{
            value: eventType.XZQR,
            label: eventType.XZQR,
          }],

当下拉框列表发生变化时,可在 html 中传入 $event,监听变化

$event.detail 可以查看当前绑定的 value

  •     const handleSecOrInpChange = (ev: any) => {
          console.log(ev.detail)
        };

9. 区分Vue3 获取路由信息、路由跳转

路由跳转并传参【动词,router】

  • import { useRouter } from 'vue-router';
    const router = useRouter();

          router.push({
            path: 'projectListPage',
            query: {
              eventName: item.eventName,
            },
          });

路由参数获取【名词,route】

  • import { useRoute } from 'vue-router'
    const route = useRoute();
    eventName: route.query.eventName,

10. iframe 涉及的谷歌安全策略,实现单点登录存在的问题

此项目 单点登录 的原理:在 tabs 页面中,添加了一个不可见的 iframe,该 iframe 调用了接口,存储了 cookie,实现单点登录

即,在此 app 登录之后,其他使用同一 ou 登录的应用,也自动登录了,无需手动登录

    <!-- 单点登录 -->
    <iframe
      src="iframeSrc"
      sandbox="allow-scripts allow-same-origin"
      style="display: none"
    ></iframe>

随着谷歌版本的升级,浏览器不再支持这种不安全的策略,会报错 

网上给的解决方法是,添加 sandbox="xxx"(报错里给的信息),但是这个解决方法不奏效,目前还没有很好的解决方法 

移动端现在不会出现这种问,,因为 移动端浏览器版本 还没有 pc端浏览器版本高,低版本浏览器尚不存在这种安全策略

11. Ionic 安装 capacitor 插件的三行命令的含义

如上图所示,Ionic 官网一般会给出三行命令安装 capacitor 插件

第一条是使用 npm 安装 cordova 插件

  • 此时安装的插件仅支持 es 写法,不支持 ts 写法

第二条是使用 npm 安装 ionic 封装过的 cordova 插件

  • 此时插件支持 ts 写法;一般情况下,我们可以不用安装这些,因为个别插件即使安装了这个,若不用 es 写,还是容易出现问题;(参考我之前使用 FileTransfer 插件监听下载进度时,因为将 funciton() {} 写成了 () => {} 这种形式,导致了 onprogress 监听失败)

第三条命令是同步命令

  • 一般情况下,我们在 vscode 中执行完安装 capacitor 插件命令后,需要将安装的插件同步到 Android Studio 中进行打包;又或者更改了 vscode 中的代码,想要将最新代码同步到 Android Studio 中,此时就需要执行这个同步命令;同步命令中的 cap 其实就是 capacitor 的简写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lyrelion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值