stat_ads.md 19.4 KB

c82c1e268c01f6f5968c49fd7525ce1eb4e5290f/inner/stat_ads.md#">交叉推广位


c82c1e268c01f6f5968c49fd7525ce1eb4e5290f/inner/stat_ads.md#">简介

交叉推广位是在游戏中展示其他游戏,用户点击某个游戏跳转进入游戏,达到共享用户的目的。

噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析查看。

3种广告类型:悬浮框交叉推广位、抽屉式交叉推广位、猜你喜欢交叉推广位,对应类型值为:40、70、50

  1. 悬浮框交叉推广位,推荐位置:首页、结算页

sdk文件目录结构

  1. 抽屉式交叉推广位,推荐位置:首页、结算页

sdk文件目录结构

  1. 猜你喜欢交叉推广位,推荐位置:结算页

sdk文件目录结构

c82c1e268c01f6f5968c49fd7525ce1eb4e5290f/inner/stat_ads.md#">后台使用

完成接入交叉推广位后,登录后台->头部tab切换到【游戏数据】->【流量分析】->【广告导出】即可查看推广位的各项数据信息(需要后台管理人员添加权限):

sdk文件目录结构

c82c1e268c01f6f5968c49fd7525ce1eb4e5290f/inner/stat_ads.md#">接入必读

  • 由于微信对每个游戏可跳转其他游戏有10个限制,可跳转的其它游戏需要在小游戏根目录下的全局配置文件game.json中进行添加配置:navigateToMiniProgramAppIdList,该参数定义请详读小程序全局配置

  • 接入3种交叉推广位后,为了防止微信审核被拒(被拒理由:微信认定游戏跳转到其他游戏太多,判断游戏是一个游戏盒子,拒绝审核通过),为了防范被拒,在数据模块提供了三个数据获取api:PCSDK.data.IsCross、PCSDK.data.IsDrawer、PCSDK.data.IsGuessLike,控制3种推广位广告的显示隐藏,开发者在游戏中对三种广告控制显示隐藏状态。详请请阅读数据api

  • 噗嗤游戏为了方便开发者接入调试交叉推广位,后台已经配置测试使用的3种类型推广位,提供以下10个推广位appid,开发者复制下面的navigateToMiniProgramAppIdList json数据,配置到game.json的navigateToMiniProgramAppIdList参数:

水果爆破 :"wx26822126b4d99eda",

球球涂涂涂:"wxac0750884d5bed0c",

狂野漂移3D:"wx019a09df638e6683",

星星爱消消:"wx9ff47d13a88e5511",

土耳其方块消消乐:"wx89efb2282d65a2d0",

成语小才子:"wxd4d478c7d331ce80",

球球蹦蹦蹦:"wxabee9afe62d0b114",

俄罗斯方块连连消:"wx4cd087f19f4cb7c3",

球球爆爆爆:"wxae33d68413f40641",

疯狂水果一刀切:"wxdf26a04c53d6f1e9"

  "navigateToMiniProgramAppIdList": [
      "wx26822126b4d99eda",
      "wxac0750884d5bed0c",
      "wx019a09df638e6683",
      "wx9ff47d13a88e5511",
      "wx89efb2282d65a2d0",
      "wxd4d478c7d331ce80",
      "wxabee9afe62d0b114",
      "wx4cd087f19f4cb7c3",
      "wxae33d68413f40641",
      "wxdf26a04c53d6f1e9"
  ]

sdk文件目录结构

接入API:

名称 功能说明
PCSDK.stat.bannerList 根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型:40(悬浮框交叉推广位)、70(抽屉式交叉推广位)、50(猜你喜欢交叉推广位)
PCSDK.stat.bannerNavigateTo 交叉推广位点击跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram)
PCSDK.stat.addExposure 交叉推广位一条或者多条广告展示,添加曝光数据,SDK内部会在onHide时候上报数据到后台
  1. ##### bannerList
   PCSDK.stat.loadingFinish(banner_type): Promise<any>

定义:根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型

参数:

   banner_type: number 必填 目前支持三种广告类型:40、50、70

返回值:Promise

