快应用初学杂记

223 阅读6分钟

快应用的学习与使用

我这里只会写一下文档中没有展示或者不好理解的东西,其余内容需要阅读官方文档

快应用官方文档:doc.quickapp.cn/

快应用组件文档:vivoquickapp.github.io/apex-ui-doc…

OPPO快应用开放平台:open.oppomobile.com/new/searchW…

小米开放平台:dev.mi.com/distribute/…

华为开放平台:developer.huawei.com/consumer/cn…

一.基本组件

基本组件与html一致,但值得注意的是,在快应用中,想要显示文字需要加上标签,直接在div中书写无法显示文字,其余标签格式与vue2一致

 <template>
     <div>
     
     </div>
 </template>
 <script></script>
 <style></style>

并且在style中,不用加上vue中的scoped标识

快应用样式默认以display:flex布局形式展现

其余内容可以翻阅快应用官方文档:doc.quickapp.cn/

重要组件

在项目中,个人认为最重要的组件就是广告组件,因为在其他地方没有见过,并且在快应用官方文档也没有看到关于这个组件的说明,其表现形式为:

以下案例为原生渲染2.0方式:

   <div class="nativeAdContainer" if="{{ showAd }}">
       <ad
         adid="需要用到的广告id,去手机运营平台申请,例如vivo广告联盟"
         class="ad-native"
         onerror="adError(err,evt)"
         onadclick="adClick"
         onadclose="adClose"
         type="native"//native就是原生广告,其余还有banner广告等等
       >
         <ad-clickable-area class="ad-content">
           <stack class="left">
             <image src="{{ adData.icon }}"></image>
             <div class="ad-mask"><text>广告</text></div>
           </stack>
           <div class="center">
             <div class="ad-title">
               <text>{{ adData.title }}</text>
             </div>
             <div class="ad-desc">
               <text>{{ adData.desc }}</text>
             </div>
           </div>
           <div class="right">
             <block if="{{ !isUseNewVersion }}">
               <div class="ad-clickbtn">
                 <text>{{ adData.clickBtnTxt }}</text>
               </div>
             </block>
             <block else>
               <ad-clickable-area class="ad-clickbtn" type="button">
               </ad-clickable-area>
             </block>
           </div>
         </ad-clickable-area>
         <div class="ad-close" if="{{ !isUseNewVersion }}" onclick="onclose">
           <text>关闭</text>
         </div>
       </ad>
     </div>

其中是用来展示广告的组件,是用来盛放广告的内容,当点击广告时便会触发ad的onadclick事件,关闭时便会触发onadClose事件,当然这些事件内容需要手动定义

在不同厂商中,组件的命名和展示大多相同,如vivo和OPPO小米,等,但在华为中,华为的例子提到了stack组件,但是stack依然是内容组件,个人认为用不用全凭自身习惯

二.广告事件

既然提到了广告组件就不得不说关于广告的事件,在快应用中,用到的路由,请求接口等需要额外引入,并且要在manifest.json中声明,而广告事件引入方式为

 import ad from '@service.ad'

这就是快应用自带的广告请求方式

首先第一步,请求广告

 //请求广告
 const ad=await ad.preloadAd({
     adUnitId: adid,//adUnitid为在广告联盟中申请到的广告位id
     type: 'native',//type为广告类型,这里为原生广告
 })
 //或者
 ad.preloadAd({
     adUnitId: adid,//adUnitid为在广告联盟中申请到的广告位id
     type: 'native',//type为广告类型,这里为原生广告
     success: (data) => {
      //这里的adList是用来渲染原生广告的内容
     this.adList = data.adList
   }, fail: (data, code) => {
     console.log(data, code)
   }
 })

这里需要注意的是,在不同厂商中,用到的广告请求参数并不相同,例如这里的例子是vivo,但是在OPPO中,需要额外参数adCount,来表示请求广告的数量,这里需要看不同的厂商开发文档来做具体的代码

第二步就是拿到请求的广告内容去做页面的渲染

例如this.adList=ad.data.adList[0]拿到内容做页面渲染,渲染方式与vue一致,但值得注意的是,在vue中的v-if和v-for在快应用中直接是if和for,其余并无差别,并且点击事件我们这里不需要做额外考虑,当用户点击时,ad组件会自动和广告做配合,跳转到某个广告视频或者页面中,我们需要考虑的是,在adclick中所做的回传转化

刚开始我并不明白回传转化是什么意思,这里用我的理解方式做一个说明,当广告投放或者买量时,会有用户点击或者曝光(曝光就是广告展示出来),当满足一定条件时,我们需要给投放平台,例如快手,抖音,发送请求来观察广告情况并且转现

每个平台需要的内容并不相同,这里需要阅读官方文档

三.落地页面url上后面的参数是怎么拿

