首页 > 其他分享 >【快应用】快应用中开屏广告模拟

【快应用】快应用中开屏广告模拟

时间:2023-10-25 14:47:36浏览次数:29  
标签:adData false ad 开屏 nativeAd 广告 应用 模拟 native

​ 【关键词】

开屏、原生广告、stack

 

【问题背景】

快应用中目前暂时不支持开屏广告,开发者如想在应用启动时展示广告,可以在快应用中用原生广告来模拟替代,从而来实现开屏广告的效果。

 

【问题分析】

实现上是比较简单的,首先需要将首页替换成一个只有原生广告展示的ux页面,然后在展示几秒后,通过router接口跳转到快应用的实际首页。

同时在模拟的开屏广告页上还需要加个关闭广告的按钮,可以点击后提前关闭广告跳转到后续页面。

 

【解决方案】

布局方面实现:

1、  由于原生广告返回的可能是图片或者视频,需要使用stack组件将它们堆叠在一起实现,后续可以根据原生广告请求返回的值来决定使用image还是video组件。

    <stack class="stackstyle" onclick="reportNativeClick()">

      <image if="native.isShowImg" class="img" src="{{native.adImgSrc}}"></image>

      <video id="video" if="native.isShowVideo" src="{{native.adVideoSrc}}" autoplay="true" onclick="reportNativeClick()" class="video"></video>

    </stack>

2、  关闭按钮实现,通过position属性将关闭按钮固定在右上角。

<text class="closebtn" onclick="closeAd">关闭{{value}}</text>

    .closebtn {

      width: 80px;

      height: 60px;

      border-radius: 30px;

      font-size: 25px;

      text-align: center;

      border: 1px solid #d1cdcd;

      right: 10;

      top: 10;

      position: absolute;

    }

主要逻辑代码实现:

1、  开屏广告的请求与展示(其实就是原生广告的请求与展示)

2、  通过定时器来实现一个倒计时效果,在广告展示几秒后自动跳转下一页面。

3、  关闭按钮点击,关闭广告展示和立即跳转下一页面。

        onShow(options) {

            '// Do something .'

            this.showNativeAd()

            this.cutdown()

            setTimeout(() => {

                router.replace({

                    uri: '/Hello',

                })

            }, 4000);

        },

        cutdown() {

            var timer = setInterval(() => {

                this.value--

            }, 1000);

            if (this.value === 0) {

                clearInterval(timer);

            }

            console.log(222);

        },

【完整代码】

<template>

  <!-- Only one root node is allowed in template. -->

  <div class="container">

    <stack class="stackstyle" onclick="reportNativeClick()">

      <image if="native.isShowImg" class="img" src="{{native.adImgSrc}}"></image>

      <video id="video" if="native.isShowVideo" src="{{native.adVideoSrc}}" autoplay="true" onclick="reportNativeClick()" class="video"></video>

    </stack>

    <text class="closebtn" onclick="closeAd">关闭{{value}}</text>

  </div>

</template>

 

<style>

    .container {

      flex-direction: column;

      justify-content: center;

      align-items: center;

    }

 

    .title {

      font-size: 100px;

    }

    .img {

      width: 100%;

      height: 100%;

      object-fit: fill;

    }

    .video {

      width: 100%;

      height: 100%;

    }

    .stackstyle {

      width: 100%;

      height: 100%;

    }

    .closebtn {

      width: 80px;

      height: 60px;

      border-radius: 30px;

      font-size: 25px;

      text-align: center;

      border: 1px solid #d1cdcd;

      right: 10;

      top: 10;

      position: absolute;

    }

</style>

 

<script>

    import ad from '@service.ad';

    import prompt from '@system.prompt';

    import router from '@system.router';

    let nativeAd;

    module.exports = {

        data: {

            componentName: "ad",

            provider: "",

            native: {

                adUnitId: "testb65czjivt9",

                isShow: false,

                adData: {},

                isShowImg: true,

                isShowVideo: false,

                isShowData: true,

                errStr: "",

                adImgSrc: "",

                adVideoSrc: ""

            },

            value: 4

        },

        onShow(options) {

            '// Do something .'

            this.showNativeAd()

            this.cutdown()

            setTimeout(() => {

                router.replace({

                    uri: '/Hello',

                })

            }, 4000);

        },

        cutdown() {

            var timer = setInterval(() => {

                this.value--

            }, 1000);

            if (this.value === 0) {

                clearInterval(timer);

            }

            console.log(222);

        },

        closeAd() {

            this.native.isShowImg = false

            this.native.isShowVideo = false

            clearTimeout(this.timerr);

            router.replace({

                uri: '/Hello',

            })

        },

        getAdProvider: function () {

            this.provider = ad.getProvider();

            prompt.showToast({

                message: "getProvider : " + this.provider,

                duration: 2000,

                gravity: "center"

            });

        },

        showNativeAd() {

            this.getAdProvider();

            if (this.provider !== "huawei") {

                console.info("the device  does not support ad.");

                return;

            }

            nativeAd = ad.createNativeAd({ adUnitId: this.native.adUnitId });

            nativeAd.onLoad(data => {

                console.info("ad data loaded: " + JSON.stringify(data));

                this.native.adData = data.adList[0];

                if (this.native.adData) {

                    if (this.native.adData.imgUrlList) {

                        this.native.adImgSrc = this.native.adData.imgUrlList[0];

                        console.info(" this.native.adImgSrc =" + this.native.adImgSrc);

                        this.native.isShowImg = true;

                    } else {

                        this.native.isShowImg = false;

                        this.native.adImgSrc = "";

                    }

                    if (this.native.adData.videoUrlList && this.native.adData.videoUrlList[0]) {

                        this.native.adVideoSrc = this.native.adData.videoUrlList[0];

                        this.native.isShowVideo = true;

                    } else {

                        this.native.isShowVideo = false;

                        this.native.adVideoSrc = "";

                    }

                    this.native.isShow = true;

                    this.native.errStr = "";

                    this.reportNativeShow();

                }

            });

            nativeAd.onError(e => {

                console.error("load ad error:" + JSON.stringify(e));

                this.native.isShowImg = false;

                this.native.isShowVideo = false;

                this.native.isShow = false;

                this.native.errStr = JSON.stringify(e);

            });

            nativeAd.load();

        },

        reportNativeShow() {

            if (nativeAd) {

                nativeAd.reportAdShow({ adId: this.native.adData.adId });

            }

        },

        reportNativeClick() {

            nativeAd.reportAdClick({

                adId: this.native.adData.adId

            });

        },

    }