返回的是Promise类型,Promise resolve成功回调数据结构为:

   {
       "banner_list": [
           {
               "banner_id": "3568",
               "banner_name": "土耳其方块",
               "banner_type": "40",
               "banner_location": "100",
               "banner_ad_id": "50",
               "banner_launch_appid": "",
               "banner_launch_path": "",
               "banner_appid": "wx89efb2282d65a2d0",
               "banner_path": "?channel_id=20361",
               "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CB97RK.png",
               "banner_user_num": "0",
               "banner_exposure_num": "0",
               "banner_sort": "1",
               "banner_game_id": "1000053",
               "banner_qqgame": "0",
               "banner_qqgame_id": "0",
               "banner_game_type": 0,
               "banner_bone": "0",
               "banner_system": "0",
               "banner_online": "1",
               "banner_reddot": "0",
               "banner_gender": "0",
               "banner_resident": "0",
               "banner_qrcode": "0",
               "banner_qrcode_img": "",
               "banner_bone_info": false,
               "banner_img_info": {
                   "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CB97RK.png"
               }
           },
           {
               "banner_id": "3571",
               "banner_name": "水果一刀切",
               "banner_type": "40",
               "banner_location": "100",
               "banner_ad_id": "99",
               "banner_launch_appid": "",
               "banner_launch_path": "",
               "banner_appid": "wxdf26a04c53d6f1e9",
               "banner_path": "?channel_id=20361",
               "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CBACTt.png",
               "banner_user_num": "0",
               "banner_exposure_num": "0",
               "banner_sort": "1",
               "banner_game_id": "1000053",
               "banner_qqgame": "0",
               "banner_qqgame_id": "0",
               "banner_game_type": 0,
               "banner_bone": "0",
               "banner_system": "0",
               "banner_online": "1",
               "banner_reddot": "0",
               "banner_gender": "0",
               "banner_resident": "0",
               "banner_qrcode": "0",
               "banner_qrcode_img": "",
               "banner_bone_info": false,
               "banner_img_info": {
                   "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CBACTt.png"
               }
           }
       ]
   }

返回的数据banner_list列表解析为 Array,BannerData是banner_list每一项数据实体,下面的bannerNavigateTo与addExposure接口api参数banner_data属于此BannerData结构

示例:

    /**
     * 演示交叉推广位使用示例
     */
    export default class TestBannerSample {
        constructor() {
            // 示例:加载悬浮框交叉推广位
            this.loadBannerList(BannerType.TYPE_CROSS)
                .then((dataList: Array<BannerData>) => {
                    // 渲染广告位数据
                    this.renderAdCrossList(dataList);
                }).catch(err => {
                    // bannerList不存在获取请求拉取失败
                });
        }

        /**
         * 渲染广告位列表
         * @param dataList 广告位列表
         */
        private renderAdCrossList(dataList: Array<BannerData>) {
            // ...
        }

        /**
         * 根据类型获取交叉推广位列表
         * @param banner_type 广告位类型
         */
        private loadBannerList(banner_type: BannerType): Promise<any> {
            return new Promise((resolve, reject) => {
                PCSDK.stat.bannerList(banner_type)
                    .then(data => {
                        let bannerList: Array<BannerData> = data.banner_list || [];
                        if (bannerList.length) {
                            // 处理bannerList数据列表
                            resolve(bannerList);
                        } else {
                            // 处理数据为空情况
                            reject(null);
                        }
                    }).catch(err => {
                        // 请求接口报错情况
                        reject(err);
                    });
            });
        }
    }

    // 广告位类型的枚举
    enum BannerType {
        TYPE_CROSS = 40,            // 悬浮框交叉推广位
        TYPE_LIKE = 50,             // 猜你喜欢交叉推广位
        TYPE_LIST = 70,             // 抽屉式交叉推广位
    }

    /*
    * banner数据实体结构
    */
    class BannerData {
        public banner_id: string;
        public banner_appid: string;
        public banner_diamond: number;
        public banner_type: string;
        public banner_icon: string;
        public banner_name: string;
        public banner_resident: string; // 是否常驻
    }
  1. ##### bannerNavigateTo
   PCSDK.stat.bannerNavigateTo( location:number, banner_data: any, opts?: { extraData?: string; envVersion?: string }): Promise<any>