这一点官方文档确实很烂,我认为这个东西很重要,但是文档一点都没有体现,我在这里做详细说明

在首页中,快应用生命周期有一个是onInit(),他的第一个参数就是页面?后面的内容,例如页面参数为?a=‘1’&b=2&c=3,那么在快应用中

 ​
 onInit(e){
   console.log(e)
 }
 //展现形式为
 {
     a:'1',
     b:'2',
     c:'3'
 }

值得注意的是,无论在页面上是字符串还是数字,那么拿到时都是字符串

在此项目中,快应用打开方式为平台→广告→落地页→快应用,其中平台为投放平台,例如快手,抖音等平台,当用户点击时便会进入广告短视频等,这里与开发无关,短视频再点击时便会进入落地页,这里的落地页就是一个h5页面,只不过运营人员在运营时把h5页面的地址告诉了官方,并且携带了参数,例如www.xxx.com?a=1&b=2&c=3,当用户点击广告就会进入这个页面,而这个页面内所做的事情就是打开快应用,其中有一个deepLink链接,就是hap形式,这里文档都有写,他会把www的链接问号后面参数与hap链接拼接,打开快应用,表现形式为hap://app/包名/pages/Protal?a=1&b=2&c=3,这时候便会进入到快应用中,而快应用页面Protal便会在onInit中收到后面参数再做一系列处理

四.关于app.ux和manifest.json

在快应用中,app.ux并不是像vue中的app.vue一样,而是更像vuex或者pinia那样作为公共储存的地方

这里写的所有内容,方法,变量等可以直接从任意页面利用this.$app.内容拿到,也可以直接赋值(这里存疑,但是我成功了)

而在mainifest.json中更多的作用是声明使用的接口

  "features": [
     {
       "name": "system.prompt"
     },
     {
       "name": "system.router"
     },
     {
       "name": "system.shortcut"
     },
     {
       "name": "system.fetch"
     },
     { 
       "name": "service.ad"
     },
     {
       "name": "system.storage"
     },
     {
       "name": "system.app"
     }
   ],

和添加页面配置路由

  "router": {
     "entry": "pages/Portal",
     "pages": {
       "pages/Demo": {
         "component": "index"
       },
       "pages/Search": {
         "component": "index"
       },
       "pages/Home": {
         "component": "index"
       },
       "pages/Tabbar": {
         "component": "index"
       },
       "pages/My": {
         "component": "index"
       },
       "pages/Portal": {
         "component": "index"
       },
       "pages/Details": {
         "component": "index"
       },
       "pages/CleanUp": {
         "component": "index"
       },
       "pages/Signal": {
         "component": "index"
       },
       "pages/ShowAd": {
         "component": "index"
       },
       "pages/Yszc": {
         "component": "index"
       },
       "pages/Yhxy": {
         "component": "index"
       }
     },
          "display": {
     "fullScreen": false,
     "statusBarImmersive": false,
     "titleBarBackgroundColor": "#f2f2f2",
     "titleBarTextColor": "#414141",
     "pages": {
       "pages/Demo": {
         "titleBarText": "",
         "titleBar": false
       },
       "pages/Home": {
         "titleBarText": "",
         "titleBar": false
       },
       "pages/Tabbar": {
         "titleBarText": "",
         "titleBar": false
       },
       "pages/My": {
         "titleBarText": "",
         "titleBar": false
       },
       "pages/Portal": {
         "titleBarText": "",
         "titleBar": false,
         "menuBarData": {
           "menuBar": false
         }
       },
       "pages/Search": {
         "titleBarText": "",
         "titleBar": false
       },
       "pages/Details": {
         "titleBarText": "",
         "titleBar": false
       },
       "pages/CleanUp": {
         "titleBarText": "",
         "titleBar": false,
         "menuBarData": {
           "menuBar": false
         }
       },
       "pages/Signal": {
         "titleBarText": "",
         "titleBar": false,
         "menuBarData": {
           "menuBar": false
         }
       },
       "pages/ShowAd": {
         "titleBarText": "",
         "titleBar": false,
         "menuBarData": {
           "menuBar": false
         }
       },
       "pages/Yszc": {
         "titleBarText": "",
         "titleBar": false,
         "menuBarData": {
           "menuBar": false
         }
       },
       "pages/Yhxy": {
         "titleBarText": "",
         "titleBar": false,
         "menuBarData": {
           "menuBar": false
         }
       }
     }
   }

值得注意的是,当改变了这个文件内容,无论是添加页面还是其他,需要在右下角的预览设置中,重新启动编译,否则无论写的什么内容都无法生效

最后,当打包评审时,需要在manifest中给minPlatformVersion和versionCode+1,是大版本加1,不用考虑小版本问题,否则评审可能会不通过