</script>

标签:adData,false,ad,开屏,nativeAd,广告,应用,模拟,native
From: https://www.cnblogs.com/mayism123/p/17787168.html

相关文章

  • 【AGC】更新应用信息报未知错误解决方法
    ​【问题描述】最近有几个开发者遇到了一个问题,他们在AGC控制台配置好应用信息的图标和截图之后,点击保存按钮会弹出“未知错误,请稍后再试”的异常报错,导致无法正确保存应用配置信息。出错页面如图所示。​​​ 【解决方案】出现“未知错误”的原因有很多,需要根据请求日志具......
  • HarmonyOS鸿蒙原生应用开发设计- 华为分享图标
    HarmonyOS设计文档中,为大家提供了独特的华为分享图标,开发者可以根据需要直接引用。开发者直接使用官方提供的华为分享图标内容,既可以符合HarmonyOS原生应用的开发上架运营规范,又可以防止使用别人的内容产生的侵权意外情况等,减少自主创作华为分享图标的工作量。当然,如果有个性化的自......
  • AI大语言模型+iThinkAir多维表格|打造零代码AI应用
    迄今为止,大语言模型主要以聊天的产品形态面向用户。ChatGPT、文心一言等已经成为人尽皆知的名词,基于ChatGPT、文心一言等的套壳聊天产品也层出不穷让人眼花缭乱。但是,如果要在工作中真正利用大语言模型来进行提效,聊天可能并不是很高效的一种形式。聊天的方式刚开始很吸引人,但是长期......
  • Net 高级调试之二:CLR和Windows加载器及应用程序域介绍
    一、简介今天是Net高级调试的第二篇文章,第一篇文章记录了自己学习Net高级调试的第一步,认识一些调试工具,有了工具的倚仗,我们开始仗剑走天涯了,开始Net高级调试正式的征程了。我先说一下,我的文章,【调试测试】这部分一般分为两个部分,第一部分是要用到的所有测试代码样例,......
  • LLM在text2sql上的应用
    一、前言:目前,大模型的一个热门应用方向text2sql它可以帮助用户快速生成想要查询的SQL语句。那对于用户来说,大部分简单的sql都是正确的,但对于一些复杂逻辑来说,需要用户在产出SQL的基础上进行简单修改,Text2SQL应用主要还是帮助用户去解决开发时间,减少开发成本。TexttoSQL:简称Te......
  • [转]Oracle数据文件损坏的模拟和修复(一) |ORA-01578 data block corrupted|
    造成数据块损坏的原因通常是由于开启了异步I/O或者增加了写进程,还有可能是硬件引起的,今天模拟一下该问题的发生及修复方法。由于水平有限,那面疏漏,欢迎大家指正。 创建测试环境建立测试表空间:123456create tablespacetestdatafile  '/u02/oradata/logdw......
  • 五矿期货:悦数图数据库在金融期货行业的应用与实践探索
    本文整理自五矿集团-五矿期货有限公司副总经理-张剑锋在NUC2022年度用户大会上的分享。大家好,我是五矿期货的张剑锋。今天十分感谢悦数科技能够提供这个跟各位专家,还有行业技术大拿们当面学习和交流的机会。首先介绍一下期货行业。在中国的六大金融行业里面,银行,保险,还有信托,是......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环境Ubuntu21.10三、实验内容利用Mininet平台搭建拓扑,并连接控制器。编写Python程序,调用相应控制器(Open......
  • 模拟 机器人的充电桩底板电压过大过小的 电压输出 测试操作方法
    1个dcpowersubbly直流稳压电源、铜丝电线若干根接线如下:1、把直流稳压电源的正极、负极分别连接电路板的正极、负极2、按下直流稳压电源开关ON/OFF3、按下旋转VOLTAGE,电压V数值会闪,向左调小,向右调大,停留1~2秒后则会按当前电源输出电压。超出电压范围值,前9秒红灯闪烁......
  • 工业 CPE 双频网关在工业物联网中的应用优势
    佰马工业CPE网关支持双频WiFi技术,兼容支持2.4GHz频段和5GHz频段,在增强工业物联网系统的连接性和效率方面发挥着至关重要的作用。每个WiFi频段都有其独特的优点和缺点,因此在工业物联网环境中,支持并利用多种通信频段,可带来多种好处。本篇就简单介绍一下双频WiFi功能在工......