定义:交叉推广位点击游戏跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram), 第三个参数配置可参考wx.navigateToMiniProgram extraData、envVersion配置信息

参数:

   location: number 必传,统一传递为:100

   banner_data:any  必传,点击跳转项对应数据,该数据的结构为BannerData,为bannerList获取的Array<BannerData>的单元实体项

   opts: object 选传,调试阶段可参照[wx.navigateToMiniProgram(Object object) extraData配置信息]进行裴旭
   {
       extraData: string 选传, 需要传递给目标小程序的数据,目标小程序可在 App.onLaunch,App.onShow 中获取到这份数据
       envVersion: string 选传,要打开的小程序版本,合法值:develop、trial、release
   }

示例:获取猜你喜欢交叉推广位,以列表的形式显示在界面上,点击任意一项游戏跳转其他游戏

    // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息
    /**
    * 演示交叉推广位使用示例
    */
   export default class TestBannerSample extends ui.shop.ShopPopwinUI {
       private list: Laya.List;

       constructor() {
           super();

           // 创建List ui
           this.list = new Laya.List();
           this.list.itemRender = AdItem;
           this.list.vScrollBarSkin = "";
           this.list.scrollBar.elasticBackTime = 500;
           this.list.scrollBar.elasticDistance = 350;
           this.list.x = 0;
           this.list.y = 0;
           this.list.spaceY = 10;
           this.list.height = 1000;
           this.list.renderHandler = new Laya.Handler(this, this.renderAdItem);
           this.boxList.addChild(this.list);

           // 示例:加载猜你喜欢交叉推广位数据列表
           this.loadBannerList(BannerType.TYPE_LIKE)
               .then((dataList: Array<BannerData>) => {
                   this.renderAdLikeList(dataList);
               }).catch(err => {
                   // bannerList不存在获取请求拉取失败
               });
       }

       /**
        * 渲染单个广告位ui
        * @param cell 
        */
       private renderAdItem(cell: AdItem) {
           cell.init();
       }

       /**
        * 渲染广告位列表
        * @param dataList 广告位列表
        */
       private renderAdLikeList(dataList: Array<BannerData>) {
           this.list.array = dataList;
       }

       /**
        * 根据类型获取交叉推广位列表
        * @param banner_type 广告位类型
        */
       private loadBannerList(banner_type: BannerType): Promise<any> {
           return new Promise((resolve, reject) => {
               PCSDK.stat.bannerList(banner_type)
                   .then(data => {
                       let bannerList: Array<BannerData> = data.banner_list || [];
                       if (bannerList.length) {
                           // 处理bannerList数据列表
                           resolve(bannerList);
                       } else {
                           // 处理数据为空情况
                           reject(null);
                       }
                   }).catch(err => {
                       // 请求接口报错情况
                       reject(err);
                   });
           });
       }
   }

   class AdItem extends ui.ads.GameIconUI {
       constructor() {
           super();
           this.on(Laya.Event.CLICK, this, this.onJumpGame);
       }

       init() {
           let { banner_icon, banner_name, banner_reddot } = this.dataSource;
           this.iconTex.skin = banner_icon;
           this.nametxt.text = banner_name;
           this.hot.visible = banner_reddot + '' === '1';
       }

       private onJumpGame(ev: Laya.Event) {
           PCSDK.stat.bannerNavigateTo(100, { ...this.dataSource }).catch(err => {
               // 跳转游戏微信弹出二次确认框,点击取消执行此处
           });
       }
   }

   // 广告位类型的枚举
   enum BannerType {
       TYPE_CROSS = 40,            // 悬浮框交叉推广位
       TYPE_LIKE = 50,             // 猜你喜欢交叉推广位
       TYPE_LIST = 70,             // 抽屉式交叉推广位
   }

    /*
    * banner数据实体结构
    */
    class BannerData {
        public banner_id: string;
        public banner_appid: string;
        public banner_diamond: number;
        public banner_type: string;
        public banner_icon: string;
        public banner_name: string;
        public banner_resident: string; // 是否常驻
    }
  1. ##### addExposure
   PCSDK.stat.addExposure( location: number, banner_data: Array< any > | any ): void

