diff --git a/SUMMARY.md b/SUMMARY.md index fbfbf8c..b7c5f2e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -7,7 +7,8 @@ ## SDK手册 * [SDK模块功能](modules.md) -* [统计模块](stat_active.md) +* [统计模块](stat.md) * [启动注册打点](stat_active.md) - * [交叉推广位](stat_ads.md) - * [Gitbook命令行速览](installation/gitbook-cli.md) \ No newline at end of file + * [关卡分析打点](stat_level.md) + * [自定义事件打点](stat_event.md) + * [交叉推广位](stat_ads.md) \ No newline at end of file diff --git a/download.md b/download.md index 1e62ac4..2f46cdc 100644 --- a/download.md +++ b/download.md @@ -6,6 +6,10 @@ > *发布时间*:2019.09.04 +**修复:** + +1. 修复外部游戏stat launch api调用时序问题导致参数传递异常 + **新增:** 1. config.js配置ShareData新增share_wxad_id参数:视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享 diff --git a/install.md b/install.md index 6648d92..312a014 100644 --- a/install.md +++ b/install.md @@ -95,33 +95,34 @@ }; ``` - - 参数详解: - - 1. **Env ( number ):**SDK统计执行环境,建议开发者调试测试阶段设置为110,提审阶段一定要设置为100。 - - 100:正式环境,请求api域名地址为:https://dataapi.d3games.com - - 110:测试环境,请求api域名地址为:https://pre-dataapi.d3games.com - - 2. **IsDebug ( boolean ):**是否debug模式,debug模式会打印sdk中的console.log/error/warn log。 - - false:关闭log打印,提审前建议设置为false,不打印log信息 - - true:开启log打印,如遇到联调问题,可设置为true,查看log发给相关人员进行查看解决问题 - - 此设置可在代码中通过动态设置:PCSDK.stat.setDebug( boolean )进行动态切换控制 - - 3. **AdCacheDuration(number):**表示获取广告位列表的缓存时间,例如30秒,sdk会对广告列表拉取后缓存30秒。此参数对接入噗嗤广告导出功能后有效,没有接入可不修改,使用默认值。 - - 4. **IsUseShareModule( boolean ):**是否启用sdk分享视频功能(sdk把分享和视频封装为share模块,可以通过噗嗤后台配置分享还是视频类型进行分发控制) - - false:SDK启动不拉取分享列表,也就是不适用噗嗤游戏的分享模块功能 - - true:SDK启动拉取噗嗤管理后台配置的分享视频列表,运营或者开发者在噗嗤后台配置分享视频的配置后,开发者可以通过PCSDK.share.shareDispatch( sharekey , ...)进行视频分享分发操作,具体操作请详看SDK分享视频模块。 - - 5. **IsOnlineAutoUse( boolean ):**是否启用SDK启动获取噗嗤游戏后台配置的在线配置参数列表 - +参数详解: + +
+ +1. **Env ( number ):**SDK统计执行环境,建议开发者调试测试阶段设置为110,提审阶段一定要设置为100。 + + 100:正式环境,请求api域名地址为:https://dataapi.d3games.com + + 110:测试环境,请求api域名地址为:https://pre-dataapi.d3games.com + +2. **IsDebug ( boolean ):**是否debug模式,debug模式会打印sdk中的console.log/error/warn log。 + + false:关闭log打印,提审前建议设置为false,不打印log信息 + + true:开启log打印,如遇到联调问题,可设置为true,查看log发给相关人员进行查看解决问题 + + 此设置可在代码中通过动态设置:PCSDK.stat.setDebug( boolean )进行动态切换控制 + +3. **AdCacheDuration(number):**表示获取广告位列表的缓存时间,例如30秒,sdk会对广告列表拉取后缓存30秒。此参数对接入噗嗤广告导出功能后有效,没有接入可不修改,使用默认值。 + +4. **IsUseShareModule( boolean ):**是否启用sdk分享视频功能(sdk把分享和视频封装为share模块,可以通过噗嗤后台配置分享还是视频类型进行分发控制) + + false:SDK启动不拉取分享列表,也就是不适用噗嗤游戏的分享模块功能 + + true:SDK启动拉取噗嗤管理后台配置的分享视频列表,运营或者开发者在噗嗤后台配置分享视频的配置后,开发者可以通过PCSDK.share.shareDispatch( sharekey , ...)进行视频分享分发操作,具体操作请详看SDK分享视频模块。 + +5. **IsOnlineAutoUse( boolean ):**是否启用SDK启动获取噗嗤游戏后台配置的在线配置参数列表 + false:两种处理 1)不启用噗嗤后台在线配置参数功能; 2)使用在线配置参数功能,但是启动不拉取后台在线配置参数列表,代码中调用api拉取在线参数 示例:代码中控制拉取在线参数,例如噗嗤后台【游戏数据】=>【配置参数】栏配置了:是否显示微信插屏广告、噗嗤游戏广告导出动态开关 @@ -165,8 +166,8 @@ 示例:可以从噗嗤管理后台【游戏数据】=>【分享/视频配置】中选取一条:复制文案,点击分享素材icon->查看大图->右键查看分享图片的html源码复制src图片地址:**{** - ​ **share_desc: ' 半夜传来啪啪啪!竟是隔壁老王偷偷打气球',** - + ​ **share_desc: ' 半夜传来啪啪啪!竟是隔壁老王偷偷打气球',** + ​ **share_wxad_id: 'adunit-6958dcfc3f0bed31',** ​ **share_icon: 'https://dep.miso-lab.com/data_analysis/games/res/5D57D4A3Yx.png'** diff --git a/stat.md b/stat.md new file mode 100644 index 0000000..3114470 --- /dev/null +++ b/stat.md @@ -0,0 +1,174 @@ +# 启动注册打点 + +------ + +#### **简介** + +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 + + + +#### **后台使用** + +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png) + +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png) + + + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------ | ------------------------------------------------------------ | +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,不是微信代码包白屏加载完成,游戏loading自身cdn资源加载完成调用 | +| PCSDK.stat.setLogind | 设置sdk必须要使用的用户id、第一次创建角色的注册时间,游戏接入方登录游戏服务器后调用 | +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在setLogind设置需要的信息过后使用(不限于使用位置),不然会导致新增注册数据统计异常 | + + + + + + + +1. **loadingFinish** + + ```javascript + PCSDK.stat.loadingFinish(): void + ``` + + 定义:加载游戏加载资源完成时打点 + + 参数: + + ``` + 无 + ``` + + 示例:加载完成游戏主界面图片、json资源打点 + + ```javascript + private async initEnv() { + await SDKTools.env(Const.VERSION); + this.loadRes(); + this.loadLogin(); + } + + // 开始加载资源 + private loadRes() { + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + // 资源加载完成 + private onLoadedMain() { + PCSDK.stat.loadingFinish() + } + + // 更新资源加载进度条 + private onProgressMain(ret) { + let progress = ret.data; + this.skin.txtProgress.text = Math.floor(progress * 100) + '%'; + } + ``` + +2. **setLogind** + + ```javascript + PCSDK.stat.setLogind( data: object ): void + ``` + + 定义:游戏登录完成,得到登录用户的用户id和用户第一次注册时间,设置SDK必需的用户信息 + + 参数: + + ```javascript + data: object +{ + userId: string | number 必传, 用户唯一标识id + regTime: number 必传,用户第一次创建角色的注册时间戳 + } + ``` + + 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟使用环境) + + ```javascript + // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息 + Api.login().then( data => { + let { user_id, user_reg_time } = data; + PCSDK.stat.setLogind({ + userId: data.user_id, + regTime: data.user_reg_time + }); + }); + ``` + +3. **active** + + ```javascript + PCSDK.stat.active(): void + ``` + + 定义:用户活跃/新增注册上报,切记在使用setLogind设置用户信息过后调用此接口,不然会导致新增注册数据统计异常 + + 参数: + + ```javascript + 无 + ``` + + 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟该接口使用环境) + + ```javascript + // 使用场景1:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息后立即调用active + Api.login().then( data => { + let { user_id, user_reg_time } = data; + // 设置用户信息 + PCSDK.stat.setLogind({ + userId: data.user_id, + regTime: data.user_reg_time + }); + // 用户活跃注册打点 + PCSDK.stat.active(); + }); + + // 使用场景2:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息。在其他界面调用active + // 资源加载loading界面 + class LoadingScene(){ + constructor(){ + this.login(); + } + + private login(){ + // 登录 + Api.login().then( data => { + let { user_id, user_reg_time } = data; + // 设置用户信息 + PCSDK.stat.setLogind({ + userId: data.user_id, + regTime: data.user_reg_time + }); + // 进入home主页场景 + SceneManager.I.switchScene(HomeScene); + }); + } + } + + // Home页面 + class HomeScene(){ + constructor(){ + this.btnStarGame.on('click', this.onGame, this); + } + + private onGame(){ + // 用户活跃注册打点 + PCSDK.stat.active(); + // 进入游戏页面 + SceneManager.I.switchScene(GameScene); + } + } + + ``` \ No newline at end of file diff --git a/stat_active.md b/stat_active.md index 0b8dc80..5d52d37 100644 --- a/stat_active.md +++ b/stat_active.md @@ -8,9 +8,9 @@ -#### **查看数据** +#### **后台使用** -完成启动注册打点后,登录后台->头部切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png) 点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息: @@ -65,7 +65,8 @@ // 资源加载完成 private onLoadedMain() { - PCSDK.stat.loadingFinish() + // 打点:loadingFinish + PCSDK.stat.loadingFinish(); } // 更新资源加载进度条 diff --git a/stat_ads.md b/stat_ads.md index e452904..6167efc 100644 --- a/stat_ads.md +++ b/stat_ads.md @@ -4,34 +4,100 @@ #### **简介** -交叉推广位是在游戏中放置其他游戏icon,用户点击跳转到导出的游戏,达到共享用户的目的,噗嗤游戏对开发者提供了不同类型的广告导出。 +交叉推广位是在游戏中展示其他游戏icon,用户点击跳转到导出的游戏,达到共享用户的目的。 -噗嗤管理后台可对交叉推广位进行配置管理,对广告导出各项指标进行计算分析。 +噗嗤游戏提供了3种类型的广告导出,后台可对交叉推广位进行配置管理,对广告导出各项指标分析阅览。 +**3种广告类型:交叉悬浮广告框、交叉抽屉式广告位、交叉猜你喜欢广告位** +1. 交叉悬浮广告框,放置到首页、结算页 -#### **接入准备** + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_013.png) -由于微信对每个游戏可跳转其他游戏有10个限制,可跳转的游戏需要配置微信开发者工具项目的 +2. 交叉抽屉式广告位,放置到首页、结算页 -完成启动注册打点后,登录后台->头部切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png) + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_014.png) -点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息: +3. 交叉猜你喜欢广告位,推荐放置到结算页 -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png) + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_015.png) +#### **后台使用** + +完成接入交叉推广位后,登录后台->头部tab切换到【游戏数据】->【流量分析】->【广告导出】即可查看推广位的各项数据信息(需要后台管理人员添加权限): + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_012.png) + + + +#### **接入必读** + +- 由于微信对每个游戏可跳转其他游戏有10个限制,可跳转的其它游戏需要在小游戏根目录下的全局配置文件game.json中进行添加配置:navigateToMiniProgramAppIdList,该参数定义请详读[小程序全局配置](https://developers.weixin.qq.com/minigame/dev/reference/configuration/app.html)。 + +- 噗嗤游戏为了方便开发者接入调试交叉推广位,【后台测试服】已经配置了不同类型导出广告,并提供以下10个测试服广告位appid: + + 水果爆破 :"wx26822126b4d99eda", + + 球球涂涂涂:"wxac0750884d5bed0c", + + 狂野漂移3D:"wx019a09df638e6683", + + 星星爱消消:"wx9ff47d13a88e5511", + + 土耳其方块消消乐:"wx89efb2282d65a2d0", + + 成语小才子:"wxd4d478c7d331ce80", + + 球球蹦蹦蹦:"wxabee9afe62d0b114", + + 俄罗斯方块连连消:"wx4cd087f19f4cb7c3", + + 球球爆爆爆:"wxae33d68413f40641", + + 疯狂水果一刀切:"wxdf26a04c53d6f1e9" + + ```javascript + "navigateToMiniProgramAppIdList": [ + "wx26822126b4d99eda", + "wxac0750884d5bed0c", + "wx019a09df638e6683", + "wx9ff47d13a88e5511", + "wx89efb2282d65a2d0", + "wxd4d478c7d331ce80", + "wxabee9afe62d0b114", + "wx4cd087f19f4cb7c3", + "wxae33d68413f40641", + "wxdf26a04c53d6f1e9" + ] + ``` + + + +- 完成下面的操作步骤可调用相应的api读取到广告位数据: + + 1、开发者复制上面的10个其他游戏的appid,配置到game.json的navigateToMiniProgramAppIdList参数: + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_010.png) + + 2、修改[config.js的Env配置](install.md#config_env)为110,对接联调阶段,请走测试服后台,调试环境走测试环境 + + > 提示:广告位接入完毕测试通过,提交审核前,修改Env为100。 + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_011.png) + + + #### **接入API:** -| **名称** | **功能说明** | -| ------------------------ | ------------------------------------------------------------ | -| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,不是微信代码包白屏加载完成 | -| PCSDK.stat.setLogind | 游戏登录成功后,获取用户信息用户userId、第一次创建角色的注册时间regTime,调用此接口设置SDK统计上报需要的用户信息 | -| PCSDK.stat.active | 用户活跃/新增注册上报,切记在setLogind设置需要的信息过后使用,不然会导致新增注册数据统计异常。setLogind后,此接口不限使用位置。 | +| **名称** | **功能说明** | +| --------------------------- | ------------------------------------------------------------ | +| PCSDK.stat.bannerList | 根据类型获取对应类型噗嗤交叉广告列表,目前sdk支持3种类型:40(交叉悬浮广告框)、70(交叉抽屉式广告位)、50(交叉猜你喜欢广告位) | +| PCSDK.stat.bannerNavigateTo | 交叉推广位点击跳转到对应appid的其他游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram) | +| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK在onHide时候上报数据到后台 | @@ -39,141 +105,440 @@ -1. **loadingFinish** +1. ##### **bannerList** ```javascript - PCSDK.stat.loadingFinish(): void + PCSDK.stat.loadingFinish(banner_type): Promise ``` - 定义:加载游戏资源完成(不是微信白屏加载完成)时打点 - + 定义:根据类型获取对应类型噗嗤交叉广告列表,目前sdk支持3种类型;返回Promise类型 + 参数: - + ``` - 无 + banner_type: number 必填 目前支持三种广告类型:40、50、70 ``` + + 返回值:Promise + + 返回的是Promise类型,Promise resolve成功回调数据结构为: + + ```json + { + "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" + } + } + ] + } - 示例:加载完成游戏主界面图片、json资源打点 - - ```javascript - private async initEnv() { - await SDKTools.env(Const.VERSION); - this.loadRes(); - this.loadLogin(); - } + ``` - // 开始加载资源 - private loadRes() { - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); - } + > **返回的数据banner_list列表解析为 Array< BannerData >,BannerData是banner_list每一项数据实体,下面的bannerNavigateTo与addExposure接口api参数banner_data属于此BannerData结构**。 - // 资源加载完成 - private onLoadedMain() { - PCSDK.stat.loadingFinish() - } + 示例: - // 更新资源加载进度条 - private onProgressMain(ret) { - let progress = ret.data; - this.skin.txtProgress.text = Math.floor(progress * 100) + '%'; + ```javascript + /** + * 演示交叉推广位使用示例 + */ + export default class TestBannerSample { + constructor() { + // 示例:加载交叉悬浮广告框 + this.loadBannerList(BannerType.TYPE_CROSS) + .then((dataList: Array) => { + // 渲染广告位数据 + this.renderAdCrossList(dataList); + }).catch(err => { + // bannerList不存在获取请求拉取失败 + }); + } + + /** + * 渲染广告位列表 + * @param dataList 广告位列表 + */ + private renderAdCrossList(dataList: Array) { + // ... + } + + /** + * 根据类型获取交叉推广位列表 + * @param banner_type 广告位类型 + */ + private loadBannerList(banner_type: BannerType): Promise { + return new Promise((resolve, reject) => { + PCSDK.stat.bannerList(banner_type) + .then(data => { + let bannerList: Array = 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; // 是否常驻 } ``` -2. **setLogind** +2. ##### **bannerNavigateTo** ```javascript - PCSDK.stat.setLogind( data: object ): void + PCSDK.stat.bannerNavigateTo( location:number, banner_data: any, opts?: { extraData?: string; envVersion?: string }): Promise ``` - 定义:游戏登录完成,得到登录用户的用户id和用户第一次注册时间,设置SDK必需的用户信息 + 定义:交叉推广位点击游戏跳转到对应appid的其他游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram), 第三个参数配置可参考[wx.navigateToMiniProgram extraData、envVersion配置信息](https://developers.weixin.qq.com/minigame/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html) 参数: ```javascript - data: object -{ - userId: string | number 必传, 用户唯一标识id - regTime: number 必传,用户第一次创建角色的注册时间戳 + location: number 必传,统一传递为:100 + + banner_data:any 必传,点击跳转项对应数据,该数据的结构为BannerData,为bannerList获取的Array的单元实体项 + + opts: object 选传,调试阶段可参照[wx.navigateToMiniProgram(Object object) extraData配置信息]进行裴旭 + { + extraData: string 选传, 需要传递给目标小程序的数据,目标小程序可在 App.onLaunch,App.onShow 中获取到这份数据 + envVersion: string 选传,要打开的小程序版本,合法值:develop、trial、release } ``` - 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟使用环境) + 示例:获取猜你喜欢广告位,以列表的形式显示在界面上,点击任意一项游戏跳转其他游戏 ```javascript // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息 - Api.login().then( data => { - let { user_id, user_reg_time } = data; - PCSDK.stat.setLogind({ - userId: data.user_id, - regTime: data.user_reg_time - }); - }); + /** + * 演示交叉推广位使用示例 + */ + 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) => { + this.renderAdLikeList(dataList); + }).catch(err => { + // bannerList不存在获取请求拉取失败 + }); + } + + /** + * 渲染单个广告位ui + * @param cell + */ + private renderAdItem(cell: AdItem) { + cell.init(); + } + + /** + * 渲染广告位列表 + * @param dataList 广告位列表 + */ + private renderAdLikeList(dataList: Array) { + this.list.array = dataList; + } + + /** + * 根据类型获取交叉推广位列表 + * @param banner_type 广告位类型 + */ + private loadBannerList(banner_type: BannerType): Promise { + return new Promise((resolve, reject) => { + PCSDK.stat.bannerList(banner_type) + .then(data => { + let bannerList: Array = 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; // 是否常驻 + } ``` -3. **active** +3. ##### **addExposure** ```javascript - PCSDK.stat.active(): void + PCSDK.stat.addExposure( location: number, banner_data: Array< any > | any ): void ``` - 定义:用户活跃/新增注册上报,切记在使用setLogind设置用户信息过后调用此接口,不然会导致新增注册数据统计异常 + 定义:对展示的一个或者多个广告位添加曝光,SDK在onHide时候上报曝光数据到后台,后台会进行统计展示 参数: ```javascript - 无 + location: number 必传,统一传递为:100 + + banner_data:any 必传,添加展示广告位曝光数据,可添加一个或者多个曝光数据,banner_data参数数据结构为上面bannerList api返回的列表数据的项BannerData实体结构:Array | BannerData + ``` - 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟该接口使用环境) + > 提示: + > + > 展示猜你喜欢/抽屉广告位:获取到9个广告位数据,展示了5个其中广告位,调用曝光接口传入广告数据为展示的5个,剩余的4个需展示的时候再调用曝光api接口传入。 + > + > 展示交叉悬浮框广告位:展示一个,将此广告位传入曝光接口,点击展示下一个广告,则把这个最新展示广告数据传入曝光api + 示例:交叉悬浮框广告位显示及添加曝光实现(拉取广告列表后,每次只显示一个,点击一个切换下一个,定时器4秒切换下一个,直到列表为空,请求新的广告位列表) + 思路:根据交叉悬浮框类型调用PCSDK.stat.bannnerList接口获取交叉悬浮框广告位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。 ```javascript - // 使用场景1:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息后立即调用active - Api.login().then( data => { - let { user_id, user_reg_time } = data; - // 设置用户信息 - PCSDK.stat.setLogind({ - userId: data.user_id, - regTime: data.user_reg_time - }); - // 用户活跃注册打点 - PCSDK.stat.active(); - }); - - // 使用场景2:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息。在其他界面调用active - // 资源加载loading界面 - class LoadingScene(){ - constructor(){ - this.login(); - } - - private login(){ - // 登录 - Api.login().then( data => { - let { user_id, user_reg_time } = data; - // 设置用户信息 - PCSDK.stat.setLogind({ - userId: data.user_id, - regTime: data.user_reg_time - }); - // 进入home主页场景 - SceneManager.I.switchScene(HomeScene); - }); - } - } - - // Home页面 - class HomeScene(){ - constructor(){ - this.btnStarGame.on('click', this.onGame, this); - } - - private onGame(){ - // 用户活跃注册打点 - PCSDK.stat.active(); - // 进入游戏页面 - SceneManager.I.switchScene(GameScene); - } +/** + * 演示交叉推广位使用示例 + */ +export default class TestBannerSample extends ui.ads.ADbtnUI { + private data; + private count: number; + private adList: Array; + + 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 { + return new Promise((resolve, reject) => { + PCSDK.stat.bannerList(banner_type) + .then(data => { + let bannerList: Array = 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, // 交叉抽屉广告位 + } ``` \ No newline at end of file diff --git a/stat_event.md b/stat_event.md new file mode 100644 index 0000000..5a05451 --- /dev/null +++ b/stat_event.md @@ -0,0 +1,140 @@ +# 自定义事件打点 + +------ + +#### **简介** + +自定义事件是噗嗤游戏为开发者提供的自助分析功能。用户在小游戏上的行为,我们定义为事件。 游戏的任意位置需要统计触达人数我们通用可以使用事件来进行统计,后台进行分析后阅览。 + +#### **后台使用** + +接入自定义事件打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】可查看自定义事件次数、去重人数等详细信息(此功能需要管理员添加权限): + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_018.png) + + + +#### **接入必读** + +接入自定义事件打点前,请[前往后台](http://pre-data.d3games.com/index.html#/login)进行添加自定义事件的key:登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】->点击【新增】添加自定义事件(事件key可语义化的自定义,推荐_连接)。 + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_016.png) + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_017.png) + +> 提示:游戏新增自定义事件如果很多,一个个复制可能比较繁琐,进入噗嗤后台【事件列表】后,chrome浏览器打开【开发者工具】,在console栏下方输入下面的命令后,可自动生成自定义事件key的枚举(如果事件很多出现翻页,则每一页都执行后,手动合并为一个枚举),复制到项目中使用,枚举key生成规则为事件key转换为大驼峰式,枚举value为事件key: + +```javascript +// 第1个参数表示生成枚举的名字:EventKeys +// 第2个参数表示事件key所在列索引(第2列):1 +// 第3个参数表示事件key注释所在列索引(第3列):2 +// 最后一个参数选填,any传递false表示枚举字符串不带any转换 +PCPlugins.transform('EventKeys', 1 , 2 , { any: false}); +``` + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_019.png) + + + +示例:使用PCPlugins.transform('EventKeys', 1 , 2 , { any: false}); 生成的自定义事件key枚举 + +``` +enum EventKeys { + // 关卡7进入, + Level7Enter = 'level7_enter', + // 关卡6进入, + Level6Enter = 'level6_enter', + // 关卡5进入, + Level5Enter = 'level5_enter', + // 关卡4进入, + Level4Enter = 'level4_enter', + // 关卡3进入, + Level3Enter = 'level3_enter', + // 关卡2进入, + Level2Enter = 'level2_enter', + // 关卡1进入, + Level1Enter = 'level1_enter', + // 关卡失败双倍奖励, + MapFailDouble = 'map_fail_double', + // 引导10-主界面再次进入游戏, + Guide109 = 'guide_109', + // 引导9-合成确认, + Guide108 = 'guide_108', + // 引导8-合成成功后, + Guide107 = 'guide_107', + // 引导7-合成, + Guide106 = 'guide_106', + // 引导6-第二次购买, + Guide105 = 'guide_105', + // 引导5-第一次购买, + Guide104 = 'guide_104', + // 引导4-结算引导, + Guide103 = 'guide_103', + // 引导3-开始射击, + Guide102 = 'guide_102', + // 引导2-开始游戏, + Guide101 = 'guide_101', + // 引导1-欢迎, + Guide100 = 'guide_100', + // 金币加速,关闭, + SpeedUpClose = 'speed_up_close', + // 金币加速,免费领取, + SpeedUpFree = 'speed_up_free' +} +``` + + + + + +#### **接入API**: + +| **名称** | **功能说明** | +| ---------------- | ------------------------------------------------------------ | +| PCSDK.stat.event | 自定义事件打点,使用前请[前往后台](http://pre-data.d3games.com/index.html#/login)进行添加自定义事件key | + + + +1. **event** + + ```javascript + PCSDK.stat.event(event_key: string , event_source: string , opts?: { ext_val?: string | number} ): Promise + ``` + + 定义:自定义事件打点,可在游戏任何位置定义事件打点 + + 参数: + + ``` + event_key: string 必传,后台配置的事件key + + event_source: string 必传,触发该事件所在页面位置,例如:结算页面、排行榜界面、签到页面。。。 + + opts?: object 选传,自定义扩展参数,一些特定的事件想传递更多信息,此参数使用请咨询相关对接人员目前只支持对象一个key(evt_val),多个扩展参数使用'|'连接 + { + ext_val: '100|1000' + } + ``` + 示例: + + ```javascript + // 签到功能 + private onSign() { + PCSDK.stat.event(EventKeys.FunctionSign, '主界面'); + } + + // 开始加载资源 + private loadRes() { + PCSDK.stat.event(EventKeys.LoadingExhibition, '加载界面'); + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + // 升级领奖 + private onReward(e: Laya.Event) { + PCSDK.stat.event(EventKeys.LvUpRewards, '升级界面'); + SDKTools.shareDispatch(ShareKey.LevelUpDiamond, { + success: this.handleDoubleReward, + context: this + }); + } + ``` diff --git a/stat_level.md b/stat_level.md new file mode 100644 index 0000000..3c84920 --- /dev/null +++ b/stat_level.md @@ -0,0 +1,67 @@ +# 关卡分析打点 + +------ + +#### **简介** + +关卡分析,为开发者提供小游戏详细的关卡数据,分析各关卡玩家的通关状况,帮助开发者从数据角度衡量游戏设计的合理性,调节难易度,观察各关卡道具使用情况和奖励获取状况,对比分析各个指标,通过量化玩家数据,提高游戏体验。 + +#### **后台使用** + +接入关卡分析接口后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【关卡分析】可查看关卡进入用户数据、失败次数、失败率、平均完成时间等): + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_020.png) + + + +#### **接入API**: + +| **名称** | **功能说明** | +| ---------------- | ------------------------------------------------------------ | +| PCSDK.stat.event | 自定义事件打点,使用前请[前往后台](http://pre-data.d3games.com/index.html#/login)进行添加自定义事件key | + + + +1. **event** + + ```javascript + PCSDK.stat.event(event_key: string , event_source: string , opts?: { ext_val?: string | number} ): Promise + ``` + + 定义:自定义事件打点,可在游戏任何位置定义事件打点 + + 参数: + + ``` + event_key: string 必传,后台配置的事件key + + event_source: string 必传,触发该事件所在页面位置,例如:结算页面、排行榜界面、签到页面。。。 + + opts?: object 选传,自定义扩展参数,一些特定的事件想传递更多信息,此参数使用请咨询相关对接人员目前只支持对象一个key(evt_val),多个扩展参数使用'|'连接 + { + ext_val: '100|1000' + } + ``` + 示例: + + ```javascript + // 签到功能 + private onSign() { + PCSDK.stat.event(EventKeys.FunctionSign, '主界面'); + } + + // 开始加载资源 + private loadRes() { + PCSDK.stat.event(EventKeys.LoadingExhibition, '加载界面'); + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + // 升级领奖 + private onReward(e: Laya.Event) { + PCSDK.stat.event(EventKeys.LvUpRewards, '升级界面'); + SDKTools.shareDispatch(ShareKey.LevelUpDiamond, { + success: this.handleDoubleReward, + context: this + }); + } + ``` -- libgit2 0.21.0