定义:对一个或者多个展示的推广位添加曝光,SDK在onHide时候上报曝光数据到后台,后台进行统计查阅

参数:

   location: number 必传,统一传递为:100

   banner_data:any  必传,添加展推广位曝光数据,可添加一个或者多个曝光数据,banner_data参数数据结构为上面bannerList api返回的列表数据的项BannerData实体结构:Array<BannerData> | BannerData

提示:

展示猜你喜欢/抽屉式交叉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。

展示悬浮框交叉推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api

示例:根据悬浮框交叉推广位类型调用PCSDK.stat.bannnerList接口获取悬浮框交叉推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。

    /**
    * 演示交叉推广位使用示例
    */
export default class TestBannerSample extends ui.ads.ADbtnUI {
       private data;
       private count: number;
       private adList: Array<BannerData>;

       constructor() {
           super();
           this.count = 0;
           this.adList = [];
           this.on(Laya.Event.CLICK, this, this.onJumpGame);
       }

        // 初始化显示悬浮框交叉推广位
       init(isFirst: boolean) {
           isFirst && (this.count = 0);
        this.anim_entice.play(0, true);
           this.anim_entice.addLabel('refresh', 38);
           // 交叉悬浮框动画执行到第38帧,自动更新下一个,开发者可根据实际使用定时器实现切换下一个
           this.anim_entice.on(Laya.Event.LABEL, this, this.handleAutoRrefresh);
           // 第一次
           this.refresh();
    }

        // 清理悬浮框交叉推广位
       clear() {
           this.anim_entice.gotoAndStop(0);
           this.anim_entice.removeLabel('refresh');
           this.anim_entice.off(Laya.Event.LABEL, this, this.handleAutoRrefresh);
       }

       private refresh() {
           let list = this.adList;
           if (!list || !list.length) {
               this.loadBannerList(BannerType.TYPE_CROSS).then(() => this.refresh());
               return;
           }
           let data = list.pop();
           this.renderAdui(data);
           this.data = data;
           // 添加曝光数据
           PCSDK.stat.addExposure(100, data);
           // 也可以采用传递多个方式
           // PCSDK.stat.addExposure(100, [{...data}]);
       }

       private renderAdui(data) {
           let { banner_bone_info, banner_img_info } = data;
           if (banner_bone_info) {
               this.imgIcon.visible = false;
           } else {
               this.imgIcon.visible = true;
               this.imgIcon.skin = banner_img_info.banner_icon;
           }
           this.imgHot.visible = data.banner_reddot + '' === '1';
       }

       private onJumpGame(ev: Laya.Event) {
           this.anim_entice.gotoAndStop(39);
           this.anim_entice.play(39, true);
           // 切换下一个
           this.refresh();
           PCSDK.stat.bannerNavigateTo(100, { ...this.data }).catch(err => {
               // 跳转游戏微信弹出二次确认框,点击取消执行此处
           });
       }

       /**
        * 处理自动切换下一个
        * @param name 
        */
       private handleAutoRrefresh(name) {
           if (name === 'refresh' && this.count !== 0) {
               this.refresh();
           }
           this.count++;
       }

       /**
        * 根据类型获取交叉推广位列表
        * @param banner_type 广告位类型
        */
       private loadBannerList(banner_type: BannerType): Promise<any> {
           return new Promise((resolve, reject) => {
               PCSDK.stat.bannerList(banner_type)
                   .then(data => {
                       let bannerList: Array<BannerData> = data.banner_list || [];
                       if (bannerList.length) {
                           // 处理bannerList数据列表
                           resolve(bannerList);
                       } else {
                           // 处理数据为空情况
                           reject(null);
                       }
                   }).catch(err => {
                       // 请求接口报错情况
                       reject(err);
                   });
           });
       }
   }

   // 广告位类型的枚举
   enum BannerType {
       TYPE_CROSS = 40,            // 悬浮框交叉推广位
       TYPE_LIKE = 50,             // 猜你喜欢交叉推广位
       TYPE_LIST = 70,             // 抽屉式交叉推广位
   }