diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b9be865..0000000 --- a/.gitignore +++ /dev/null @@ -1,64 +0,0 @@ -# Node rules: -## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -## Dependency directory -## Commenting this out is preferred by some people, see -## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git -node_modules -node_modules/ -node_modules/**/* - -# Book build output -_book - -# eBook build output -*.epub -*.mobi -*.pdf -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion - -*.iml - -## Directory-based project format: -.idea/ -# if you remove the above rule, at least ignore the following: - -# User-specific stuff: -# .idea/workspace.xml -# .idea/tasks.xml -# .idea/dictionaries - -# Sensitive or high-churn files: -# .idea/dataSources.ids -# .idea/dataSources.xml -# .idea/sqlDataSources.xml -# .idea/dynamic.xml -# .idea/uiDesigner.xml - -# Gradle: -# .idea/gradle.xml -# .idea/libraries - -# Mongo Explorer plugin: -# .idea/mongoSettings.xml - -## File-based project format: -*.ipr -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties diff --git a/README.md b/README.md deleted file mode 100644 index 5dea247..0000000 --- a/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# 噗嗤SDK -PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。 -PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。 - -**PCSDK提供的模块功能:** - -- [统计模块](stat.md) -- [分享视频模块](share.md) -- [配置参数模块️](online.md) -- [多平台接口模块](platform.md) -- [数据模块](data.md) -- [事件模块](event.md) - - - -# 噗嗤管理后台 -噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。 - -噗嗤管理后台地址: - -- https://data.d3games.com/#/login - -**友情提示:** - -- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。** -- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。** -- **登录后台即可使用后台提供的各项服务** - - - -**后台概览:** -## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图") - - - -**后台提供数据分析功能(不能跳转请联系管理员添加权限):** - -- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart) -- [分享数据分析](https://data.d3games.com/index.html#/share_exact) -- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list) -- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list) - - - -**后台提供配置相关功能(不能跳转请联系管理员添加权限):** - -- [分享/视频配置](https://data.d3games.com/index.html#/share_list) -- [配置参数](https://data.d3games.com/index.html#/config_list) - - -# 更多: -- 快速接入,请详读 [安装步骤](install.md) - - - -- 遇到问题可以查看 [FAQ](faq.md) \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index 5f8447c..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,28 +0,0 @@ -# Summary -## SDK入门 -* [SDK简介](intro.md) -* [SDK下载](download.md) -* [安装步骤️️️️](install.md) - -## SDK手册 -* [模块概览](modules.md) - -* [统计模块](stat.md) - * [启动注册打点️](stat_active.md) - * [关卡分析打点️️](stat_level.md) - * [支付结果打点](stat_pay.md) - * [自定义事件打点](stat_event.md) - * [交叉推广位](stat_ads.md) -* [分享视频模块](share.md) -* [配置参数模块️](online.md) -* [多平台接口模块](platform.md) - * [打开客服消息](platform.md#service) - * [检测自动更新](platform.md#checkUpdate) - * [复制文本内容](platform.md#copy) - * [震动接口](platform.md#vibrate) - * [小游戏推荐弹窗组件GamePortal](platform.md#gamePortal) - * [小游戏插屏广告组件InterstitialAd](platform.md#interstitialAd) - * [小游戏推荐icon组件GameIcon](platform.md#gameicon) -* [数据模块](data.md) -* [事件模块](event.md) -* [FAQ❎](faq.md) \ No newline at end of file diff --git a/book.json b/book.json deleted file mode 100644 index e4d88e2..0000000 --- a/book.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "title": "噗嗤游戏使用文档", - "description": "记录 GitBook 的配置和一些插件的使用", - "author": "zhangjikai", - "output.name": "site", - "language": "zh-hans", - "gitbook": "3.2.3", - "root": ".", - "plugins": [ - "-lunr", - "-search", - "-sharing", - "-highlight", - "-livereload", - "emphasize", - "simple-page-toc@^0.1.1", - "prism", - "prism-themes", - "include-codeblock@^3.0.2", - "splitter@^0.0.8", - "tbfed-pagefooter@^0.0.1", - "expandable-chapters-small@^0.1.7", - "sectionx@^3.1.0", - "local-video@^1.0.1", - "anchor-navigation-ex", - "todo@^0.1.3", - "popup", - "lightbox", - "copy-code-button" - ], - "structure": { - "readme": "README.md" - }, - "styles": { - "website": "styles/website.css" - }, - "pluginsConfig": { - "prism": { - "css": [ - "prism-themes/themes/prism-base16-ateliersulphurpool.light.css" - ] - }, - "anchor-navigation-ex": { - "associatedWithSummary": false, - "showLevel": true, - "multipleH1": true, - "mode": "float", - "pageTop": { - "showLevelIcon": false, - "level1Icon": "fa fa-hand-o-right", - "level2Icon": "fa fa-hand-o-right", - "level3Icon": "fa fa-hand-o-right" - } - } - } -} \ No newline at end of file diff --git a/data.md b/data.md deleted file mode 100644 index 26e7b8b..0000000 --- a/data.md +++ /dev/null @@ -1,226 +0,0 @@ - -# 数据模块 - ------- - -#### **简介** - -此模块为开发者提供游戏用到的一些数据信息,例如:config.js配置的GameId,ChannelId、从分享链接进入query携带的参数(share_id/share_key/user_invite_uid/channel_id)、setLogind设置的用户ID(userId)和用户注册时间(regTime)等等,详细请阅读下面的api。 - - - -#### **API:** - -| **名称** | **功能说明** | -| ------------------------------- | ------------------------------------------------------------ | -| PCSDK.data.GameId | 获取游戏的GameId,来源于config.js配置的GameId | -| PCSDK.data.ChannelId| 获取游戏渠道ID,来源于config.js配置的ChannelId | -| PCSDK.data.UserId | 获取用户ID,setLoginInfo传递的openId的值| -| PCSDK.data.RegTime | 获取用户注册时间,setLoginInfo传递的regTime的值 | -| PCSDK.data.ShareId | 获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0 | -| PCSDK.data.ShareKey | 接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key | -| PCSDK.data.Platform | 获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) | -| PCSDK.data.SystemId | 获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备) | -| PCSDK.data.QueryUserInviteUid | 获取此次分享会话进入游戏,分享来源者用户ID | -| PCSDK.data.IsCross | 获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏 | -| PCSDK.data.IsDrawer | 获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏 | -| PCSDK.data.IsGuessLike | 获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏 | - - - -1. ##### **GameId** - - ```javascript - PCSDK.data.GameId: number - ``` - - 定义:获取游戏的GameId,该值来源于congfig.js中的【GameId】配置。详细[阅读config.js的GameId参数详解](install.md#config_env) - - 示例: - - ```javascript - let gameId = PCSDK.data.GameId; - ``` -2. ##### **ChannelId** - - ```javascript - PCSDK.data.ChannelId: number - ``` - - 定义:获取游戏的渠道Id,该值来源于congfig.js中的【ChannelId】配置。详细[阅读config.js的ChannelId参数详解](install.md#config_env) - - 示例: - - ```javascript - let channelId = PCSDK.data.ChannelId; - ``` -3. ##### **UserId** - - ```javascript - PCSDK.data.UserId: number | string - ``` - - 定义:获取用户ID,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的openId - - 示例: - - ```javascript - let userId = PCSDK.data.UserId; - ``` -4. ##### **RegTime** - - ```javascript - PCSDK.data.RegTime: number - ``` - - 定义:获取用户第一次创角的时间戳,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的regTime - - 示例: - - ```javascript - let regTime = PCSDK.data.RegTime; - ``` -5. ##### **ShareId** - - ```javascript - PCSDK.data.ShareId: number - ``` - - 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_id参数,从分享会话点入游戏,获取此次分享会话的shareId,不是从分享会话点入游戏ShareId为0 - - 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入 - ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍") - - ```javascript - // shareId的值为:680 - let shareId = PCSDK.data.ShareId; - ``` -6. ##### **ShareKey** - - ```javascript - PCSDK.data.ShareKey: string - ``` - - 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_key参数,从分享会话点入游戏,获取此次分享会话的shareKey,不是从分享会话点入游戏ShareKey为'' - - 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入 - ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍") - - ```javascript - // shareKey的值为:success_double - let shareKey = PCSDK.data.ShareKey; - ``` -7. ##### **Platform** - - ```javascript - PCSDK.data.Platform: string - ``` - - 定义:获取游戏运行平台环境:devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) - - 示例: - - ```javascript - let platform = PCSDK.data.Platform; - switch (platform) { - case 'devtools': // 开发者工具 - - break; - - case 'ios': // 苹果设备 - - break; - - case 'android': // 安卓设备 - - break; - } - ``` -8. ##### **SystemId** - - ```javascript - PCSDK.data.SystemId: number - ``` - - 定义:获取游戏运行平台环境:0(开发者调试工具或ios)、1(安卓设备) - - 示例: - - ```javascript - let systemId = PCSDK.data.SystemId; - switch (systemId) { - case 0: // 开发者工具 or 苹果设备 - - break; - - case 1: // 安卓设备 - - break; - } - ``` -9. ##### **QueryUserInviteUid** - - ```javascript - PCSDK.data.QueryUserInviteUid: any - ``` - - 定义:获取此次分享会话进入游戏,分享来源者用户userId - - 接入SDK的分享视频模块,分享出去的链接query会携带invite_user_uid参数,从分享会话点入游戏,获取此次分享会话的邀请者id: invite_user_uid,不是从分享会话点入游戏QueryUserInviteUid为0。 - >>>开发者不接入SDK分享视频模块,游戏分享url的query参数必须要加入以下两个参数channel_id与user_invite_uid:channel_id的值通过ChannelId api获取,user_invite_uid的值可通过UserId api获取,也可以开发者从游戏中得到。 - >>>每次分享query请携带: - ```javascript - `channel_id=${ PCSDK.data.ChannelId }&user_invite_uid=${ PCSDK.data.UserId }` - ``` - - 示例: - - ```javascript - // 从分享会话邀请链接进入,获得的值为邀请者用户id,不是分享会话邀请进入获取值为0 - let inviteUid = PCSDK.data.QueryUserInviteUid; - ``` -10. ##### **IsCross**
- - ```javascript - PCSDK.data.IsCross: boolean - ``` - - 定义:获取是否显示/隐藏交叉悬浮框推广位,true:显示,false:隐藏 - - 示例:获取是否显示交叉悬浮框推广位 - - ```javascript - // 设置交叉悬浮框推广位ui的显示隐藏 - let isShow = PCSDK.data.IsCross; - this.uiCross.visible = isShow; - ``` -11. ##### **IsDrawer** - - ```javascript - PCSDK.data.IsDrawer: boolean - ``` - - 定义:获取是否显示/隐藏交叉抽屉推广位,true:显示,false:隐藏 - - 示例: - - ```javascript - // 设置交叉抽屉推广位ui的显示隐藏 - let isShow = PCSDK.data.IsDrawer; - this.uiDrawer.visible = isShow; - ``` -12. ##### **IsGuessLike** - - ```javascript - PCSDK.data.IsGuessLike: boolean - ``` - - 定义:获取是否显示/隐藏交叉猜你喜欢推广位,true:显示,false:隐藏 - - 示例: - - ```javascript - // 设置交叉猜你喜欢推广位ui的显示隐藏 - let isShow = PCSDK.data.IsGuessLike; - this.uiGuessLike.visible = isShow; - ``` \ No newline at end of file diff --git a/download.md b/download.md deleted file mode 100644 index 1705ea9..0000000 --- a/download.md +++ /dev/null @@ -1,61 +0,0 @@ -# SDK下载 - ------- - -## [v1.0.0.3 下载](https://dep.miso-lab.com/sdkword/versions/sdk-in-v1.0.0.3.zip) - -> *发布时间*:2019.09.18 - -**新增:** - -1. 移除掉stat模块的onlineTimeLen和logout api。 -2. 微信小游戏引入GameIcon、GameBanner、GamePortal组件。 -3. config.js添加积分投放IntegralChannelId参数,用于积分投放渠道统计。 - -## [v1.0.0.2 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.2.zip) - -> *发布时间*:2019.09.11 - -**修复:** - -1. 修复外部游戏设置openId导致userId为0的问题:外部游戏openId替换userId。 - -**新增:** - -1. 外部游戏修改setLogind接口为setLoginInfo( { openId: strinng , retTime: number } )。 -2. loadingFinish传递isActive参数,isActive为true SDK在loadingFinish结束后自动调用active。 - -## [v1.0.0.1 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.1.zip) - -> *发布时间*:2019.09.04 - -**修复:** - -1. 修复外部游戏stat launch api调用时序问题导致参数传递异常 - -**新增:** - -1. config.js配置ShareData新增share_wxad_id参数:视频广告uid,配置此参数,推送看视频,不配置或者配置的uid无效则推送分享。 -2. stat模块的addLogLevel拆分为多个接口:logLevelRelive、logLevelWin、logLevelFail、logLevelHide,addLogLevel继续保留。 -3. data模块新增了三个控制交叉推广位动态控制显示/隐藏的api:IsCross、IsDrawer、IsGuessLike。 -4. share模块重新命名为:shareVideo,shareDispatch修改为dispatch、shareWithType修改为dispatchType、getShareType修改为getShareVideoType,原来的share模块还是能用。 - - -## [v1.0.0.0 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.0.zip) - -> *发布时间*:2019.08.31 - -**修复:** - -1. SDK外部版本不需要接入方调用stat 模块launch接口,SDK启动时候自动调用。 -2. QQ轻游戏分享不成功回调的问题。 -3. QQ轻游戏banner广告不贴底部的问题。 - -**新增:** - -1. config.js配置新增IsOnlineAutoUse、IsOnlineDebug、ShareRightKey配置参数。 - - 在线参数获取通过配置决定是否启动拉取,右上角分享配置进行读取shareKey。 - -2. SDK分享模块不区分内部还是外部游戏,都引入分享/视频模块功能。 - diff --git a/event.md b/event.md deleted file mode 100644 index 220605f..0000000 --- a/event.md +++ /dev/null @@ -1,275 +0,0 @@ -# 事件模块 -事件是一种观察者的设计模式,对象可以发布事件,然后其它对象可以观察该对象,等待这些时刻到来并通过运行代码来响应。 - -事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。 - -开发者游戏项目和PCSDK属于两个不同的模块,PCSDK会在SDK内部处理一些业务,想要把这些处理结果告知开发者,那么自定义事件就派上用场了,SDK封装了一个event模块:PCSDK.event,开发者可使用这个模块接收SDK内部派发的消息,也可以应用在游戏中不同模块中通信的情况。 - -PCSDK内部派发了以下几个内部消息,开发者可根据实际功能需要使用PCSDK.event api监听这些消息: - -> 1、app.show:多平台的onShow事件消息,例如微信小游戏、QQ轻游戏的onShow事件。使用方式: -> -> **PCSDK.event.add( 'app.show' , 处理此消息的事件函数, 事件函数上下文)** - -> 2、app.hide: 多平台的onHide事件消息,例如微信小游戏、QQ轻游戏的onHide事件。使用方式: -> -> **PCSDK.event.add( 'app.hide' , 处理此消息的事件函数, 事件函数上下文)** - -> 3、tactic.update:推送策略更新事件消息,接入[分享视频模块(shareVideo)](share.md)后,某个功能点当前分享/视频完成后,下一次推送策略类型会通过这个消息发送处理,开发者监听这个消息,可处理游戏页面上的ui展示(如:视频分享icon、视频分享文案等),[查看完整示例](share.md#detail)。使用方式: -> -> **PCSDK.event.add( 'tactic.update' , 处理此消息的事件函数, 事件函数上下文)** - - -#### **接入API**: - -| **名称** | **功能说明** | -| ---------------- | ------------------------------------------------------------ | -| PCSDK.event.add | 添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文 | -| PCSDK.event.once | 添加一个事件监听,执行一次后会自动移除此事件监听 | -| PCSDK.event.emit | 触发事件监听:执行所绑定的事件类型对应的触发函数 | -| PCSDK.event.remove | 移除事件监听:移除添加的事件类型的触发函数 | -| PCSDK.event.removeAll | 移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 | - -1. **add** - ```javascript - PCSDK.event.add( evt_name: string, listener: Function, context: any ): PCSDK.event - ``` - - 定义:添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文。与之对应的是移除事件监听:PCSDK.event.remove:页面销毁或者关闭的时候移除监听 - - 参数: - - ```javascript - evt_name: string 必传 事件类型名称 - - listener: Function 必传 触发函数func,事件处理监听函数 - - context: any 必传 触发函数func执行上下文 - ``` - 返回值: - - ```javascript - PCSDK.event - 返回的是event对象,方便链式调用, 例如: - PCSDK.event.add('update.money', () => { }, this ) - .add('update.exp', () => { }, this ); - ``` -
- 示例:游戏中进入Home场景监听金币更新函数,更新金币ui界面的值,关闭Home场景时,移除金币更新函数。 - - ```javascript - export default class HomeScene extends BaseView{ - protected addEvent() { - super.addEvent(); - // 添加注册金币更新事件监听 - PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); - } - - protected removeEvent() { - super.removeEvent(); - // 移除注册金币更新事件监听 - PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); - } - - /** - * 更新金币ui - */ - private handleUpdateMoney( money: number ){ - this.txtCoin.text = `${money}`; - } - } - - /** - * event事件枚举 - */ - export enum EventEnum{ - UPDATE_MONEY = 'update.money' - } - ``` -2. **once** - ```javascript - PCSDK.event.once( evt_name: string, listener: Function, context?: any ): PCSDK.event - ``` - - 定义:添加一个事件监听,执行一次后会自动移除此事件监听 - - 参数: - - ```javascript - evt_name: string 必传 事件类型名称 - - listener: Function 必传 触发函数func,事件处理监听函数 - - context: any 必传 触发函数func执行上下文 - ``` - 返回值: - - ```javascript - PCSDK.event - 返回的是event对象,方便链式调用, 例如: - PCSDK.event.once('update.money', () => { }, this ) - .once('update.exp', () => { }, this ); - ``` - - 示例:游戏中进入Home场景监听金币更新函数一次,该函数执行完一次后会自动移除该监听事件函数。 - - ```javascript - export default class HomeScene extends BaseView{ - protected open(){ - super.open(); - // 添加一次注册金币更新事件监听,该事件监听执行一次后,自动移除 - PCSDK.event.once(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); - } - - /** - * 更新金币ui - */ - private handleUpdateMoney( money: number ){ - this.txtCoin.text = `${money}`; - } - } - - /** - * event事件枚举 - */ - export enum EventEnum{ - UPDATE_MONEY = 'update.money' - } - ``` -3. **emit** - ```javascript - PCSDK.event.emit( evt_name: string, ...args: any[] ): PCSDK.event - ``` - - 定义:派发事件监听消息:执行所绑定的事件类型对应的触发函数,可以传递一些触发函数需要的其他任意参数 - - 参数: - - ```javascript - evt_name: string 必传 事件类型名称 - - args: any[] 选传 触发函数需要的其他任意参数 - ``` - 返回值: - - ```javascript - PCSDK.event - 返回的是event对象,方便链式调用, 例如: - PCSDK.event.emit('update.money', 10000) - .emit('update.exp', 2, 1000 ); - ``` - - 示例:游戏中金币领取奖励弹出框,点击领奖后派发金币更新的消息 - - ```javascript - // RewardCoinPopwin弹出框领奖励后,派发update.money消息 - export default class RewardCoinPopwin extends BaseView{ - private rewardCoin: number; - - protected open(){ - super.open(); - this.rewardCoin = 10000000; - } - - protected addEvent() { - super.addEvent(); - this.btnReward.on(Laya.Event.CLICK, this, this.onReward); - } - - protected removeEvent() { - super.removeEvent(); - this.btnReward.off(Laya.Event.CLICK, this, this.onReward); - } - - /** - * 金币领取奖励 - */ - private onReward(ev: Laya.Event){ - // 派发金币更新的消息,并把添加的金币传递 - PCSDK.event.emit(EventEnum.UPDATE_MONEY, this.rewardCoin ); - } - } - - // HomeScene监听update.money消息,处理加金币操作 - export default class HomeScene extends BaseView{ - protected addEvent() { - super.addEvent(); - // 添加注册金币更新事件监听 - PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); - } - - protected removeEvent() { - super.removeEvent(); - // 移除注册金币更新事件监听 - PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); - } - - /** - * 更新金币ui - */ - private handleUpdateMoney( addMoney: number ){ - this.txtAddCoin.text = `${addMoney}`; - } - } - - /** - * event事件枚举 - */ - export enum EventEnum{ - UPDATE_MONEY = 'update.money' - } - ``` - -4. **remove** - ```javascript - PCSDK.event.remove( evt_name: string, listener: Function, context?: any ): PCSDK.event - ``` - - 定义:移除事件监听:移除添加的事件类型的触发函数。 - - 参数: - - ```javascript - evt_name: string 必传 事件类型名称 - - listener: Function 必传 触发函数func,事件处理监听函数 - - context: any 必传 触发函数func执行上下文 - ``` - 返回值: - - ```javascript - PCSDK.event - 返回的是event对象,方便链式调用, 例如: - PCSDK.event.remove('update.money', () => { }, this ) - .remove('update.exp', () => { }, this ); - ``` - - 示例:[见上例](event.md#event_add) - -5. **removeAll** - ```javascript - PCSDK.event.removeAll( evt_name: string ): PCSDK.event - ``` - - 定义:移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 - - 参数: - - ```javascript - evt_name: string 必传 事件类型名称 - ``` - 返回值: - - ```javascript - PCSDK.event - 返回的是event对象,方便链式调用, 例如: - PCSDK.event.removeAll('update.money') - .removeAll('update.exp'); - ``` - - 示例: - - 移除游戏中所有update.money事件监听:PCSDK.event.removeAll('update.money'); - - 移除游戏中所有update.exp事件监听:PCSDK.event.removeAll('update.exp'); diff --git a/faq.md b/faq.md deleted file mode 100644 index 53425fe..0000000 --- a/faq.md +++ /dev/null @@ -1,174 +0,0 @@ -# FAQ - ------- - -#### **简介** - -启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 - - - -#### **后台使用** - -完成启动注册打点后,登录后台->头部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/inner/.gitignore b/inner/.gitignore new file mode 100644 index 0000000..b9be865 --- /dev/null +++ b/inner/.gitignore @@ -0,0 +1,64 @@ +# Node rules: +## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +## Dependency directory +## Commenting this out is preferred by some people, see +## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git +node_modules +node_modules/ +node_modules/**/* + +# Book build output +_book + +# eBook build output +*.epub +*.mobi +*.pdf +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties diff --git a/inner/README.md b/inner/README.md index 89665db..5dea247 100644 --- a/inner/README.md +++ b/inner/README.md @@ -16,17 +16,9 @@ PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台, # 噗嗤管理后台 噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。 -方便开发者联调测试阶段不影响上线游戏运营相关数据或者配置信息,config.js的Env配置提供测试和正式环境切换。 - -> 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login) - -> 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login) - 噗嗤管理后台地址: -- 测试服后台,地址:http://pre-data.d3games.com/#/login - -- 正式服后台,地址:https://data.d3games.com/#/login +- https://data.d3games.com/#/login **友情提示:** @@ -52,8 +44,8 @@ PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台, **后台提供配置相关功能(不能跳转请联系管理员添加权限):** -- [分享/视频配置](http://pre-data.d3games.com/index.html#/share_list) -- [配置参数](http://pre-data.d3games.com/index.html#/config_list) +- [分享/视频配置](https://data.d3games.com/index.html#/share_list) +- [配置参数](https://data.d3games.com/index.html#/config_list) # 更多: diff --git a/inner/SUMMARY.md b/inner/SUMMARY.md new file mode 100644 index 0000000..5f8447c --- /dev/null +++ b/inner/SUMMARY.md @@ -0,0 +1,28 @@ +# Summary +## SDK入门 +* [SDK简介](intro.md) +* [SDK下载](download.md) +* [安装步骤️️️️](install.md) + +## SDK手册 +* [模块概览](modules.md) + +* [统计模块](stat.md) + * [启动注册打点️](stat_active.md) + * [关卡分析打点️️](stat_level.md) + * [支付结果打点](stat_pay.md) + * [自定义事件打点](stat_event.md) + * [交叉推广位](stat_ads.md) +* [分享视频模块](share.md) +* [配置参数模块️](online.md) +* [多平台接口模块](platform.md) + * [打开客服消息](platform.md#service) + * [检测自动更新](platform.md#checkUpdate) + * [复制文本内容](platform.md#copy) + * [震动接口](platform.md#vibrate) + * [小游戏推荐弹窗组件GamePortal](platform.md#gamePortal) + * [小游戏插屏广告组件InterstitialAd](platform.md#interstitialAd) + * [小游戏推荐icon组件GameIcon](platform.md#gameicon) +* [数据模块](data.md) +* [事件模块](event.md) +* [FAQ❎](faq.md) \ No newline at end of file diff --git a/inner/book.json b/inner/book.json new file mode 100644 index 0000000..5b8b71e --- /dev/null +++ b/inner/book.json @@ -0,0 +1,69 @@ +{ + "title": "噗嗤游戏使用文档", + "description": "记录 GitBook 的配置和一些插件的使用", + "author": "zhangjikai", + "output.name": "site", + "language": "zh-hans", + "gitbook": "3.2.3", + "root": ".", + "plugins": [ + "-lunr", + "-search", + "-sharing", + "-highlight", + "-livereload", + "emphasize", + "simple-page-toc@^0.1.1", + "prism", + "prism-themes", + "include-codeblock@^3.0.2", + "splitter@^0.0.8", + "tbfed-pagefooter@^0.0.1", + "expandable-chapters-small@^0.1.7", + "sectionx@^3.1.0", + "local-video@^1.0.1", + "anchor-navigation-ex", + "todo@^0.1.3", + "popup", + "lightbox", + "versions-select@^0.1.1", + "copy-code-button" + ], + "structure": { + "readme": "README.md" + }, + "styles": { + "website": "styles/website.css" + }, + "pluginsConfig": { + "versions": { + "options": [ + { + "value": "http://dep.miso-lab.com/sdkword/web/v1.0/intro.html", + "text": "外部游戏-v1.0.0.3" + }, + { + "value": "http://dep.miso-lab.com/sdkword/web/v2.0/intro.html", + "text": "内部游戏-v1.0.0.3" + } + ] + }, + "prism": { + "css": [ + "prism-themes/themes/prism-base16-ateliersulphurpool.light.css" + ] + }, + "anchor-navigation-ex": { + "associatedWithSummary": false, + "showLevel": true, + "multipleH1": true, + "mode": "float", + "pageTop": { + "showLevelIcon": false, + "level1Icon": "fa fa-hand-o-right", + "level2Icon": "fa fa-hand-o-right", + "level3Icon": "fa fa-hand-o-right" + } + } + } +} \ No newline at end of file diff --git a/inner/data.md b/inner/data.md new file mode 100644 index 0000000..26e7b8b --- /dev/null +++ b/inner/data.md @@ -0,0 +1,226 @@ + +# 数据模块 + +------ + +#### **简介** + +此模块为开发者提供游戏用到的一些数据信息,例如:config.js配置的GameId,ChannelId、从分享链接进入query携带的参数(share_id/share_key/user_invite_uid/channel_id)、setLogind设置的用户ID(userId)和用户注册时间(regTime)等等,详细请阅读下面的api。 + + + +#### **API:** + +| **名称** | **功能说明** | +| ------------------------------- | ------------------------------------------------------------ | +| PCSDK.data.GameId | 获取游戏的GameId,来源于config.js配置的GameId | +| PCSDK.data.ChannelId| 获取游戏渠道ID,来源于config.js配置的ChannelId | +| PCSDK.data.UserId | 获取用户ID,setLoginInfo传递的openId的值| +| PCSDK.data.RegTime | 获取用户注册时间,setLoginInfo传递的regTime的值 | +| PCSDK.data.ShareId | 获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0 | +| PCSDK.data.ShareKey | 接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key | +| PCSDK.data.Platform | 获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) | +| PCSDK.data.SystemId | 获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备) | +| PCSDK.data.QueryUserInviteUid | 获取此次分享会话进入游戏,分享来源者用户ID | +| PCSDK.data.IsCross | 获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏 | +| PCSDK.data.IsDrawer | 获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏 | +| PCSDK.data.IsGuessLike | 获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏 | + + + +1. ##### **GameId** + + ```javascript + PCSDK.data.GameId: number + ``` + + 定义:获取游戏的GameId,该值来源于congfig.js中的【GameId】配置。详细[阅读config.js的GameId参数详解](install.md#config_env) + + 示例: + + ```javascript + let gameId = PCSDK.data.GameId; + ``` +2. ##### **ChannelId** + + ```javascript + PCSDK.data.ChannelId: number + ``` + + 定义:获取游戏的渠道Id,该值来源于congfig.js中的【ChannelId】配置。详细[阅读config.js的ChannelId参数详解](install.md#config_env) + + 示例: + + ```javascript + let channelId = PCSDK.data.ChannelId; + ``` +3. ##### **UserId** + + ```javascript + PCSDK.data.UserId: number | string + ``` + + 定义:获取用户ID,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的openId + + 示例: + + ```javascript + let userId = PCSDK.data.UserId; + ``` +4. ##### **RegTime** + + ```javascript + PCSDK.data.RegTime: number + ``` + + 定义:获取用户第一次创角的时间戳,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的regTime + + 示例: + + ```javascript + let regTime = PCSDK.data.RegTime; + ``` +5. ##### **ShareId** + + ```javascript + PCSDK.data.ShareId: number + ``` + + 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_id参数,从分享会话点入游戏,获取此次分享会话的shareId,不是从分享会话点入游戏ShareId为0 + + 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍") + + ```javascript + // shareId的值为:680 + let shareId = PCSDK.data.ShareId; + ``` +6. ##### **ShareKey** + + ```javascript + PCSDK.data.ShareKey: string + ``` + + 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_key参数,从分享会话点入游戏,获取此次分享会话的shareKey,不是从分享会话点入游戏ShareKey为'' + + 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍") + + ```javascript + // shareKey的值为:success_double + let shareKey = PCSDK.data.ShareKey; + ``` +7. ##### **Platform** + + ```javascript + PCSDK.data.Platform: string + ``` + + 定义:获取游戏运行平台环境:devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) + + 示例: + + ```javascript + let platform = PCSDK.data.Platform; + switch (platform) { + case 'devtools': // 开发者工具 + + break; + + case 'ios': // 苹果设备 + + break; + + case 'android': // 安卓设备 + + break; + } + ``` +8. ##### **SystemId** + + ```javascript + PCSDK.data.SystemId: number + ``` + + 定义:获取游戏运行平台环境:0(开发者调试工具或ios)、1(安卓设备) + + 示例: + + ```javascript + let systemId = PCSDK.data.SystemId; + switch (systemId) { + case 0: // 开发者工具 or 苹果设备 + + break; + + case 1: // 安卓设备 + + break; + } + ``` +9. ##### **QueryUserInviteUid** + + ```javascript + PCSDK.data.QueryUserInviteUid: any + ``` + + 定义:获取此次分享会话进入游戏,分享来源者用户userId + + 接入SDK的分享视频模块,分享出去的链接query会携带invite_user_uid参数,从分享会话点入游戏,获取此次分享会话的邀请者id: invite_user_uid,不是从分享会话点入游戏QueryUserInviteUid为0。 + >>>开发者不接入SDK分享视频模块,游戏分享url的query参数必须要加入以下两个参数channel_id与user_invite_uid:channel_id的值通过ChannelId api获取,user_invite_uid的值可通过UserId api获取,也可以开发者从游戏中得到。 + >>>每次分享query请携带: + ```javascript + `channel_id=${ PCSDK.data.ChannelId }&user_invite_uid=${ PCSDK.data.UserId }` + ``` + + 示例: + + ```javascript + // 从分享会话邀请链接进入,获得的值为邀请者用户id,不是分享会话邀请进入获取值为0 + let inviteUid = PCSDK.data.QueryUserInviteUid; + ``` +10. ##### **IsCross**
+ + ```javascript + PCSDK.data.IsCross: boolean + ``` + + 定义:获取是否显示/隐藏交叉悬浮框推广位,true:显示,false:隐藏 + + 示例:获取是否显示交叉悬浮框推广位 + + ```javascript + // 设置交叉悬浮框推广位ui的显示隐藏 + let isShow = PCSDK.data.IsCross; + this.uiCross.visible = isShow; + ``` +11. ##### **IsDrawer** + + ```javascript + PCSDK.data.IsDrawer: boolean + ``` + + 定义:获取是否显示/隐藏交叉抽屉推广位,true:显示,false:隐藏 + + 示例: + + ```javascript + // 设置交叉抽屉推广位ui的显示隐藏 + let isShow = PCSDK.data.IsDrawer; + this.uiDrawer.visible = isShow; + ``` +12. ##### **IsGuessLike** + + ```javascript + PCSDK.data.IsGuessLike: boolean + ``` + + 定义:获取是否显示/隐藏交叉猜你喜欢推广位,true:显示,false:隐藏 + + 示例: + + ```javascript + // 设置交叉猜你喜欢推广位ui的显示隐藏 + let isShow = PCSDK.data.IsGuessLike; + this.uiGuessLike.visible = isShow; + ``` \ No newline at end of file diff --git a/inner/download.md b/inner/download.md new file mode 100644 index 0000000..0004689 --- /dev/null +++ b/inner/download.md @@ -0,0 +1,61 @@ +# SDK下载 + +------ + +## [v1.0.0.3 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.3.zip) + +> *发布时间*:2019.09.18 + +**新增:** + +1. 移除掉stat模块的onlineTimeLen和logout api。 +2. 微信小游戏引入GameIcon、GameBanner、GamePortal组件。 +3. config.js添加积分投放IntegralChannelId参数,用于积分投放渠道统计。 + +## [v1.0.0.2 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.2.zip) + +> *发布时间*:2019.09.11 + +**修复:** + +1. 修复外部游戏设置openId导致userId为0的问题:外部游戏openId替换userId。 + +**新增:** + +1. 外部游戏修改setLogind接口为setLoginInfo( { openId: strinng , retTime: number } )。 +2. loadingFinish传递isActive参数,isActive为true SDK在loadingFinish结束后自动调用active。 + +## [v1.0.0.1 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.1.zip) + +> *发布时间*:2019.09.04 + +**修复:** + +1. 修复外部游戏stat launch api调用时序问题导致参数传递异常 + +**新增:** + +1. config.js配置ShareData新增share_wxad_id参数:视频广告uid,配置此参数,推送看视频,不配置或者配置的uid无效则推送分享。 +2. stat模块的addLogLevel拆分为多个接口:logLevelRelive、logLevelWin、logLevelFail、logLevelHide,addLogLevel继续保留。 +3. data模块新增了三个控制交叉推广位动态控制显示/隐藏的api:IsCross、IsDrawer、IsGuessLike。 +4. share模块重新命名为:shareVideo,shareDispatch修改为dispatch、shareWithType修改为dispatchType、getShareType修改为getShareVideoType,原来的share模块还是能用。 + + +## [v1.0.0.0 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.0.zip) + +> *发布时间*:2019.08.31 + +**修复:** + +1. SDK外部版本不需要接入方调用stat 模块launch接口,SDK启动时候自动调用。 +2. QQ轻游戏分享不成功回调的问题。 +3. QQ轻游戏banner广告不贴底部的问题。 + +**新增:** + +1. config.js配置新增IsOnlineAutoUse、IsOnlineDebug、ShareRightKey配置参数。 + + 在线参数获取通过配置决定是否启动拉取,右上角分享配置进行读取shareKey。 + +2. SDK分享模块不区分内部还是外部游戏,都引入分享/视频模块功能。 + diff --git a/inner/event.md b/inner/event.md new file mode 100644 index 0000000..220605f --- /dev/null +++ b/inner/event.md @@ -0,0 +1,275 @@ +# 事件模块 +事件是一种观察者的设计模式,对象可以发布事件,然后其它对象可以观察该对象,等待这些时刻到来并通过运行代码来响应。 + +事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。 + +开发者游戏项目和PCSDK属于两个不同的模块,PCSDK会在SDK内部处理一些业务,想要把这些处理结果告知开发者,那么自定义事件就派上用场了,SDK封装了一个event模块:PCSDK.event,开发者可使用这个模块接收SDK内部派发的消息,也可以应用在游戏中不同模块中通信的情况。 + +PCSDK内部派发了以下几个内部消息,开发者可根据实际功能需要使用PCSDK.event api监听这些消息: + +> 1、app.show:多平台的onShow事件消息,例如微信小游戏、QQ轻游戏的onShow事件。使用方式: +> +> **PCSDK.event.add( 'app.show' , 处理此消息的事件函数, 事件函数上下文)** + +> 2、app.hide: 多平台的onHide事件消息,例如微信小游戏、QQ轻游戏的onHide事件。使用方式: +> +> **PCSDK.event.add( 'app.hide' , 处理此消息的事件函数, 事件函数上下文)** + +> 3、tactic.update:推送策略更新事件消息,接入[分享视频模块(shareVideo)](share.md)后,某个功能点当前分享/视频完成后,下一次推送策略类型会通过这个消息发送处理,开发者监听这个消息,可处理游戏页面上的ui展示(如:视频分享icon、视频分享文案等),[查看完整示例](share.md#detail)。使用方式: +> +> **PCSDK.event.add( 'tactic.update' , 处理此消息的事件函数, 事件函数上下文)** + + +#### **接入API**: + +| **名称** | **功能说明** | +| ---------------- | ------------------------------------------------------------ | +| PCSDK.event.add | 添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文 | +| PCSDK.event.once | 添加一个事件监听,执行一次后会自动移除此事件监听 | +| PCSDK.event.emit | 触发事件监听:执行所绑定的事件类型对应的触发函数 | +| PCSDK.event.remove | 移除事件监听:移除添加的事件类型的触发函数 | +| PCSDK.event.removeAll | 移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 | + +1. **add** + ```javascript + PCSDK.event.add( evt_name: string, listener: Function, context: any ): PCSDK.event + ``` + + 定义:添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文。与之对应的是移除事件监听:PCSDK.event.remove:页面销毁或者关闭的时候移除监听 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + + listener: Function 必传 触发函数func,事件处理监听函数 + + context: any 必传 触发函数func执行上下文 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.add('update.money', () => { }, this ) + .add('update.exp', () => { }, this ); + ``` +
+ 示例:游戏中进入Home场景监听金币更新函数,更新金币ui界面的值,关闭Home场景时,移除金币更新函数。 + + ```javascript + export default class HomeScene extends BaseView{ + protected addEvent() { + super.addEvent(); + // 添加注册金币更新事件监听 + PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + protected removeEvent() { + super.removeEvent(); + // 移除注册金币更新事件监听 + PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + /** + * 更新金币ui + */ + private handleUpdateMoney( money: number ){ + this.txtCoin.text = `${money}`; + } + } + + /** + * event事件枚举 + */ + export enum EventEnum{ + UPDATE_MONEY = 'update.money' + } + ``` +2. **once** + ```javascript + PCSDK.event.once( evt_name: string, listener: Function, context?: any ): PCSDK.event + ``` + + 定义:添加一个事件监听,执行一次后会自动移除此事件监听 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + + listener: Function 必传 触发函数func,事件处理监听函数 + + context: any 必传 触发函数func执行上下文 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.once('update.money', () => { }, this ) + .once('update.exp', () => { }, this ); + ``` + + 示例:游戏中进入Home场景监听金币更新函数一次,该函数执行完一次后会自动移除该监听事件函数。 + + ```javascript + export default class HomeScene extends BaseView{ + protected open(){ + super.open(); + // 添加一次注册金币更新事件监听,该事件监听执行一次后,自动移除 + PCSDK.event.once(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + /** + * 更新金币ui + */ + private handleUpdateMoney( money: number ){ + this.txtCoin.text = `${money}`; + } + } + + /** + * event事件枚举 + */ + export enum EventEnum{ + UPDATE_MONEY = 'update.money' + } + ``` +3. **emit** + ```javascript + PCSDK.event.emit( evt_name: string, ...args: any[] ): PCSDK.event + ``` + + 定义:派发事件监听消息:执行所绑定的事件类型对应的触发函数,可以传递一些触发函数需要的其他任意参数 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + + args: any[] 选传 触发函数需要的其他任意参数 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.emit('update.money', 10000) + .emit('update.exp', 2, 1000 ); + ``` + + 示例:游戏中金币领取奖励弹出框,点击领奖后派发金币更新的消息 + + ```javascript + // RewardCoinPopwin弹出框领奖励后,派发update.money消息 + export default class RewardCoinPopwin extends BaseView{ + private rewardCoin: number; + + protected open(){ + super.open(); + this.rewardCoin = 10000000; + } + + protected addEvent() { + super.addEvent(); + this.btnReward.on(Laya.Event.CLICK, this, this.onReward); + } + + protected removeEvent() { + super.removeEvent(); + this.btnReward.off(Laya.Event.CLICK, this, this.onReward); + } + + /** + * 金币领取奖励 + */ + private onReward(ev: Laya.Event){ + // 派发金币更新的消息,并把添加的金币传递 + PCSDK.event.emit(EventEnum.UPDATE_MONEY, this.rewardCoin ); + } + } + + // HomeScene监听update.money消息,处理加金币操作 + export default class HomeScene extends BaseView{ + protected addEvent() { + super.addEvent(); + // 添加注册金币更新事件监听 + PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + protected removeEvent() { + super.removeEvent(); + // 移除注册金币更新事件监听 + PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + /** + * 更新金币ui + */ + private handleUpdateMoney( addMoney: number ){ + this.txtAddCoin.text = `${addMoney}`; + } + } + + /** + * event事件枚举 + */ + export enum EventEnum{ + UPDATE_MONEY = 'update.money' + } + ``` + +4. **remove** + ```javascript + PCSDK.event.remove( evt_name: string, listener: Function, context?: any ): PCSDK.event + ``` + + 定义:移除事件监听:移除添加的事件类型的触发函数。 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + + listener: Function 必传 触发函数func,事件处理监听函数 + + context: any 必传 触发函数func执行上下文 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.remove('update.money', () => { }, this ) + .remove('update.exp', () => { }, this ); + ``` + + 示例:[见上例](event.md#event_add) + +5. **removeAll** + ```javascript + PCSDK.event.removeAll( evt_name: string ): PCSDK.event + ``` + + 定义:移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.removeAll('update.money') + .removeAll('update.exp'); + ``` + + 示例: + + 移除游戏中所有update.money事件监听:PCSDK.event.removeAll('update.money'); + + 移除游戏中所有update.exp事件监听:PCSDK.event.removeAll('update.exp'); diff --git a/inner/faq.md b/inner/faq.md new file mode 100644 index 0000000..53425fe --- /dev/null +++ b/inner/faq.md @@ -0,0 +1,174 @@ +# FAQ + +------ + +#### **简介** + +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 + + + +#### **后台使用** + +完成启动注册打点后,登录后台->头部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/inner/inner/README.md b/inner/inner/README.md new file mode 100644 index 0000000..89665db --- /dev/null +++ b/inner/inner/README.md @@ -0,0 +1,64 @@ +# 噗嗤SDK +PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。 +PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。 + +**PCSDK提供的模块功能:** + +- [统计模块](stat.md) +- [分享视频模块](share.md) +- [配置参数模块️](online.md) +- [多平台接口模块](platform.md) +- [数据模块](data.md) +- [事件模块](event.md) + + + +# 噗嗤管理后台 +噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。 + +方便开发者联调测试阶段不影响上线游戏运营相关数据或者配置信息,config.js的Env配置提供测试和正式环境切换。 + +> 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login) + +> 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login) + +噗嗤管理后台地址: + +- 测试服后台,地址:http://pre-data.d3games.com/#/login + +- 正式服后台,地址:https://data.d3games.com/#/login + +**友情提示:** + +- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。** +- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。** +- **登录后台即可使用后台提供的各项服务** + + + +**后台概览:** +## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图") + + + +**后台提供数据分析功能(不能跳转请联系管理员添加权限):** + +- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart) +- [分享数据分析](https://data.d3games.com/index.html#/share_exact) +- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list) +- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list) + + + +**后台提供配置相关功能(不能跳转请联系管理员添加权限):** + +- [分享/视频配置](http://pre-data.d3games.com/index.html#/share_list) +- [配置参数](http://pre-data.d3games.com/index.html#/config_list) + + +# 更多: +- 快速接入,请详读 [安装步骤](install.md) + + + +- 遇到问题可以查看 [FAQ](faq.md) \ No newline at end of file diff --git a/inner/inner/install.md b/inner/inner/install.md new file mode 100644 index 0000000..37cb60f --- /dev/null +++ b/inner/inner/install.md @@ -0,0 +1,233 @@ +# 安装步骤 + +------ + +## SDK下载 + +1. 下载最新版本的SDK [SDK下载](download.md) 。 +2. 解压下载的sdk-out-v{版本号}.zip包,解压文件夹里面的的目录结构: + +``` +├── sdk.d.ts +├── sdk/ +| ├── config.js +| └── index.js +| └── libs/ + | └── game.min.js +``` + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_001.png "🔍点击查看大图") + +- **sdk.d.ts:sdk的ts声明文件,开发者项目采用Typescript开发,请复制该文件到项目中。** +- sdk/config.js:sdk配置文件,【[详细请阅读下方config.js参数说明](install.md#config)】 +- sdk/index.js:sdk入口文件,引入了sdk所提供的模块功能 +- sdk/libs/game.min.js:sdk类库核心代码文件 + + + +## 配置合法域名 + +* ##### 管理员或开发者身份在微信小程序后台→设置→开发者设置中添加 request、download合法域名 + 测试环境 request 合法域名: + + https://pre-dataapi.d3games.com (统计平台测试服域名) + + 正式环境 request 合法域名: + + https://dataapi.d3games.com (统计平台正式服域名) + + cdn资源请求合法域名: + + https://dep.miso-lab.com (>>>request、download均要添加<<<) + + + + + +​ +## SDK配置步骤 + +* #### 将下载下来的sdk压缩包,解压后,拷贝sdk文件夹到微信开发者工具项目中。 + + 示例:将sdk放入到小游戏开发者工具项目的src文件夹中 + + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_002.png "🔍点击查看大图") + + + + + +* #### 在game.js中将sdk.js文件使用require导入。 + + 示例:将sdk放入到小游戏开发者工具项目的src文件夹中 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_003.png "🔍点击查看大图") + + + + +* #### 根据运营提供的信息修改sdk文件夹下的**config**.js文件(可横向拖动查看查看更多====>)
+ + ```javascript + export default { + IsDebug: false, // 是否debug模式,debug模式会打印log,可使用stat模块setDebug api进行修改 + Env: 100, // 100表示正式环境,110表示测试环境,推荐测试联调阶段使用110,提审前切记改成100!!! + AdCacheDuration: 30, // 广告列表缓存持续时间间隔 + IsUseShareModule: true, // 是否使用分享模块 + IsOnlineAutoUse: true, // 是否开启sdk自动请求online模块(在线参数配置)的updateOnlineConfig,拉取在线参数配置 + IsOnlineDebug: true, // 是否开启online模块(配置参数模块)debug模式 + ShareRightKey: 'forward', // 右上角分享的shareKey,shareKey请阅读share模块说明,默认为forward,为空字符串则不使用右上角分享 + + ShareData: { // 必填,默认分享数据(拉取不到分享配置后使用,默认分享,SDK自动分配share_id为99999) + share_desc: 'xxx', + share_wxad_id: '', // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享 + share_icon: 'xxx' + }, + GameId: 0, // 必填,游戏ID,运营提供; + ChannelId: 0, // 必填,游戏渠道ID,运营提供; + Secret: '***请配置你的Secret***', // 必填,游戏的secret key + MidasPay: { // 米大师虚拟支付配置 + OfferId: "0", // 在米大师申请的应用id + ZoneId: "1", // 分区ID,默认:1 + Mode: "game", // 支付的类型,不同的支付类型有各自额外要传的附加参数,默认:game + CurrencyType: "CNY", // 币种,默认:CNY + Platform: '' // 申请接入时的平台,platform与应用id有关。默认:android(ios暂时没有开放,这里需要配置Platform,开放后,删掉此配置,sdk已经判断平台) + } +}; + ``` + + + 参数详解: + +
+1. **Env ( number ):**SDK执行环境,建议开发者测试联调阶段设为110。 + + > 提审阶段一定要设为100 + + > 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login) + + > 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login) + + 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启动时拉取后台配置的分享/视频列表,运营或者开发者登录后台后,配置分享/视频,开发者请详看分享视频模块接入。 + +5. **IsOnlineAutoUse( boolean ):**是否启用在线配置参数模块功能 + + false:两种处理 1)不启用在线配置参数模块功能; 2)启用在线配置参数功能,但是SDK启动时不自动调用updateOnlineConfig拉取后台配置参数列表,开发者在代码主动调用拉取在线配置参数:PCSDK.online.updateOnlineConfig(); + + 示例:开发者代码中主动拉取在线配置参数。 + + ```javascript + // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关 + PCSDK.online.updateOnlineConfig().then(() => { + // 获取是否后台动态配置开启插屏广告,1为开启,0为关闭 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; + // isInterstitialAd && '显示插屏广告'; + // 获取动态多个广告位开启的配置 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); + // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位'; + // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位'; + // pcGameOpenMap.Cross === 1 && '显示交叉推广位'; + }); + ``` + true:sdk启动时自动调用updateOnlineConfig拉取后台在线配置参数列表,开发者可通过 + + PCSDK.online.getParamsObj、PCSDK.online.getParamsInt、PCSDK.online.getParamsString、PCSDK.online.getParams api传递后台配置参数key获取在线配置参数。 + + 示例:IsOnlineAutoUse: true,开发者可使用下面api获取在线配置参数配置的值 + + ```javascript + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); + ``` + +6. **IsOnlineDebug( boolean ):**是否启用online模块(在线配置参数)debug模式,建议设置为true。 + + false:不启动debug模式,开发者主动调用updateOnlineConfig或者SDK启动时调用updateOnlineConfig都会把在线配置参数列表设置10分钟缓存,不用每次都去服务器请求,参照了友盟在线参数功能的设计 + + true: 开启debug模式,只要是请求updateOnlineConfig api都会立即发起请求,而不是去检测读取缓存 + +7. **ShareRightKey( string ):**右上角分享的shareKey,shareKey请阅读分享视频模块,默认为forward,为空字符串则不使用右上角分享,此配置在配置【IsUseShareModule: true】情况下生效。 + + 示例: + + 在后台的【分享/视频配置】栏目配置了一条分享key为:forward的分享配置 + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_004.png "🔍点击查看大图") + +8. **ShareData( object ):**此配置在【IsUseShareModule: true】起效,开发者如果接入了分享视频模块,>>> 请务必配置一条 <<<。 + + > IsUseShareModule设置true sdk启动拉取分享视频配置列表,如果分享视频列表拉取请求失败,或此shareKey不在分享视频配置列表中(登录后台 ->【游戏数据】->【分享/视频配置】栏没有配置分享key)就会使用此条设置的数据。 + + 示例:可从后台【游戏数据】->【分享/视频配置】中选取一条:复制文案,点击分享素材icon -> 查看大图 -> 右键查看分享图片的html源码复制src图片地址: + + ```json + { + // 分享文案内容 + share_desc: ' 半夜传来啪啪啪!竟是隔壁老王偷偷打气球', + // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享 + share_wxad_id: 'adunit-6958dcfc3f0bed31', + // 分享图 + share_icon: 'https://dep.miso-lab.com/data_analysis/games/res/5D57D4A3Yx.png' + } + ``` + + 操作步骤: + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_005.png "🔍点击查看大图") + +9. **GameId:必填,游戏id,请联系运营人员提供** + +10. **ChannelId:必填,游戏渠道id,请联系运营人员提供** + +11. **Secret:必填,游戏 Secret Key,请联系运营人员提供** + +12. **MidasPay( object ):**米大水虚拟支付配置,没有接入微信的米大师支付,请注意下面规则 + + OfferId:在米大师申请的应用id,没有接入米大师,默认为"0" + + ZoneId:分区ID,默认:"1" + + Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game" + + CurrencyType:币种,默认:"CNY" + + Platform:申请接入时的平台,platform与应用id有关。 + + 1)接入了米大师,填写"android"(ios暂时没有开放) + + 2)未接入米大师,使用其他支付,如果只支持android,则填写"android"; + + 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios"; + + 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios + + + +* #### 如果项目使用Typescript语言开发,请引入解压文件夹下的sdk.d.ts文件到项目中。 + + 示例:项目采用的是Laya Typescript版本进行开发,将该文件复制到libs目录下面 + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_007.png "🔍点击查看大图") + +* #### 到此,SDK的准备工作已经配置完毕,运行起来: + + 运行中碰到问题,[[请查看FAQ](faq.md)],或者微信群联系相关人员。 + + 正常运行,阅读SDK手册,开始[[SDK模块功能](modules.md)]接入。 \ No newline at end of file diff --git a/inner/inner/intro.md b/inner/inner/intro.md new file mode 100644 index 0000000..89665db --- /dev/null +++ b/inner/inner/intro.md @@ -0,0 +1,64 @@ +# 噗嗤SDK +PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。 +PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。 + +**PCSDK提供的模块功能:** + +- [统计模块](stat.md) +- [分享视频模块](share.md) +- [配置参数模块️](online.md) +- [多平台接口模块](platform.md) +- [数据模块](data.md) +- [事件模块](event.md) + + + +# 噗嗤管理后台 +噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。 + +方便开发者联调测试阶段不影响上线游戏运营相关数据或者配置信息,config.js的Env配置提供测试和正式环境切换。 + +> 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login) + +> 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login) + +噗嗤管理后台地址: + +- 测试服后台,地址:http://pre-data.d3games.com/#/login + +- 正式服后台,地址:https://data.d3games.com/#/login + +**友情提示:** + +- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。** +- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。** +- **登录后台即可使用后台提供的各项服务** + + + +**后台概览:** +## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图") + + + +**后台提供数据分析功能(不能跳转请联系管理员添加权限):** + +- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart) +- [分享数据分析](https://data.d3games.com/index.html#/share_exact) +- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list) +- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list) + + + +**后台提供配置相关功能(不能跳转请联系管理员添加权限):** + +- [分享/视频配置](http://pre-data.d3games.com/index.html#/share_list) +- [配置参数](http://pre-data.d3games.com/index.html#/config_list) + + +# 更多: +- 快速接入,请详读 [安装步骤](install.md) + + + +- 遇到问题可以查看 [FAQ](faq.md) \ No newline at end of file diff --git a/inner/inner/stat_ads.md b/inner/inner/stat_ads.md new file mode 100644 index 0000000..e07e60d --- /dev/null +++ b/inner/inner/stat_ads.md @@ -0,0 +1,543 @@ +# 交叉推广位 + +------ + +#### **简介** + +交叉推广位是在游戏中展示其他游戏,用户点击某个游戏跳转进入游戏,达到共享用户的目的。 + +噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析阅览。 + +**3种广告类型:交叉悬浮广告框、交叉抽屉式广告位、交叉猜你喜欢广告位** + +1. 交叉悬浮广告框,放置到首页、结算页 + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_013.png "🔍点击查看大图") + +2. 交叉抽屉式广告位,放置到首页、结算页 + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_014.png "🔍点击查看大图") + +3. 交叉猜你喜欢广告位,推荐放置到结算页 + + ![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" + ] + ``` + + + +- 完成下面的操作步骤,即可拉取交叉推广位: + + 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.bannerList | 根据类型获取对应类型交叉广告列表,目前SDK支持3种类型:40(交叉悬浮广告框)、70(交叉抽屉式广告位)、50(交叉猜你喜欢广告位) | +| PCSDK.stat.bannerNavigateTo | 交叉推广位点击跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram) | +| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK在onHide时候上报数据到后台 | + + + + + + + +1. ##### **bannerList** + + ```javascript + PCSDK.stat.loadingFinish(banner_type): Promise + ``` + + 定义:根据类型获取对应类型交叉广告列表,目前SDK支持3种类型 + + 参数: + + ``` + 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" + } + } + ] + } + + ``` + + > **返回的数据banner_list列表解析为 Array< BannerData >,BannerData是banner_list每一项数据实体,下面的bannerNavigateTo与addExposure接口api参数banner_data属于此BannerData结构**。 + + 示例: + + ```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. ##### **bannerNavigateTo** + + ```javascript + PCSDK.stat.bannerNavigateTo( location:number, banner_data: any, opts?: { extraData?: string; envVersion?: string }): Promise + ``` + + 定义:交叉推广位点击游戏跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram), 第三个参数配置可参考[wx.navigateToMiniProgram extraData、envVersion配置信息](https://developers.weixin.qq.com/minigame/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html) + + 参数: + + ```javascript + 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用户信息 + /** + * 演示交叉推广位使用示例 + */ + 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. ##### **addExposure** + + ```javascript + PCSDK.stat.addExposure( location: number, banner_data: Array< any > | any ): void + ``` + + 定义:对一个或者多个展示的推广位添加曝光,SDK在onHide时候上报曝光数据到后台,后台进行统计查阅 + + 参数: + + ```javascript + location: number 必传,统一传递为:100 + + banner_data:any 必传,添加展推广位曝光数据,可添加一个或者多个曝光数据,banner_data参数数据结构为上面bannerList api返回的列表数据的项BannerData实体结构:Array | BannerData + + ``` + + > 提示: + > + > 展示猜你喜欢/抽屉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。 + > + > 展示交叉悬浮框推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api + + 示例:根据交叉悬浮框类型调用PCSDK.stat.bannnerList接口获取交叉悬浮框推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。 + ```javascript + /** + * 演示交叉推广位使用示例 + */ +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/inner/install.md b/inner/install.md index 37cb60f..915d4e6 100644 --- a/inner/install.md +++ b/inner/install.md @@ -5,13 +5,13 @@ ## SDK下载 1. 下载最新版本的SDK [SDK下载](download.md) 。 -2. 解压下载的sdk-out-v{版本号}.zip包,解压文件夹里面的的目录结构: +2. 解压下载的sdk-in-v{版本号}.zip包,解压文件夹里面的的目录结构: ``` ├── sdk.d.ts ├── sdk/ | ├── config.js -| └── index.js +| └── entry.js | └── libs/ | └── game.min.js ``` @@ -20,7 +20,7 @@ - **sdk.d.ts:sdk的ts声明文件,开发者项目采用Typescript开发,请复制该文件到项目中。** - sdk/config.js:sdk配置文件,【[详细请阅读下方config.js参数说明](install.md#config)】 -- sdk/index.js:sdk入口文件,引入了sdk所提供的模块功能 +- sdk/entry.js:sdk入口文件,引入了sdk所提供的模块功能 - sdk/libs/game.min.js:sdk类库核心代码文件 @@ -28,10 +28,6 @@ ## 配置合法域名 * ##### 管理员或开发者身份在微信小程序后台→设置→开发者设置中添加 request、download合法域名 - 测试环境 request 合法域名: - - https://pre-dataapi.d3games.com (统计平台测试服域名) - 正式环境 request 合法域名: https://dataapi.d3games.com (统计平台正式服域名) @@ -39,7 +35,7 @@ cdn资源请求合法域名: https://dep.miso-lab.com (>>>request、download均要添加<<<) - + @@ -64,13 +60,11 @@ - * #### 根据运营提供的信息修改sdk文件夹下的**config**.js文件(可横向拖动查看查看更多====>)
- +
```javascript export default { IsDebug: false, // 是否debug模式,debug模式会打印log,可使用stat模块setDebug api进行修改 - Env: 100, // 100表示正式环境,110表示测试环境,推荐测试联调阶段使用110,提审前切记改成100!!! AdCacheDuration: 30, // 广告列表缓存持续时间间隔 IsUseShareModule: true, // 是否使用分享模块 IsOnlineAutoUse: true, // 是否开启sdk自动请求online模块(在线参数配置)的updateOnlineConfig,拉取在线参数配置 @@ -84,33 +78,22 @@ }, GameId: 0, // 必填,游戏ID,运营提供; ChannelId: 0, // 必填,游戏渠道ID,运营提供; + IntegralChannelId: 0, // 必填,积分投放渠道ID,运营提供; Secret: '***请配置你的Secret***', // 必填,游戏的secret key MidasPay: { // 米大师虚拟支付配置 OfferId: "0", // 在米大师申请的应用id ZoneId: "1", // 分区ID,默认:1 Mode: "game", // 支付的类型,不同的支付类型有各自额外要传的附加参数,默认:game CurrencyType: "CNY", // 币种,默认:CNY - Platform: '' // 申请接入时的平台,platform与应用id有关。默认:android(ios暂时没有开放,这里需要配置Platform,开放后,删掉此配置,sdk已经判断平台) + Platform: '' // 申请接入时的平台,platform与OfferId(米大师申请的应用id)有关,详情请阅读文档config.js参数MidasPay下的Platform配置 } -}; - ``` + }; +``` - - 参数详解: - -
-1. **Env ( number ):**SDK执行环境,建议开发者测试联调阶段设为110。 - > 提审阶段一定要设为100 - - > 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login) +参数详解: - > 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login) - - 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信息 @@ -196,11 +179,13 @@ 10. **ChannelId:必填,游戏渠道id,请联系运营人员提供** -11. **Secret:必填,游戏 Secret Key,请联系运营人员提供** +11. **IntegralChannelId:必填,积分投放渠道ID,运营提供** + +12. **Secret:必填,游戏 Secret Key,请联系运营人员提供** -12. **MidasPay( object ):**米大水虚拟支付配置,没有接入微信的米大师支付,请注意下面规则 +13. **MidasPay( object ):**米大师虚拟支付配置,请注意下面规则 - OfferId:在米大师申请的应用id,没有接入米大师,默认为"0" + OfferId:在米大师申请的应用id,没有接入米大师(比如第三方支付),默认为"0" ZoneId:分区ID,默认:"1" @@ -208,7 +193,7 @@ CurrencyType:币种,默认:"CNY" - Platform:申请接入时的平台,platform与应用id有关。 + Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。 1)接入了米大师,填写"android"(ios暂时没有开放) diff --git a/inner/intro.md b/inner/intro.md index 89665db..84e8e28 100644 --- a/inner/intro.md +++ b/inner/intro.md @@ -14,19 +14,11 @@ PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台, # 噗嗤管理后台 -噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。 - -方便开发者联调测试阶段不影响上线游戏运营相关数据或者配置信息,config.js的Env配置提供测试和正式环境切换。 - -> 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login) - -> 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login) +噗嗤管理后台对sdk中上报的各项数据进行分析,管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。 噗嗤管理后台地址: -- 测试服后台,地址:http://pre-data.d3games.com/#/login - -- 正式服后台,地址:https://data.d3games.com/#/login +- https://data.d3games.com/#/login **友情提示:** @@ -52,8 +44,8 @@ PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台, **后台提供配置相关功能(不能跳转请联系管理员添加权限):** -- [分享/视频配置](http://pre-data.d3games.com/index.html#/share_list) -- [配置参数](http://pre-data.d3games.com/index.html#/config_list) +- [分享/视频配置](https://data.d3games.com/index.html#/share_list) +- [配置参数](https://data.d3games.com/index.html#/config_list) # 更多: diff --git a/inner/modules.md b/inner/modules.md new file mode 100644 index 0000000..f4a8dbd --- /dev/null +++ b/inner/modules.md @@ -0,0 +1,87 @@ +# 模块概览 +下图是PCSDK的概要思维导图,SDK所提供的所有功能都在下图列出(点击查看大图): + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_000.png "🔍点击查看大图") + + +[统计模块:stat](stat.md) + + 启动注册打点 + + setLoginInfo:设置登录信息 + + loadingFinish:资源加载完成 + + active:添加注册活跃用户 + + 关卡分析打点 + + logLevelRelive:游戏关卡复活上报 + + logLevelHide:游戏关卡页onHide上报 + + logLevelFail:游戏关卡失败上报 + + logLevelWin:游戏关卡成功上报 + + logMerge:游戏2合1合成最高等级上报 + + 交叉推广位:悬浮框、抽屉式、猜你喜欢 + + bannerList:获取对应类型交叉推广位列表 + + bannerNavigateTo:点击跳转到对应appid的游戏 + + addExposure:交叉推广位一条或者多条广告展示,添加曝光数据 + + 自定义事件 + + event:自定义打点事件 + +[数据模块:data](data.md) + + GameId:获取游戏的GameId,来源于config.js配置的GameId + + ChannelId:获取游戏渠道ID,来源于config.js配置的ChannelId + + UserId:获取用户ID,来源于setLoginInfo传递的openId的值 + + RegTime:获取用户注册时间,来源于setLoginInfo传递的regTime的值 + + ShareId:获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0。需接shareVideo模块 + + ShareKey:接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key + + Platform:获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) + + SystemId:获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备) + + QueryUserInviteUid:获取此次分享会话进入游戏,分享来源者用户ID,来源query的参数invite_user_uid + + IsCross:获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏 + + IsDrawer:获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏 + + IsGuessLike:获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏 + +[配置参数模块:online](online.md) + + updateOnlineConfig:拉取后台配置的配置参数数据,可代码中手动调用,也可SDK自动拉取 + + getParamsInt:根据在线参数key获取number类型参数值 + + getParamsObj:根据在线参数key获取object类型参数值 + + getParamsString:根据在线参数key获取string类型参数值 + +事件模块:event + +多平台接口模块:platform + +[分享视频模块:shareVideo](share.md) + + share:普通分享,不需要处理回调的场景 + + dispatch:分享视频分发入口,传入功能点英文命名的分享/视频key + + getShareVideoType:根据功能点在后台配置的分享/视频key,得到此功能点分享开关 diff --git a/inner/online.md b/inner/online.md new file mode 100644 index 0000000..c1ee058 --- /dev/null +++ b/inner/online.md @@ -0,0 +1,165 @@ + +# 配置参数模块 + +------ + +#### **简介** + +在线配置参数是噗嗤游戏开放的一个新模块功能,可以让开发者在后台【配置参数】栏中动态修改游戏使用的参数值。例如:动态修改游戏的数值,小到一个简单开关0/1切换、一个简单的数字配置;大到一个游戏json配置等。 + +该模块借鉴了[友盟在线配置参数](http://www.it610.com/article/4896789.htm)的设计思路。 + + + +#### **后台使用** + +设置在线配置参数,登录后台->头部tab切换到【游戏数据】->【配置相关】->【配置参数】可新增、编辑修改参数值,配置完毕后,通过online模块相关的api使用: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_021.png "🔍点击查看大图") + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------------- | ------------------------------------------------------------ | +| PCSDK.online.updateOnlineConfig | 拉取后台配置的配置参数数据,可代码中手动调用,也可以通过config.js中配置SDK主动拉取,注意:使用前请详细[阅读config.js的IsOnlineAutoUse和IsOnlineDebug参数详解](install.md#config_env) | +| PCSDK.online.getParamsInt | 根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数 | +| PCSDK.online.getParamsObj | 根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象 | +| PCSDK.online.getParamsString | 根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串 | + + + +1. ##### **updateOnlineConfig** + + ```javascript + PCSDK.online.updateOnlineConfig(): Promise + ``` + + 定义:拉取后台配置的配置参数数据, + + 提示: + + > [config.js中配置IsOnlineAutoUse](install.md#config_env)为true:SDK启动时会自动去拉取在线配置参数,开发者不需要调用此接口,不然会导致重复拉取 + > + > [config.js中配置IsOnlineAutoUse](install.md#config_env)为false:有两种理解方式:1)不接入使用在线配置参数模块;2)接入使用在线配置参数模块,开发者自己手动调用updateOnlineConfig api处理逻辑。 + > + > 下面示例会演示两种不同配置的使用范例: + + 参数: + + ``` + 无 + ``` + + 返回值: + + ``` + Promise + ``` + +
+ + 示例1:config.js配置IsOnlineAutoUse为false,开发者调用updateOnlineConfig api手动拉取在线配置参数数据 + + ```javascript + // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关 + PCSDK.online.updateOnlineConfig().then(() => { + // 使用1:获取是否后台动态配置开启插屏广告,1为开启,0为关闭 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; + // isInterstitialAd && '显示插屏广告'; + + // 使用2:获取动态多个广告位开启的配置 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); + // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位'; + // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位'; + // pcGameOpenMap.Cross === 1 && '显示交叉推广位'; + + // 使用3:获取签到配置 + let signRewardCfg = PCSDK.online.getParamsObj('sign_reward_cfg', [100, 300, 500, 700, 900, 2000, 3000]); + + // 使用4:获取动态bannerUid + let bannerUid = PCSDK.online.getParamsString('banner_common_uid', 'adunit-fe38438f074c717f'); + // bannerUid && '显示banner'; + }); + ``` + + 示例2:config.js配置IsOnlineAutoUse为true,SDK启动时会自动调用 updateOnlineConfig api拉取在线配置参数数据 + + ```javascript + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); + ``` + + + +2. ##### **getParamsInt** + + ```javascript + PCSDK.online.getParamsInt( key: string, defaultVal?: number ): number + ``` + + 定义:根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数 + + 参数: + + ```javascript + key: string 必传 后台 ->【配置参数】配置的key + defaultVal: number 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值 + ``` + + 返回值: + + ``` + number + ``` + + 示例:[查看上面的示例代码](online.md#sample) + +3. **getParamsObj** + + ```javascript + PCSDK.online.getParamsObj( key: string, defaultVal?: any ): any + ``` + + 定义:根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象 + + 参数: + + ```javascript + key: string 必传 后台 ->【配置参数】配置的key + defaultVal: any 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值 + ``` + + 返回值: + + ``` + object | array | null + ``` + + 示例:[查看上面的示例代码](online.md#sample) + +1. **getParamsString** + + ```javascript + PCSDK.online.getParamsString( key: string, defaultVal?: string ): string + ``` + + 定义:根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串 + + 参数: + + ```javascript + key: string 必传 后台 ->【配置参数】配置的key + defaultVal: string 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值 + ``` + + 返回值: + + ``` + string + ``` + + 示例:[查看上面的示例代码](online.md#sample) + + \ No newline at end of file diff --git a/inner/platform.md b/inner/platform.md new file mode 100644 index 0000000..65ab0ba --- /dev/null +++ b/inner/platform.md @@ -0,0 +1,577 @@ +# 多平台接口模块:PCSDK.platform + +------ + +#### **简介** + +所谓多平台指的是微信小游戏、QQ轻游戏、今日头条、oppo等游戏发布的平台。微信和QQ接口文档api相似度99%,微信、QQ、今日头条平台的接口api相似度80%以上,虽然相似度很高,但是仍需要针对差异性做一些处理。多平台接口模块就是想要在SDK内部去抹平了各个平台差异性的处理,达到同一个api调用,应用多个平台的作用。 + +#### **此模块是参照微信小游戏提供的api进行封装的公用方法,提供了以下游戏中常用到的功能:** + +2. **打开客服消息:openCustomerServiceConversation** 整理来自[wx.openCustomerServiceConversation](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html) + +3. **检测版本更新:checkUpdate** 整理来自:[wx.getUpdateManager](https://developers.weixin.qq.com/minigame/dev/api/base/update/UpdateManager.html) +4. **显示模态弹出框:showModal** 整理来自:[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html) +5. **复制文本:copy** 整理来自:[wx.setClipboardData](https://developers.weixin.qq.com/minigame/dev/api/device/clipboard/wx.setClipboardData.html) +6. **长震动:vibrateLong** 整理来自:[wx.vibrateLong](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateLong.html) +7. **短震动:vibrateShort** 整理来自:[wx.vibrateShort](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateShort.html) +9. **微信小游戏推荐弹窗组件GamePortal:isGamePortalPlaying 与 gamePortalShow** 整理来自:[wx.createGamePortal](https://developers.weixin.qq.com/minigame/dev/api/game-portal/GameBanner.html) +10. **微信小游戏插屏广告组件InterstitialAd:isInterstitialPlaying 与 interstitialShow** 整理来自:[wx.createInterstitialAd](https://developers.weixin.qq.com/minigame/dev/api/ad/InterstitialAd.html) +11. **微信小游戏推荐icon组件GameIcon:gameIconShow 与 gameIconDestroy** 整理来自:[wx.createGameIcon](https://developers.weixin.qq.com/minigame/dev/api/game-portal/wx.createGameIcon.html) + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------ | ------------------------------------------------------------ | +| PCSDK.platform.openCustomerServiceConversation | 进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力、钻石和进入跳转充值等,[具体用法请看](platform.md#service)| +| PCSDK.platform.checkUpdate | 检测版本是否有更新,如果版本更新会弹出确认框 | +| PCSDK.platform.copy | 设置系统剪贴板的内容。微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s | +| PCSDK.platform.vibrateShort | 使手机发生较短时间的振动(15 ms) | +| PCSDK.platform.vibrateLong | 使手机发生较长时间的振动(400 ms) | +| PCSDK.platform.gamePortalShow | 传入adUnitId创建并展示小游戏推荐弹窗组件 | +| PCSDK.platform.isGamePortalPlaying | 是否正在加载小游戏推荐弹窗组件 | +| PCSDK.platform.interstitialShow | 传入adUnitId创建并展示小游戏插屏广告组件 | +| PCSDK.platform.isInterstitialPlaying | 是否正在加载小游戏插屏广告组件 | +| PCSDK.platform.gameIconShow | 创建并显示小游戏推荐icon组件 | +| PCSDK.platform.gameIconDestroy | 销毁正在展示的小游戏推荐icon组件 | + + + + + +
+ +2. **openCustomerServiceConversation** + + ```javascript + PCSDK.platform.openCustomerServiceConversation( params?: _CustomerServiceConversationObject ): void + ``` + + 定义:进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力和进入跳转充值 + + 参数: + + ```javascript + params _CustomerServiceConversationObject 选传,不传递打开一个普通的客户会话。[参数说明参照](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html) + { + sessionFrom string 选传 会话来源 + showMessageCard boolean 选传 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息 + sendMessageTitle string 选传 会话内消息卡片标题 + sendMessagePath string 选传 会话内消息卡片路径 + sendMessageImg string 选传 会话内消息卡片图片路径 + success function 选传 接口调用成功的回调函数 + fail function 选传 接口调用失败的回调函数 + complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行) + } + ``` + 返回值: + + ``` + void + 无 + ``` + + 示例1:进入普通的客服会话 + + ```javascript + PCSDK.platform.openCustomerServiceConversation(); + ``` + 示例2:应用场景如进入客服会话跳转领取体力、钻石等等: 示例为跳转客服领取18888钻石奖励,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断)。 + + ```javascript + // 跳转客服领取18888钻石奖励,开发者可根据示例修改 + PCSDK.platform.openCustomerServiceConversation({ + showMessageCard: true, + sendMessageTitle: '钻石已发送,点击领取钻石!', + sendMessagePath: '', + sendMessageImg: 'http://dep.miso-lab.com/mergeguns/bin/res/image/service_reward.png', // 图片icon对应的域名记得加入到request和download白名单中 + success: () => { + // 打开跳转客服成功,记录成功状态,在游戏全局注册的onShow监听通过判断这个状态去请求接口领取奖励 + // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改 + AppDataManager.I.set('service.reward.data', { + status: 1, // 可以领奖 + reward: 18888 // 获得18888钻石 + }); + }, + fail: (err) => { + console.log("openCustomerServiceConversation fail: ", err); + } + }); + // 在游戏中全局注册的onShow事件监听中检测是 + // 游戏入口:Main.cs + class Main { + constructor() { + this.init(); + } + + private init() { + PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this)); + PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this)); + } + + private onShow(opts) { + // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断 + let serviceRewardData = AppDataManager.I.get('service.reward.data'); + if (serviceRewardData && serviceRewardData.status === 1) { + AppDataManager.I.set('service.reward.data', null); + // 奖励发放,处理发放后的逻辑,比如每天只能领取一次的记录,防止重复刷奖励 + } + } + + private onHide(){ + // 监听平台的onHide事件 + } + } + ``` + 示例3:应用场景例如进入客服会话,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断),点击右下角的充值按钮后,跳转充值,充值完成后在onShow中处理:需要后台提供api接口,验证充值合理性并发放奖励,**此接口需要后端支持**。 + + ```javascript + // 跳转客服充值,开发者可根据示例修改,sendMessagePath请严格按照示例中提供的参数 + /** + * 充值跳转客服 + * @param itemId 购买道具商品id + * @param money 购买商品花费,单位元 + */ + private openServiceWithItem(itemId: number, money: number) { + PCSDK.platform.openCustomerServiceConversation({ + showMessageCard: true, + sendMessageTitle: `充值${money}元`, + sendMessagePath: `channel=${PCSDK.data.ChannelId}&item=${itemId}&uid=${PCSDK.data.UserId}&pf=${PCSDK.data.SystemId}`, + sendMessageImg: 'http://dep.miso-lab.com/idiom/bin/share/pay.png', // 图片icon对应的域名记得加入到request和download白名单中 + success: () => { + // 打开跳转客服成功,记录成功状态,onShow通过判断这个状态去请求接口领取奖励 + // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改 + AppDataManager.I.set('service.pay.data', { + status: 1, // 可以领奖 + itemId: itemId, // 购买道具商品id + money: money // 购买商品花费,单位元 + }); + }, + fail: (err) => { + console.log("openCustomerServiceConversation fail: ", err); + } + }); + } + + // 在游戏中全局注册的onShow事件监听中检测是 + // 游戏入口:Main.cs + class Main { + constructor() { + this.init(); + } + + private init() { + PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this)); + PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this)); + } + + private onShow(opts) { + // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断 + let serviceRewardData = AppDataManager.I.get('service.pay.data'); + if (serviceRewardData && serviceRewardData.status === 1) { + AppDataManager.I.set('service.pay.data', null); + // 领取奖励的逻辑,比如每天只能领取一次的记录,防止重复刷奖励 + // 请求后端接口验证奖励合理性 + } + } + + private onHide(){ + // 监听平台的onHide事件 + } + } + ``` +
+3. **checkUpdate** + + ```javascript + PCSDK.platform.checkUpdate( params?: _ShowModalObject ): void + ``` + 定义:检测版本是否有更新,如果版本有更新会弹出确认框,参数可不传递,不传递有版本更新会弹出下图的默认确认框;开发者可自定义弹出框的显示样式,参数与[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html)一模一样。 + 建议此api在游戏的入口调用。 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_029.png "🔍点击查看大图") + + 参数: + + ```javascript + params _ShowModalObject 选传 不传递有版本更新会弹出上图样式默认确认框;开发者可自定义弹出框的显示样式,参数参照wx.showModal的参数 + { + title string 选传 提示的标题,默认为:更新提示 + content string 选传 提示的内容,默认为:新版本已经准备好,是否重启应用? + showCancel boolean 选传 是否显示取消按钮,默认为:false不显示 + cancelText string 选传 取消按钮的文字,最多4个字符 + cancelColor string 选传 取消按钮的文字颜色,必须是16进制格式的颜色字符串 + confirmText string 选传 确认按钮的文字,最多4个字符 + confirmColor string 选传 确认按钮的文字颜色,必须是16进制格式的颜色字符串 + success function 选传 接口调用成功的回调函数 + fail function 选传 接口调用失败的回调函数 + complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行) + } + ``` + 返回值: + + ``` + void + 无 + ``` + + 示例:在游戏入口类中检测是否有版本更新 + + 1)、依照下面的示例接入checkUpdate api + + ```javascript + class Main { + constructor() { + this.init(); + } + + private init() { + this.checkUpdate(); + } + + private checkUpdate() { + // 调用SDK的checkUpdate,微信版本有更新,会自动弹出更新确认框 + PCSDK.platform.checkUpdate(); + + // 自定义更新弹出框 + /* + PCSDK.platform.checkUpdate({ + showCancel: true, + content: '客官,xxx游戏有更新了!', + cancelText: '放弃' + }); + */ + } + } + + ``` + 2)、接入代码完毕后,按照下图的操作本地开发工具调试是否接入成功。 + + I、选择:添加编译模式。 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_030.png "🔍点击查看大图") + II、选择:自定义模式名称、勾选下次编译时模拟更新、选择模拟成功还是失败状态,点击确定。 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_031.png "🔍点击查看大图") + III、开发工具会自动重新启动游戏,弹出更新框,看到弹出框接入成功。 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_032.png "🔍点击查看大图") +
+4. **copy** + + ```javascript + PCSDK.platform.copy( str: string ): Promise + ``` + 定义:设置系统剪贴板的内容。提示:微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s + + 参数: + + ```javascript + str string 必传 剪贴板的内容 + + ``` + 返回值: + + ``` + Promise + Promise resolve复制系统剪贴板内容成功回调,reject失败回调 + ``` + + 示例: + + ```javascript + PCSDK.platform.copy('这是我想要复制的内容') + .then( ret => { + // 打印复制的内容 + console.log(ret.data); + }) + .catch(err => { + console.warn('复制失败', err); + }); + ``` +
+4. **vibrateShort** +```javascript + PCSDK.platform.vibrateShort(): Promise +``` +定义:使手机发生较短时间的振动(15 ms)。仅在 iPhone 7 / 7 Plus 以上及 Android 机型生效 +参数: + + ```javascript + 无 + ``` +示例: + + ```javascript + PCSDK.platform.vibrateShort(); + + ``` +5. **vibrateLong** + + ```javascript + PCSDK.platform.vibrateLong(): Promise + ``` + 定义:使手机发生较长时间的振动(400 ms) + 参数: + ```javascript + 无 + ``` + 示例: + ```javascript + PCSDK.platform.vibrateLong(); + ``` +
+6. **gamePortalShow** + ```javascript + PCSDK.platform.gamePortalShow(adUnitId: string): Promise + ``` + 定义:传入adUnitId创建并展示小游戏推荐弹窗组件,Promise resolve创建展示成功回调,reject创建失败回调。 + + 参数: + ```javascript + adUnitId string 必传 小游戏推荐弹窗组件推荐单元id + ``` + 返回值: + ```javascript + Promise + Promise resolve创建展示成功回调,reject创建失败回调 + ``` + 示例: + ```javascript + // 例子1:显示弹窗组件 + let adUnitId: string = 'PBgAAgPWNXGtCwcA'; + PCSDK.platform.gamePortalShow(adUnitId); + + // 例子2:显示推荐弹窗组件,如果显示不成功,则显示小游戏插屏广告,插屏广告api使用请继续往下看。 + let adUnitId: string = 'PBgAAgPWNXGtCwcA'; + PCSDK.platform.gamePortalShow(adUnitId).catch(err => { + // 推荐弹窗组件显示不成功显示插屏广告 + adUnitId = 'adunit-4da0ec77513f8eea'; + PCSDK.platform.interstitialShow(adUnitId); + }); + + ``` +7. **isGamePortalPlaying** + + ```javascript + PCSDK.platform.isGamePortalPlaying(): boolean + ``` + + 定义:是否正在加载小游戏推荐弹窗组件;在PCSDK.platform.gamePortalShow api内部,如果正在创建弹窗组件会在Promise reject返回错误提示信息。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + boolean + ``` + + 示例: + + ```javascript + let isPlaying = PCSDK.platform.isGamePortalPlaying(); + + ``` +
+8. **interstitialShow** + + ```javascript + PCSDK.platform.interstitialShow(adUnitId: string): Promise + ``` + + 定义:传入adUnitId创建并展示小游戏插屏广告组件,Promise resolve创建展示成功回调,reject创建失败回调 + + 参数: + + ```javascript + adUnitId string 必传 小游戏插屏广告组件广告单元id + ``` + 返回值: + + ```javascript + Promise + Promise resolve创建展示成功回调,reject创建失败回调 + ``` + + 示例: + + ```javascript + // 例子1:显示插屏广告组件 + let adUnitId: string = 'adunit-4da0ec77513f8eea'; + PCSDK.platform.interstitialShow(adUnitId); + + // 例子2:显示插屏广告组件,如果显示不成功,则显示小游戏推荐弹窗组件。 + let adUnitId: string = 'adunit-4da0ec77513f8eea'; + PCSDK.platform.interstitialShow(adUnitId).catch( err => { + // 加载不成功显示小游戏推荐弹窗组件 + adUnitId = 'PBgAAgPWNXGtCwcA'; + PCSDK.platform.gamePortalShow(adUnitId); + }); + ``` +9. **isInterstitialPlaying** + + ```javascript + PCSDK.platform.isInterstitialPlaying(): boolean + ``` + + 定义:是否正在加载小游戏插屏广告组件;在PCSDK.platform.interstitialShow如果正在创建插屏广告会在Promise reject返回错误提示信息。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + boolean + ``` + + 示例: + + ```javascript + let isPlaying = PCSDK.platform.isInterstitialPlaying(); + + ``` +
+10. **gameIconShow** + ```javascript + PCSDK.platform.gameIconShow(adUnitId: string, opts: { count: number, style: Array<_GameIconStyleItem> }): Promise + ``` + + 定义:创建并显示小游戏推荐icon组件。 + + 参数: + + ```javascript + adUnitId string 必传 小游戏推荐icon组件广告单元id + opts object 必传 扩展参数,目前支持count和style两个属性值 + { + count number 必传 游戏icon的数量,请注意,正式版下面渲染出来的icon数量会小于等于count,请注册做好样式兼容 + style Array<_GameIconStyleItem> 必传 数组的每一项可以针对对应的icon设置位置和样式等信息,style的每一项称为_GameIconStyleItem + } + + Object _GameIconStyleItem:单个游戏icon的位置和样式信息 + { + appNameHidden boolean 必传 游戏名称是否隐藏 + color string 必传 游戏名称的颜色色值 + size number 必传 游戏icon的宽高值 + borderWidth number 必传 游戏icon的border尺寸 + borderColor string 必传 游戏icon的border颜色色值 + left number 必传 游戏icon的X轴坐标 + top number 必传 游戏icon的Y轴坐标 + } + ``` + 返回值: + + ```javascript + Promise + Promise resolve创建展示成功回调,reject创建失败回调 + ``` + + 示例: + + ```javascript + // 显示1个推荐icon组件 + private showGameIcon(){ + let adUnitId: string = 'PBgAAgPWNXGkQ4p0'; + let {windowWidth} = PCSDK.platform.getSystemData(); + PCSDK.platform.gameIconShow(adUnitId, { + count: 1, + style: [ + { + appNameHidden: false, + color: "#FF0000", + size: 50, + borderWidth: 0, + borderColor: "#FF0000", + left: (windowWidth / 750) * 550, + top: (windowWidth / 750) * 150 + } + ] + }) + .then(() => { + // console.warn('显示GameIcon成功'); + }) + .catch((err) => { + // console.warn('显示GameIcon失败'); + }); + } + + ``` +11. **gameIconDestroy** + + ```javascript + PCSDK.platform.gameIconDestroy(): void + ``` + + 定义:销毁正在展示的小游戏推荐icon组件。展示推荐icon组件广告后,请记得在页面关闭时候调用此api销毁GameIcon。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + void + ``` + + 示例: + + ```javascript + + private open(){ + super.open(); + this.showGameIcon(); + } + + private close(){ + super.close(); + this.destoryGameIcon(); + } + + // 显示2个推荐icon组件 + private showGameIcon(){ + let adUnitId: string = 'PBgAAgPWNXGkQ4p0'; + let {windowWidth} = PCSDK.platform.getSystemData(); + PCSDK.platform.gameIconShow(adUnitId, { + count: 2, + style: [ + { + appNameHidden: false, + color: "#FF0000", + size: 50, + borderWidth: 0, + borderColor: "#FF0000", + left: (windowWidth / 750) * 450, + top: (windowWidth / 750) * 150 + }, + { + appNameHidden: false, + color: "#FF0000", + size: 50, + borderWidth: 0, + borderColor: "#FF0000", + left: (windowWidth / 750) * 550, + top: (windowWidth / 750) * 150 + } + ] + }) + .then(() => { + // console.warn('显示GameIcon成功'); + }) + .catch((err) => { + // console.warn('显示GameIcon失败'); + }); + } + + // 销毁展示创建的GameIcon组件 + private destoryGameIcon(){ + PCSDK.platform.gameIconDestroy(); + } + + ``` \ No newline at end of file diff --git a/inner/share.md b/inner/share.md new file mode 100644 index 0000000..2f52757 --- /dev/null +++ b/inner/share.md @@ -0,0 +1,539 @@ + +# 分享视频模块 + +------ + +#### **简介** +小游戏生态中,普遍把平台提供的分享/视频接口更多用于某个奖励领取、获取n倍奖励、游戏死亡复活、转盘额外次数获得等等一种有效途径(分享:拉取新用户,视频:赚钱广告费);噗嗤游戏在分享or视频推送不断的探索迭代中,总结了一套分享/视频积分策略,集成在SDK中开放给开发者,开发者只需对游戏中分享视频功能点命名一个英文名称key(分享视频key),这个key关联分享文案、分享图、分享开关(推送类型)、视频uid等等在后台配置好,使用SDK提供的一个dispatch api传入英文名称key即可完成接入工作。 + +- 分享/视频配置可以让开发者在后台中动态修改相关功能点的分享/视频配置内容。 + +- 新增某个功能的分享点配置、在线修改相关功能点的分享图或文案、在线切换某个功能点按钮的分享/视频推送类型。 + +- 调用SDK的dispatch api,dispatch会根据后台配置的分享开关(推送类型)自动进行分发:推送分享还是视频全权交由SDK去处理,开发者只需要传入成功/失败回调函数,成功回调函数处理发放领取奖励、n倍奖励、成功复活等操作,失败回调函数处理参数传递的msg信息。 + +#### **疑惑解答** +1. 为什么要引入这个模块? + + > 游戏中很多n倍奖励、复活、额外奖励等功能点通常需要分享或者视频才能额外获得,游戏上线后,运营很有可能会对某些功能点有额外的需求修改:a功能点获取由分享改成视频方式获取、b功能点由视频改成分享方式获取、c功能点需要在前面n次看视频获得后全是分享获得、为某某功能的分享图想换一个、拉取视频不成功自动切换分享等等;为了应对这些不同情形,我们把分享和视频点包装成一个模块,a功能点也不在局限于只是简单的分享、b功能只是视频,而是通过后台分享开关去灵活切换。所有功能点入口调用都是使用dispatch,每个功能点都是转化为一个分享视频key在后台管理。 + +2. 什么是分享视频key? + + > 分享视频key是一个功能点的英文名称,这个key配置在后台中,关联分享文案、分享图、分享开关(推送类型)、视频uid等等信息。某个功能点(不论是分享还是视频方式)调用dispatch传入这个key,SDK会读取这个key关联的信息,根据分享开关(推送类型)来推送分享(需要分享文案、分享图)还是推送视频(需要视频uid)。 + +3. 什么是分享视频分发? + + > 调用dispatch api传入分享视频key,SDK会查找这个key在后台配置的数据,SDK读取数据中分享开关(推送类型)的字段信息,通过这个开关类型来判断推给用户是分享还是视频,这个根据类型来推送的操作就是分发操作。 + +4. 游戏中之前是玩家分享n次后变成看视频或者是看视频n次后全是分享,dispatch能满足吗? + + > 上面的问题dispatch也同样支持,还是同样的调用方式,不需要做其他额外处理,dispatch是怎么做到的了:分享开关(推送类型)有一个分享积分选择项,这个选项就是通过积分策略实现了上面问题。 + > + + +#### **后台使用** + +配置分享视频配置,登录后台->头部tab切换到【游戏数据】->【配置相关】->【分享/视频配置】可新增、编辑修改分享/视频内容: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_023.png "🔍点击查看大图") + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_024.png "🔍点击查看大图") + +接入分享视频模块后,后台已经对分享和视频数据分别进行整理统计了,游戏接入方可实时查看分享/视频的各项数据: + +查看分享分析,登录后台->头部tab切换到【游戏数据】->【产品分析】->【分享分析】可阅览游戏分享数据的各项统计: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_025.png "🔍点击查看大图") + +查看视频广告详情,登录后台->头部tab切换到【游戏数据】->【配置相关】->【视频广告详情】可阅览游戏各个功能点视频数据统计: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_026.png "🔍点击查看大图") + + + +#### **接入必读** + +- 接入此模块前,请[**前往sdk/config.js文件中配置【IsUseShareModule: true 】开启分享视频模块功能**](install.md#config_env),此参数配置为true,才能正常使用此模块的功能,SDK启动时会自动拉取后台配置所有功能点的分享/视频配置列表。 + +- 微信小游戏开发者接入此模块,如果游戏有很多分享点,提审时避免触犯微信平台的[滥用分享行为](https://developers.weixin.qq.com/minigame/product/#_5-1-滥用分享行为),在后台【配置参数】中配置了一个SDK内部使用的[配置参数](online.md)share_unlock,进行分享开关切换:1(开启)0(关闭),提审时设置为0,审核通过后设为1。share_unlock设置为0,所有的功能点不会分享完成、拉起看完视频后发放奖励,而是直接发放奖励,这样就能避免审核时,如果是推送分享拉起分享,被微信认为是诱导分享,被拒的可能性。 + +- sdk/config.js的配置参数ShareRightKey,表示右上角分享的分享视频key,请配置到后台【分享/视频配置】中。如果ShareRightKey配置不为空,SDK会自动调用微信的右上角分享接口(wx.onShareAppMessage),实现右上角分享功能,注意的是开发者在游戏中已经有注册wx.onShareAppMessage需要删除掉,不然游戏中onShareAppMessage的注册事件会把SDK中的注册事件处理函数覆盖掉,导致还是使用的是开发者注册的右上角分享功能。 + +- sdk/config.js的配置参数ShareData表示默认分享视频配置,此条配置应用在两种情况下: + + > 1、请求功能点的分享/视频配置列表出错,使用key去查找对应的分享配置肯定是查找不到的,会读取此条默认数据。 + > + > + > + > 2、请求功能点的分享/视频配置列表成功了,但是这个key没有配置到后台,也会读取此条默认数据 + +#### **接入**API: + +| **名称** | **功能说明** | +| ------------------------------- | ------------------------------------------------------------ | +| PCSDK.shareVideo.share | 普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 | +| PCSDK.shareVideo.dispatch | 分享视频分发入口,传入功能点英文命名的分享/视频key | +| PCSDK.shareVideo.getShareVideoType | 根据功能点在后台配置的分享/视频key,得到此功能点分享开关(推送类型)SDK计算得到最终推送类型:-1(无视频无分享)、0(分享)、1(异步分享)、5(分享积分)、2(视频)、3(无视频则分享)、4(视频和分享)(控制分享和视频两个按钮的显示) | + + + +1. ##### **share** + + ```javascript + PCSDK.shareVideo.share(key:sring, params?: any, opts?: any): void + ``` + + 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 + + 参数: + + ```javascript + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key) + + params: object 选传 扩展参数:分享链接query携带自定义参数,{ key: value }对象形式,该对象传递的参数会与SDK内部query参数一起组成query(查询参数, key1=val1&key2=val2的格式)的值,SDK内部参数key有:channel_id、user_invite_uid、share_id、share_key。 + + 提示:params传递的对象中如果含有传递SDK内部query参数key,会被SDK内部参数值覆盖,所以开发者避免传递这些key。 + + opts: object 选传 可不传递 + + ``` + + 返回值: + + ```javascript + void + ``` + + 示例:游戏首页分享到群的功能,假如config.js配置的ChannelId: 20024;后台配置的分享视频key: home_share2group、此分享key的id:512;用户id:100000。 + + ```javascript + // 示例1: + // 分享后生成的query:share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000 + PCSDK.shareVideo.share( 'home_share2group' ); + + // 示例2:第二个参数是分享生成的query携带的参数 + // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000 + PCSDK.shareVideo.share( 'home_share2group', { + type:99 + }); + + // 示例3:第二个参数是分享生成的query携带的参数,传递SDK内部query参数:channel_id + // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000 + PCSDK.shareVideo.share( 'home_share2group', { + type:99, + channel_id:10000 + }); + ``` + +2. ##### **dispatch** + + ```javascript + PCSDK.shareVideo.dispatch( key: string, params?: { success: Function, fail: Function, context?: any} ): void + ``` + + 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 + + 参数: + + ```javascript + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key) + + params: object 选传 扩展参数:success分享视频成功回调处理函数,fail分享视频失败回调处理函数,contex函数执行上下文 + { + success: ( from:number, ret: any | null ) => void, + error: ( from:number, error: object | null ) => void, + context: any + } + + from:此次分发成功推送类型 + from返回枚举值为: + 0:无视频无分享(后台配置分享开关(推送类型)or 应对审核分享关闭:配置参数share_unlock设置为0) + 1:推送同步分享 + 2:推送异步分享 + 3:推送视频 + + error:此次分发失败的错误消息 + error返回枚举值为: + { code: 1000, msg: '要看完视频哦!' }, + { code: 1001, msg: '视频加载失败!' }, + { code: 999, msg: '视频UID不存在!' }, + { code: 1002, msg: '视频组件未开放!' }, + { code: 1003, msg: '正在观看视频中...' }, + { code: 1004, msg: '分享失败,请尝试发送至不同群!' }, + { code: 1005, msg: '别总骚扰这个群,换个群分享吧!' }, + { code: 1006, msg: '请分享到群哦!' }, + { code: 1007, msg: '分享到群才能领取更多~' }, + { code: 1008, msg: '分享失败,请尝试发送至不同群!' }, + { code: 1009, msg: '今日已达分享上限次数,请明日再来' } + ``` + + 返回值: + + ```javascript + void + ``` + + 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。 + + 演示 + + ```javascript + // DiamondDoublePopwin.ts文件 + export default class DiamondDoublePopwin extends BaseView{ + protected addEvent() { + super.addEvent(); + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用) + this.btnFree.on(Laya.Event.CLICK, this, this.onReward); + // 分享双倍 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward); + // 视频双倍 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward); + } + + protected removeEvent() { + super.removeEvent(); + this.btnFree.off(Laya.Event.CLICK, this, this.onReward); + this.btnShare.off(Laya.Event.CLICK, this, this.onReward); + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward); + } + + // 领取奖励操作 + private onReward(){ + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), { + success: this.handleReward, + fail: this.handleError, + context: this + } ); + } + + // 分享/视频成功后回调处理函数:发奖励 + private handleReward(from: ShareVideoFrom, ret: any | null){ + // 分享成功、视频成功、无视频无分享 + } + + // 分享/视频失败后回调处理函数:弹出提示 + private handleError(from: ShareVideoFrom, error: any | null){ + // 返回错误,处理错误msg信息,自定义处理 + if( error ){ + wx.showToast({ + title: error.msg + }); + } + } + } + + // Enums.ts文件 + // 分享视频key枚举,每个key表示一个功能点 + enum ShareVideoKeys { + // 钻石双倍获取 + DiamondDouble = 'diamond_double', + // 失败获得双倍奖励 + FailRewardDouble = 'fail_reward_double' + } + + // 分享视频功能点最终处理方式 + enum ShareVideoFrom{ + None = 0, // 无视频无分享 + Share = 1, // 分享 + ShareAsync = 2, // 异步分享 + Video = 3, // 看视频 + } + ``` + +3. ##### **getShareVideoType** + + ```javascript + PCSDK.shareVideo.getShareVideoType( key: string ): number + ``` + + 定义:根据分享视频key获取此次shareVideo模块推送的分享视频类型值:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分);此api用于通过得到的类型值处理页面的ui状态(微信和QQ平台对按钮的icon有强制限制):显示视频icon、显示分享icon、既没有分享icon,也没有视频icon。 + + 参数: + ```javascript + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key) + ``` + + 返回值: + + ```javascript + number + 返回值此次点击功能按钮触发的推送类型:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分) + 分享视频类型枚举值如下: + // 推送类型:分享视频类型枚举 + enum ShareVideoType { + None = -1, // -1无分享无视频 + Share = 0, // 0分享 + ShareAysnc = 1, // 1异步分享 + ShareIntegral = 5, // 5分享积分 + Video = 2, // 2看视频 + VideoToShare = 3, // 3无视频则分享 + VideoAndShare = 4 // 4视频和分享(控制分享和视频两个按钮的显示) , + } + ``` + + 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。 + + ```javascript + // DiamondDoublePopwin.ts文件 + export default class DiamondDoublePopwin extends BaseView{ + protected addEvent() { + super.addEvent(); + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用) + this.btnFree.on(Laya.Event.CLICK, this, this.onReward); + // 分享双倍 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward); + // 视频双倍 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward); + } + + protected removeEvent() { + super.removeEvent(); + this.btnFree.off(Laya.Event.CLICK, this, this.onReward); + this.btnShare.off(Laya.Event.CLICK, this, this.onReward); + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward); + } + + // 每次打开此popwin执行onOpen + protected onOpen(){ + super.onOpen(); + this.iniitRewardUI(); + } + + // 初始化/更新获得奖励按钮ui + private initRewardUI() { + let shareVideoType: ShareVideoType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString()); + switch (shareVideoType) { + case ShareVideoType.Share: // 同步分享 + case ShareVideoType.ShareAysnc: // 异步分享 + case ShareVideoType.ShareIntegral: // 分享积分 + this.btnFree.visible = false; + this.btnShare.visible = true; + this.btnVideo.visible = false; + break; + + case ShareVideoType.Video: // 推送视频 + case ShareVideoType.VideoToShare: // 无视频则分享 + // 视频ui状态 + this.btnFree.visible = false; + this.btnShare.visible = false; + this.btnVideo.visible = true; + break; + + default: // 无视频和无分享 + // 既不显示分享ui又不显示视频ui,直接领奖ui状态 + this.btnFree.visible = true; + this.btnShare.visible = false; + this.btnVideo.visible = false; + break; + } + } + + // 领取奖励操作 + private onReward(){ + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), { + success: this.handleReward, + fail: this.handleError, + context: this + } ); + } + + // 分享/视频成功后回调处理函数:发奖励 + private handleReward(from: ShareVideoFrom, ret: any | null){ + // 分享成功、视频成功、无视频无分享 + } + + // 分享/视频失败后回调处理函数:弹出提示 + private handleError(from: ShareVideoFrom, error: any | null){ + // 返回错误,处理错误msg信息,自定义处理 + if( error ){ + wx.showToast({ + title: error.msg + }); + } + } + } + + // Enums.ts文件 + // 分享视频类型(与后台一一对应) + export enum ShareVideoType { + None = -1, // -1无分享无视频 + Share = 0, // 0同步分享 + ShareAysnc = 1, // 1异步分享 + ShareIntegral = 5, // 5分享积分 + Video = 2, // 2看视频 + VideoToShare = 3, // 3无视频则分享 + VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示) + } + + // 分享视频key枚举,每个key表示一个功能点 + enum ShareVideoKeys { + // 钻石双倍获取 + DiamondDouble = 'diamond_double', + // 失败获得双倍奖励 + FailRewardDouble = 'fail_reward_double' + } + + // 分享视频功能点最终推送类型 + enum ShareVideoFrom{ + None = 0, // 无视频无分享 + Share = 1, // 分享 + ShareAsync = 2, // 异步分享 + Video = 3, // 看视频 + } + + ``` +
+ 下面演示dispatch和getShareVideoType两个api的完整使用,Laya引擎开发: + + 页面功能点按钮做三个状态: + + 1、看视频状态(显示视频icon) + + 2、分享状态(显示分享icon) + + 3、直接领奖(没有icon,审核状态) + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_1.png "🔍点击查看大图") + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_2.png "🔍点击查看大图") + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_3.png "🔍点击查看大图") + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_4.png "🔍点击查看大图") + + 例如,一个领取钻石双倍,页面的按钮ui通过下面的方式进行切换 + + 1、页面做三个按钮:视频icon按钮、分享icon按钮、直接领取按钮 + + 2、进入页面根据配置的key获取类型,显示对应类型ui:调用下面的initRewardUI(可随意命名) + + 3、分享或者视频后,SDK会发送一个tactic.update的消息过来,使用PCSDK.event.add注册监听,PCSDK.event.remove移除监听(PCSDK.event详细了解请查看[事件模块](event.md)),监听事件处理下一次推送显示ui状态:执行一下initRewardUI。 + + 4、给三个按钮都注册事件:onReward + ```javascript + // DiamondDoublePopwin.ts文件 + export default class DiamondDoublePopwin extends BaseView { + protected addEvent() { + super.addEvent(); + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用) + this.btnFree.on(Laya.Event.CLICK, this, this.onReward); + // 分享双倍 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward); + // 视频双倍 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward); + // PCSDK.event.add注册监听SDK发送的消息:tactic.update,更新获得奖励按钮ui + PCSDK.event.add('tactic.update', this.initRewardUI, this); + } + + protected removeEvent() { + super.removeEvent(); + this.btnFree.off(Laya.Event.CLICK, this, this.onReward); + this.btnShare.off(Laya.Event.CLICK, this, this.onReward); + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward); + // PCSDK.event.remove移除监听SDK发送的消息:tactic.update + PCSDK.event.remove('tactic.update', this.initRewardUI, this); + } + + // 每次打开此popwin执行onOpen + protected onOpen(){ + super.onOpen(); + // 界面打开 + this.initRewardUI(); + } + + // 领取奖励操作 + private onReward(){ + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), { + success: this.handleReward, + context: this + } ); + } + + // 分享/视频成功后回调处理函数:发奖励 + private handleReward(from: ShareVideoFrom, ret: any | null){ + // 分享成功、视频成功、无视频无分享 + } + + // 分享/视频失败后回调处理函数:弹出提示 + private handleError(from: ShareVideoFrom, error: any | null){ + // 返回错误,处理错误msg信息,自定义处理 + if( error ){ + wx.showToast({ + title: error.msg + }); + } + } + + // 初始化/更新获得奖励按钮ui + private initRewardUI() { + let shareVideoType: ShareType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString()); + switch (shareVideoType) { + case ShareVideoType.Share: // 同步分享 + case ShareVideoType.ShareAysnc: // 异步分享 + case ShareVideoType.ShareIntegral: // 分享积分 + // 分享ui状态 + this.stat_share.play(0,false); + // 等同于 + // this.btnFree.visible = false; + // this.btnShare.visible = true; + // this.btnVideo.visible = false; + break; + + case ShareVideoType.Video: // 视频 + case ShareVideoType.VideoToShare: // 无视频则分享 + // 视频ui状态 + this.stat_video.play(0,false); + // 等同于 + // this.btnFree.visible = false; + // this.btnShare.visible = false; + // this.btnVideo.visible = true; + break; + + default: // 无视频和无分享 + // 既不显示分享ui又不显示视频ui,直接领奖ui状态 + this.stat_free.play(0,false); + // 等同于 + // this.btnFree.visible = true; + // this.btnShare.visible = false; + // this.btnVideo.visible = false; + break; + } + } + } + + // Enums.ts文件 + // 分享视频类型(与后台一一对应) + export enum ShareVideoType { + None = -1, // -1无分享无视频 + Share = 0, // 0同步分享 + ShareAysnc = 1, // 1异步分享 + ShareIntegral = 5, // 5分享积分 + Video = 2, // 2看视频 + VideoToShare = 3, // 3无视频则分享 + VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示) + } + + // 分享视频key枚举,每个key表示一个功能点 + enum ShareVideoKeys { + // 钻石双倍获取 + DiamondDouble = 'diamond_double', + // 失败获得双倍奖励 + FailRewardDouble = 'fail_reward_double' + } + + // 分享视频功能点最终推送类型 + enum ShareVideoFrom{ + None = 0, // 无视频无分享 + Share = 1, // 分享 + ShareAsync = 2, // 异步分享 + Video = 3, // 看视频 + } + ``` + + + +#### **终章:** + +这个模块的内容点比较多,接入的注意事项也比较多,望接入者细度使用说明和理解示例意图。 + +噗嗤游戏的小伙伴在开发公司内部游戏中使用此模块,简单封装了SDK分享视频模块的几个通用方法,提供开发者参考,**[点击下载](https://dep.miso-lab.com/sdkword/tools/sdk-share-tools-1.0.0.zip)**。 diff --git a/inner/stat.md b/inner/stat.md new file mode 100644 index 0000000..137d3c8 --- /dev/null +++ b/inner/stat.md @@ -0,0 +1,255 @@ +# 启动注册打点 + +------ + +#### **简介** + +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 + + + +#### **后台使用** + +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png) + +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png) + + + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------ | ------------------------------------------------------------ | +| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 | +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) | +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 | + + + +接入流程图: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png) + +1. **setLoginInfo** +
+ ```javascript + PCSDK.stat.setLoginInfo( data: object ): void + ``` + + 定义:游戏成功登录到服务器,获取到openId和用户信息:openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息 + + 参数: + + ```javascript + data: object +{ + openId: string 必传,openId + regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒) + } + ``` + 返回值: + + ```javascript + 无 + ``` + + 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。 + 该示例,只是模拟使用环境。 + + ```javascript + // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。 + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + PCSDK.stat.setLogind({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + ``` + +2. **loadingFinish** + + ```javascript + PCSDK.stat.loadingFinish(): Promise + ``` + + 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) + + 参数: + + ``` + 无 + ``` + 返回值: + + ```javascript + Promise + Promise resolve 加载打点成功完成回调 + ``` + + 示例: + + ```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() { + // 打点:loadingFinish + PCSDK.stat.loadingFinish(); + } + + // 更新资源加载进度条 + private onProgressMain(ret) { + let progress = ret.data; + this.skin.txtProgress.text = Math.floor(progress * 100) + '%'; + } + ``` + +3. **active** + + ```javascript + PCSDK.stat.active(): void + ``` + + 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式: + 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。 + + 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + void + 无 + ``` + + 示例: + + ```javascript + // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active + // 资源加载loading界面 + class LoadingScene(){ + constructor(){ + // 登录 + this.login(); + // 加载资源 + this.loadResouce(); + } + + /** + * 登录 + */ + private login(){ + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + // 打点:设置用户信息 + PCSDK.stat.setLoginInfo({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + } + + /** + * 加载资源 + */ + private loadResouce(){ + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + /** + * 加载资源完成回调监听 + */ + private onLoadedMain(){ + // 打点:加载资源完成 + PCSDK.stat.loadingFinish().then( () => { + // 打点:用户活跃注册打点 + PCSDK.stat.active(); + + // 进入home主页场景 + SceneManager.I.switchScene(HomeScene); + }); + } + } + + // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。 + // 资源加载loading界面 + class LoadingScene(){ + constructor(){ + // 登录 + this.login(); + // 加载资源 + this.loadResouce(); + } + + /** + * 登录 + */ + private login(){ + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + // 打点:设置用户信息 + PCSDK.stat.setLoginInfo({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + } + + /** + * 加载资源 + */ + private loadResouce(){ + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + /** + * 加载资源完成回调监听 + */ + private onLoadedMain(){ + // 打点:加载资源完成 + PCSDK.stat.loadingFinish().then( () => { + // 进入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/inner/stat_active.md b/inner/stat_active.md new file mode 100644 index 0000000..137d3c8 --- /dev/null +++ b/inner/stat_active.md @@ -0,0 +1,255 @@ +# 启动注册打点 + +------ + +#### **简介** + +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 + + + +#### **后台使用** + +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png) + +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png) + + + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------ | ------------------------------------------------------------ | +| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 | +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) | +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 | + + + +接入流程图: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png) + +1. **setLoginInfo** +
+ ```javascript + PCSDK.stat.setLoginInfo( data: object ): void + ``` + + 定义:游戏成功登录到服务器,获取到openId和用户信息:openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息 + + 参数: + + ```javascript + data: object +{ + openId: string 必传,openId + regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒) + } + ``` + 返回值: + + ```javascript + 无 + ``` + + 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。 + 该示例,只是模拟使用环境。 + + ```javascript + // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。 + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + PCSDK.stat.setLogind({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + ``` + +2. **loadingFinish** + + ```javascript + PCSDK.stat.loadingFinish(): Promise + ``` + + 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) + + 参数: + + ``` + 无 + ``` + 返回值: + + ```javascript + Promise + Promise resolve 加载打点成功完成回调 + ``` + + 示例: + + ```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() { + // 打点:loadingFinish + PCSDK.stat.loadingFinish(); + } + + // 更新资源加载进度条 + private onProgressMain(ret) { + let progress = ret.data; + this.skin.txtProgress.text = Math.floor(progress * 100) + '%'; + } + ``` + +3. **active** + + ```javascript + PCSDK.stat.active(): void + ``` + + 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式: + 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。 + + 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + void + 无 + ``` + + 示例: + + ```javascript + // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active + // 资源加载loading界面 + class LoadingScene(){ + constructor(){ + // 登录 + this.login(); + // 加载资源 + this.loadResouce(); + } + + /** + * 登录 + */ + private login(){ + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + // 打点:设置用户信息 + PCSDK.stat.setLoginInfo({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + } + + /** + * 加载资源 + */ + private loadResouce(){ + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + /** + * 加载资源完成回调监听 + */ + private onLoadedMain(){ + // 打点:加载资源完成 + PCSDK.stat.loadingFinish().then( () => { + // 打点:用户活跃注册打点 + PCSDK.stat.active(); + + // 进入home主页场景 + SceneManager.I.switchScene(HomeScene); + }); + } + } + + // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。 + // 资源加载loading界面 + class LoadingScene(){ + constructor(){ + // 登录 + this.login(); + // 加载资源 + this.loadResouce(); + } + + /** + * 登录 + */ + private login(){ + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + // 打点:设置用户信息 + PCSDK.stat.setLoginInfo({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + } + + /** + * 加载资源 + */ + private loadResouce(){ + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + /** + * 加载资源完成回调监听 + */ + private onLoadedMain(){ + // 打点:加载资源完成 + PCSDK.stat.loadingFinish().then( () => { + // 进入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/inner/stat_ads.md b/inner/stat_ads.md index e07e60d..e78aea7 100644 --- a/inner/stat_ads.md +++ b/inner/stat_ads.md @@ -6,19 +6,19 @@ 交叉推广位是在游戏中展示其他游戏,用户点击某个游戏跳转进入游戏,达到共享用户的目的。 -噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析阅览。 +噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析查看。 -**3种广告类型:交叉悬浮广告框、交叉抽屉式广告位、交叉猜你喜欢广告位** +**3种广告类型:悬浮框交叉推广位、抽屉式交叉推广位、猜你喜欢交叉推广位,对应类型值为:40、70、50** -1. 交叉悬浮广告框,放置到首页、结算页 +1. 悬浮框交叉推广位,推荐位置:首页、结算页 ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_013.png "🔍点击查看大图") -2. 交叉抽屉式广告位,放置到首页、结算页 +2. 抽屉式交叉推广位,推荐位置:首页、结算页 ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_014.png "🔍点击查看大图") -3. 交叉猜你喜欢广告位,推荐放置到结算页 +3. 猜你喜欢交叉推广位,推荐位置:结算页 ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_015.png "🔍点击查看大图") @@ -38,7 +38,9 @@ - 由于微信对每个游戏可跳转其他游戏有10个限制,可跳转的其它游戏需要在小游戏根目录下的全局配置文件game.json中进行添加配置:navigateToMiniProgramAppIdList,该参数定义请详读[小程序全局配置](https://developers.weixin.qq.com/minigame/dev/reference/configuration/app.html)。 -- 噗嗤游戏为了方便开发者接入调试交叉推广位,【后台测试服】已经配置测试使用的不同类型推广位,并提供以下10个测试服广告位appid: +- **接入3种交叉推广位后,为了防止微信审核被拒(被拒理由:微信认定游戏跳转到其他游戏太多,判断游戏是一个游戏盒子,拒绝审核通过),为了防范被拒,在[数据模块](data.md)提供了三个数据获取api:PCSDK.data.IsCross、PCSDK.data.IsDrawer、PCSDK.data.IsGuessLike,控制3种推广位广告的显示隐藏,开发者在游戏中对三种广告控制显示隐藏状态。[详请请阅读数据api](data.md#ad_cross)。** + +- 噗嗤游戏为了方便开发者接入调试交叉推广位,后台已经配置测试使用的3种类型推广位,提供以下10个推广位appid,开发者复制下面的navigateToMiniProgramAppIdList json数据,配置到game.json的navigateToMiniProgramAppIdList参数: 水果爆破 :"wx26822126b4d99eda", @@ -75,33 +77,18 @@ ] ``` - - -- 完成下面的操作步骤,即可拉取交叉推广位: - - 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.bannerList | 根据类型获取对应类型交叉广告列表,目前SDK支持3种类型:40(交叉悬浮广告框)、70(交叉抽屉式广告位)、50(交叉猜你喜欢广告位) | +| PCSDK.stat.bannerList | 根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型:40(悬浮框交叉推广位)、70(抽屉式交叉推广位)、50(猜你喜欢交叉推广位) | | PCSDK.stat.bannerNavigateTo | 交叉推广位点击跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram) | -| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK在onHide时候上报数据到后台 | - - - - +| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK内部会在onHide时候上报数据到后台 | @@ -111,7 +98,7 @@ PCSDK.stat.loadingFinish(banner_type): Promise ``` - 定义:根据类型获取对应类型交叉广告列表,目前SDK支持3种类型 + 定义:根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型 参数: @@ -203,7 +190,7 @@ */ export default class TestBannerSample { constructor() { - // 示例:加载交叉悬浮广告框 + // 示例:加载悬浮框交叉推广位 this.loadBannerList(BannerType.TYPE_CROSS) .then((dataList: Array) => { // 渲染广告位数据 @@ -247,9 +234,9 @@ // 广告位类型的枚举 enum BannerType { - TYPE_CROSS = 40, // 交叉悬浮广告框 - TYPE_LIKE = 50, // 交叉猜你喜欢广告位 - TYPE_LIST = 70, // 交叉抽屉广告位 + TYPE_CROSS = 40, // 悬浮框交叉推广位 + TYPE_LIKE = 50, // 猜你喜欢交叉推广位 + TYPE_LIST = 70, // 抽屉式交叉推广位 } /* @@ -288,7 +275,7 @@ } ``` - 示例:获取猜你喜欢推广位,以列表的形式显示在界面上,点击任意一项游戏跳转其他游戏 + 示例:获取猜你喜欢交叉推广位,以列表的形式显示在界面上,点击任意一项游戏跳转其他游戏 ```javascript // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息 @@ -314,7 +301,7 @@ 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); @@ -385,9 +372,9 @@ // 广告位类型的枚举 enum BannerType { - TYPE_CROSS = 40, // 交叉悬浮广告框 - TYPE_LIKE = 50, // 交叉猜你喜欢广告位 - TYPE_LIST = 70, // 交叉抽屉广告位 + TYPE_CROSS = 40, // 悬浮框交叉推广位 + TYPE_LIKE = 50, // 猜你喜欢交叉推广位 + TYPE_LIST = 70, // 抽屉式交叉推广位 } /* @@ -424,11 +411,11 @@ > 提示: > - > 展示猜你喜欢/抽屉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。 + > 展示猜你喜欢/抽屉式交叉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。 > - > 展示交叉悬浮框推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api + > 展示悬浮框交叉推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api - 示例:根据交叉悬浮框类型调用PCSDK.stat.bannnerList接口获取交叉悬浮框推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。 + 示例:根据悬浮框交叉推广位类型调用PCSDK.stat.bannnerList接口获取悬浮框交叉推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。 ```javascript /** * 演示交叉推广位使用示例 @@ -445,7 +432,7 @@ export default class TestBannerSample extends ui.ads.ADbtnUI { this.on(Laya.Event.CLICK, this, this.onJumpGame); } - // 初始化显示交叉悬浮框广告位 + // 初始化显示悬浮框交叉推广位 init(isFirst: boolean) { isFirst && (this.count = 0); this.anim_entice.play(0, true); @@ -456,7 +443,7 @@ export default class TestBannerSample extends ui.ads.ADbtnUI { this.refresh(); } - // 清理交叉悬浮框广告位 + // 清理悬浮框交叉推广位 clear() { this.anim_entice.gotoAndStop(0); this.anim_entice.removeLabel('refresh'); @@ -536,8 +523,8 @@ export default class TestBannerSample extends ui.ads.ADbtnUI { // 广告位类型的枚举 enum BannerType { - TYPE_CROSS = 40, // 交叉悬浮广告框 - TYPE_LIKE = 50, // 交叉猜你喜欢广告位 - TYPE_LIST = 70, // 交叉抽屉广告位 + TYPE_CROSS = 40, // 悬浮框交叉推广位 + TYPE_LIKE = 50, // 猜你喜欢交叉推广位 + TYPE_LIST = 70, // 抽屉式交叉推广位 } ``` \ No newline at end of file diff --git a/inner/stat_event.md b/inner/stat_event.md new file mode 100644 index 0000000..a811d33 --- /dev/null +++ b/inner/stat_event.md @@ -0,0 +1,153 @@ +# 自定义事件打点 + +------ + +#### **简介** + +自定义事件是噗嗤游戏为开发者提供的自助分析功能:事件触发去重人数、次数等信息。游戏的任意位置需要统计触达人数、次数等都可以使用事件来实现,后台提供分析数据可查看,并不局限于用户的行为事件。 + +#### **后台使用** + +接入自定义事件打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】可查看自定义事件次数、去重人数等详细信息(此功能需要管理员添加权限): + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_018.png "🔍点击查看大图") + + + +#### **接入必读** + +接入自定义事件打点前,请[前往后台](https://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枚举 + +```javascript +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 | 自定义事件打点,使用前请[前往后台](https://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, '主界面'); + PopwinMananger.I.openWin(SignPopwin); + } + + // 开始加载资源 + 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 + }); + } + + export enum EventKeys { + // 升级奖励, + LvUpRewards = 'lv_up_rewards', + // 点击主界面-签到, + FunctionSign = 'function_sign', + // 加载, + LoadingExhibition = 'loading_exhibition' + } + ``` diff --git a/inner/stat_level.md b/inner/stat_level.md new file mode 100644 index 0000000..255bdad --- /dev/null +++ b/inner/stat_level.md @@ -0,0 +1,297 @@ +# 关卡分析打点 + +------ + +#### **简介** + +关卡分析,为开发者提供小游戏详细的关卡数据,分析各关卡玩家的通关状况,帮助开发者从数据角度衡量游戏设计的合理性,调节难易度,观察各关卡道具使用情况和奖励获取状况,对比分析各个指标,通过量化玩家数据,提高游戏体验。 + +#### **后台使用** + +接入关卡分析接口后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【关卡分析】可查看关卡进入用户数据、失败次数、失败率、平均完成时间等): + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_020.png "🔍点击查看大图") + + + +#### **接入API**: + +| **名称** | **功能说明** | +| ---------------- | ------------------------------------------------------------ | +| PCSDK.stat.logLevelRelive | 游戏关卡复活上报 | +| PCSDK.stat.logLevelHide | 游戏关卡onHide上报,在游戏界面注册wx.onHide事件,判断不属于复活、失败、成功状态下上报此数据 | +| PCSDK.stat.logLevelFail | 游戏关卡失败上报 | +| PCSDK.stat.logLevelWin | 游戏关卡成功上报 | +| PCSDK.stat.logMerge | 游戏二合一合成最高等级上报 | + + + +1. #### **logLevelRelive** + + ```javascript + PCSDK.stat.logLevelRelive(levelId: string | number , params?: { attr?: number, ext?: any } ): void + ``` + + 定义:关卡复活成功数据上报 + + 参数: + + ``` + levelId: string | number 必传,游戏关卡id + + params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext + { + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 + } + ``` + + [点此查看完整示例](stat_level.md#sample)如何添加关卡复活成功打点代码 + +2. #### **logLevelHide** + + ```javascript + PCSDK.stat.logLevelHide(levelId: string | number , params?: { attr?: number, ext?: any } ): void + ``` + 定义:监听游戏战斗界面onHide时上报关卡的数据。什么是界面onHide?[请详读微信小游戏wx.onHide](https://developers.weixin.qq.com/minigame/dev/api/base/app/life-cycle/wx.onHide.html) + 注意事项: + + > 1)游戏战斗界面监听平台的onHide事件,使用此api上报关卡onHide打点。 + > + > + + > 2)游戏战斗界面退出后,要移除onHide事件监听,避免在其他界面下,onHide时候执行此次上报。 + > + > + + > 3)一定要屏蔽游戏复活中、游戏失败、游戏通过成功状态,这三种状态下避免上报此打点,详看下面示例。 + + 参数: + + ``` + levelId: string | number 必传,游戏关卡id + + params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext + { + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 + } + ``` + [点此查看完整示例](stat_level.md#sample)如何添加关卡onHide打点代码 + +3. #### **logLevelFail** + + ```javascript + PCSDK.stat.logLevelFail(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void + ``` + + 定义:关卡失败数据上报 + + 参数: + + ``` + levelId: string | number 必传,游戏关卡id + + params: object 必传,关卡需要的其他参数 + { + ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒 + first: number 必传 是否第一次体验关卡,1是,0否 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 + } + ``` + [点此查看完整示例](stat_level.md#sample)如何添加关卡失败打点代码 + +4. #### **logLevelWin** + + ```javascript + PCSDK.stat.logLevelWin(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void + ``` + + 定义:关卡成功通关数据上报 + + 参数: + + ``` + levelId: string | number 必传,游戏关卡id + + params: object 必传,关卡需要的其他参数 + { + ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒 + first: number 必传 是否第一次体验关卡,1是,0否 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 + } + ``` +
完整示例,以上四个接口使用场景: +> SDK中监听了onHide事件,当游戏onHide时,SDK会发送事件名为'app.hide'的自定义事件,开发者可在代码中使用PCSDK.event.bindEvent监听该事件,使用PCSDK.event.removeEvent移除对应监听事件,[详细文档event模块文档请阅读event事件模块](evennt.md)。 + + ```javascript + /** + * 游戏界面 + **/ + exports class GameScene extends BaseView{ + // 关卡id + private missionId: number; + // 当前选中使用的枪支等级 + private currSelectGun: number; + // 游戏状态机 + private gameState: GameState; + // 关卡开始时间 + private enterTime: number; + + constructor(){ + this.gameState = GameState.Idle; + } + + // 游戏界面打开 + open(){ + super.open(); + this.gameState = GameState.Idle; + this.enterTime = new Date().getTime(); + this.addEvent(); + } + + // 游戏界面关闭 + close(){ + super.close(); + this.removeEvent(); + } + + // 添加游戏事件监听 + private addEvent(){ + // 监听SDK中app.hide事件事件消息 + PCSDK.event.bindEvent( 'app.hide', this.handleHide, this); + // 监听游戏中level.relive事件消息 + EventCenter.I.add('level.relive', this, this.handleLevelRelive); + } + + // 移除游戏事件监听 + private removeEvent(){ + PCSDK.event.removeEvent( 'app.hide', this.handleHide, this); + EventCenter.I.remove('level.relive', this, this.handleLevelRelive); + } + + // 游戏复活中 + private doGameRelive(){ + this.setState(GameState.Relive); + } + + // 游戏通关失败 + private doGameFail(){ + this.setState(GameState.Fail); + } + + // 游戏通关成功 + private doGameWin(){ + this.setState(GameState.Win); + } + + // SDK发出的app.hide事件监听 + private handleHide() { + // 战斗界面onHide上报logLevelHide(游戏通关成功、游戏通关失败、游戏复活中不进行上报logLevelHide打点) + if(!(this.isState(GameState.Win) || this.isState(GameState.Fail) || this.isState(GameState.Relive))) + PCSDK.stat.logLevelHide(this.missionId, { + attr: this.currSelectGun + }); + } + + // 监听关卡复活成功消息 + private handleLevelRelive(){ + // 关卡复活成功上报 + PCSDK.stat.logLevelRelive(this.missionId, { + attr: this.currSelectGun + }); + } + + private isState(state: GameState) { + return this.state === state; + } + + // 设置状态机 + private setState(state: GameState) { + if (this.isState(state)) return; + + this.state = state; + let costTime: number; // 关卡消耗时间 + let failNum: number; // 关卡失败次数 + switch (state) { + case GameState.Win: // 处理成功 + // 关卡成功上报 + costTime = new Date().getTime() - this.enterTime; + failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId); + PCSDK.stat.logLevelWin(this.missionId, { + ctime: costTime, + first: failNum ? 0 : 1, + attr: this.currSelectGun, + ext: { + currHp: 100000 + } + }); + break; + + case GameState.Fail: // 处理失败 + // 关卡失败上报 + costTime = new Date().getTime() - this.enterTime; + failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId); + PCSDK.stat.logLevelFail(this.missionId, { + ctime: costTime, + first: failNum ? 0 : 1, + attr: this.currSelectGun + }); + break; + + case GameState.Relive:// 处理复活中 + // 弹出复活操作界面 + PopWinManager.I.openPopwin(RelivePopwinn); + break; + } + } + } + + /** + * 复活界面 + **/ + exports class RelivePopwinn extends BaseView{ + // 复活界面关闭 + close(){ + super.close(); + // 关闭模拟:复活成功,发送复活成功消息 + EventCenter.I.emit('level.relive'); + } + } + + // 游戏状态状态机 + enum GameState{ + Idle, // 初始状态 + Fail, // 失败状态 + Win, // 成功通关状态 + Relive // 正在复活状态 + } + ``` + +5. #### **logMerge** + + ```javascript + PCSDK.stat.logMerge(mergeLv: number): void + ``` + + 定义:游戏二合一合成最高等级上报 + + 参数: + + ``` + mergeLv: number 必传,二合一合成最高等级 + ``` + + 示例:二合一部分,合成最高等级时候上报 + + ```javascript + // 合成最新等级合成 + private handleMergeLastestLv(lastestLv: number){ + // 合成最新等级上报 + PCSDK.stat.logMerge( lastestLv ); + } + ``` + + \ No newline at end of file diff --git a/inner/stat_pay.md b/inner/stat_pay.md new file mode 100644 index 0000000..f7c8ff0 --- /dev/null +++ b/inner/stat_pay.md @@ -0,0 +1,112 @@ +# 支付结果打点 + +------ + +#### **简介** + +支付上报,是开发者使用米大师或者第三方其他支付(比如H5支付),支付回调后把支付结果(失败支付、成功支付、取消支付)上报到后台。 + +#### **注意事项** + +{% em %} 使用api,需在[config.js中配置MidasPay](install.md#configJs)信息。 {% endem %} + +**MidasPay( object )配置:**米大师虚拟支付配置,请注意下面规则 + + OfferId:在米大师申请的应用id,没有接入米大师,默认为"0" + + ZoneId:分区ID,默认:"1" + + Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game" + + CurrencyType:币种,默认:"CNY" + + Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。 + + 1)接入了米大师,填写"android"(ios暂时没有开放) + + 2)未接入米大师,使用其他支付,如果只支持android,则填写"android"; + + 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios"; + + 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------ | ------------------------------------------------------------ | +| PCSDK.stat.logPay | 开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付) | + + +1. **logPay** + + ```javascript + PCSDK.stat.logPay( params: object ): void + ``` + + 定义:开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付)。该api需在[config.js中配置MidasPay](install.md#configJs)信息。 + + 参数: + + ``` + params object 必传 打点参数 + { + type: number 必传 支付类型:0(支付失败),1(支付成功),-1(取消支付); + source: string 必传 游戏服务商生成的订单号,没有则为空字符串 + amount: number 必传 实际支付金额,单位分 + buy_id: string | number; 必传 商品ID + buy_name: string; 必传 商品名称 + item_info: string 必传 获得的道具内容:道具id及数量,逗号分隔,多项使用分号分隔 => 1,1;2,10;3,100 + } + ``` + 返回值: + + ``` + void + 无 + ``` + + 示例:客户端游戏支付完成后上报支付打点,下例只是演示logPay用法 + + ```javascript + private reqPay() { + // 模拟的支付,开发者需更加实际接入支付 + Api.I.pay().then( ret => { + switch(ret.code){ + case 1: // 支付成功回调处理 + PCSDK.stat.logPay({ + type: 1, // 成功支付 + source: "10000400", // 订单号,没有则为空字符串 + amount: 10 * 100, // 10元 + buy_id: 58, // 支付的商品id + buy_name: "钻石*152,金币*188888888", + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90 + }); + break; + + case 0: // 支付失败回调处理 + PCSDK.stat.logPay({ + type: 0, // 失败支付 + source: "10000400", // 订单号,没有则为空字符串 + amount: 10 * 100, // 10元 + buy_id: 58, // 支付的商品id + buy_name: "钻石*152,金币*188888888", + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90 + }); + break; + + case -1: // 支付取消回调处理 + PCSDK.stat.logPay({ + type: -1, // 取消支付 + source: "10000400", // 订单号,没有则为空字符串 + amount: 10 * 100, // 10元 + buy_id: 58, // 支付的商品id + buy_name: "钻石*152,金币*188888888", + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90 + }); + break; + } + }); + } + ``` \ No newline at end of file diff --git a/inner/styles/website.css b/inner/styles/website.css new file mode 100644 index 0000000..7d92dfd --- /dev/null +++ b/inner/styles/website.css @@ -0,0 +1,68 @@ +/* CSS for website */ +h1 , h2{ + border-bottom: 1px solid #EFEAEA; + padding-bottom: 3px; +} +.markdown-section>:first-child { + margin-top: 0!important; +} +.page-wrapper { + margin-top: -1.275em; +} +.book .book-body .page-wrapper .page-inner section.normal { + min-height:350px; + margin-bottom: 30px; +} + +.book .book-body .page-wrapper .page-inner section.normal hr { + height: 0px; + padding: 0; + margin: 1.7em 0; + overflow: hidden; + background-color: #e7e7e7; + border-bottom: 1px dotted #e7e7e7; +} + +.video-js { + width:100%; + height: 100%; +} + +pre[class*="language-"] { + border: none; + background-color: #f7f7f7; + /* font-size: 1em; */ + line-height: 1.2em; +} + +.book .book-body .page-wrapper .page-inner section.normal { + font-size: 16px; + font-family: "ubuntu", "Tahoma", "Microsoft YaHei", arial, sans-serif; +} + +.aceCode { + font-size: 14px !important; +} + +input[type=checkbox]{ + margin-left: -2em; +} + +.page-footer span{ + font-size: 12px; +} + +.page-footer .copyright { + float: left; +} + +.body, html { + overflow-y: hidden; +} + +.versions-select select { + height: 2em; + line-height: 2em; + border-radius: 4px; + background: #efefef; +} diff --git a/install.md b/install.md deleted file mode 100644 index 915d4e6..0000000 --- a/install.md +++ /dev/null @@ -1,218 +0,0 @@ -# 安装步骤 - ------- - -## SDK下载 - -1. 下载最新版本的SDK [SDK下载](download.md) 。 -2. 解压下载的sdk-in-v{版本号}.zip包,解压文件夹里面的的目录结构: - -``` -├── sdk.d.ts -├── sdk/ -| ├── config.js -| └── entry.js -| └── libs/ - | └── game.min.js -``` - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_001.png "🔍点击查看大图") - -- **sdk.d.ts:sdk的ts声明文件,开发者项目采用Typescript开发,请复制该文件到项目中。** -- sdk/config.js:sdk配置文件,【[详细请阅读下方config.js参数说明](install.md#config)】 -- sdk/entry.js:sdk入口文件,引入了sdk所提供的模块功能 -- sdk/libs/game.min.js:sdk类库核心代码文件 - - - -## 配置合法域名 - -* ##### 管理员或开发者身份在微信小程序后台→设置→开发者设置中添加 request、download合法域名 - 正式环境 request 合法域名: - - https://dataapi.d3games.com (统计平台正式服域名) - - cdn资源请求合法域名: - - https://dep.miso-lab.com (>>>request、download均要添加<<<) - - - - - -​ -## SDK配置步骤 - -* #### 将下载下来的sdk压缩包,解压后,拷贝sdk文件夹到微信开发者工具项目中。 - - 示例:将sdk放入到小游戏开发者工具项目的src文件夹中 - - ![引入目录](https://dep.miso-lab.com/sdkword/sdk_002.png "🔍点击查看大图") - - - - - -* #### 在game.js中将sdk.js文件使用require导入。 - - 示例:将sdk放入到小游戏开发者工具项目的src文件夹中 - ![引入目录](https://dep.miso-lab.com/sdkword/sdk_003.png "🔍点击查看大图") - - - -* #### 根据运营提供的信息修改sdk文件夹下的**config**.js文件(可横向拖动查看查看更多====>)
-
- ```javascript - export default { - IsDebug: false, // 是否debug模式,debug模式会打印log,可使用stat模块setDebug api进行修改 - AdCacheDuration: 30, // 广告列表缓存持续时间间隔 - IsUseShareModule: true, // 是否使用分享模块 - IsOnlineAutoUse: true, // 是否开启sdk自动请求online模块(在线参数配置)的updateOnlineConfig,拉取在线参数配置 - IsOnlineDebug: true, // 是否开启online模块(配置参数模块)debug模式 - ShareRightKey: 'forward', // 右上角分享的shareKey,shareKey请阅读share模块说明,默认为forward,为空字符串则不使用右上角分享 - - ShareData: { // 必填,默认分享数据(拉取不到分享配置后使用,默认分享,SDK自动分配share_id为99999) - share_desc: 'xxx', - share_wxad_id: '', // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享 - share_icon: 'xxx' - }, - GameId: 0, // 必填,游戏ID,运营提供; - ChannelId: 0, // 必填,游戏渠道ID,运营提供; - IntegralChannelId: 0, // 必填,积分投放渠道ID,运营提供; - Secret: '***请配置你的Secret***', // 必填,游戏的secret key - MidasPay: { // 米大师虚拟支付配置 - OfferId: "0", // 在米大师申请的应用id - ZoneId: "1", // 分区ID,默认:1 - Mode: "game", // 支付的类型,不同的支付类型有各自额外要传的附加参数,默认:game - CurrencyType: "CNY", // 币种,默认:CNY - Platform: '' // 申请接入时的平台,platform与OfferId(米大师申请的应用id)有关,详情请阅读文档config.js参数MidasPay下的Platform配置 - } - }; -``` - - -参数详解: - -
-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启动时拉取后台配置的分享/视频列表,运营或者开发者登录后台后,配置分享/视频,开发者请详看分享视频模块接入。 - -5. **IsOnlineAutoUse( boolean ):**是否启用在线配置参数模块功能 - - false:两种处理 1)不启用在线配置参数模块功能; 2)启用在线配置参数功能,但是SDK启动时不自动调用updateOnlineConfig拉取后台配置参数列表,开发者在代码主动调用拉取在线配置参数:PCSDK.online.updateOnlineConfig(); - - 示例:开发者代码中主动拉取在线配置参数。 - - ```javascript - // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关 - PCSDK.online.updateOnlineConfig().then(() => { - // 获取是否后台动态配置开启插屏广告,1为开启,0为关闭 - let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; - // isInterstitialAd && '显示插屏广告'; - // 获取动态多个广告位开启的配置 - let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); - // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位'; - // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位'; - // pcGameOpenMap.Cross === 1 && '显示交叉推广位'; - }); - ``` - true:sdk启动时自动调用updateOnlineConfig拉取后台在线配置参数列表,开发者可通过 - - PCSDK.online.getParamsObj、PCSDK.online.getParamsInt、PCSDK.online.getParamsString、PCSDK.online.getParams api传递后台配置参数key获取在线配置参数。 - - 示例:IsOnlineAutoUse: true,开发者可使用下面api获取在线配置参数配置的值 - - ```javascript - let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; - let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); - ``` - -6. **IsOnlineDebug( boolean ):**是否启用online模块(在线配置参数)debug模式,建议设置为true。 - - false:不启动debug模式,开发者主动调用updateOnlineConfig或者SDK启动时调用updateOnlineConfig都会把在线配置参数列表设置10分钟缓存,不用每次都去服务器请求,参照了友盟在线参数功能的设计 - - true: 开启debug模式,只要是请求updateOnlineConfig api都会立即发起请求,而不是去检测读取缓存 - -7. **ShareRightKey( string ):**右上角分享的shareKey,shareKey请阅读分享视频模块,默认为forward,为空字符串则不使用右上角分享,此配置在配置【IsUseShareModule: true】情况下生效。 - - 示例: - - 在后台的【分享/视频配置】栏目配置了一条分享key为:forward的分享配置 - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_004.png "🔍点击查看大图") - -8. **ShareData( object ):**此配置在【IsUseShareModule: true】起效,开发者如果接入了分享视频模块,>>> 请务必配置一条 <<<。 - - > IsUseShareModule设置true sdk启动拉取分享视频配置列表,如果分享视频列表拉取请求失败,或此shareKey不在分享视频配置列表中(登录后台 ->【游戏数据】->【分享/视频配置】栏没有配置分享key)就会使用此条设置的数据。 - - 示例:可从后台【游戏数据】->【分享/视频配置】中选取一条:复制文案,点击分享素材icon -> 查看大图 -> 右键查看分享图片的html源码复制src图片地址: - - ```json - { - // 分享文案内容 - share_desc: ' 半夜传来啪啪啪!竟是隔壁老王偷偷打气球', - // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享 - share_wxad_id: 'adunit-6958dcfc3f0bed31', - // 分享图 - share_icon: 'https://dep.miso-lab.com/data_analysis/games/res/5D57D4A3Yx.png' - } - ``` - - 操作步骤: - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_005.png "🔍点击查看大图") - -9. **GameId:必填,游戏id,请联系运营人员提供** - -10. **ChannelId:必填,游戏渠道id,请联系运营人员提供** - -11. **IntegralChannelId:必填,积分投放渠道ID,运营提供** - -12. **Secret:必填,游戏 Secret Key,请联系运营人员提供** - -13. **MidasPay( object ):**米大师虚拟支付配置,请注意下面规则 - - OfferId:在米大师申请的应用id,没有接入米大师(比如第三方支付),默认为"0" - - ZoneId:分区ID,默认:"1" - - Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game" - - CurrencyType:币种,默认:"CNY" - - Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。 - - 1)接入了米大师,填写"android"(ios暂时没有开放) - - 2)未接入米大师,使用其他支付,如果只支持android,则填写"android"; - - 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios"; - - 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios - - - -* #### 如果项目使用Typescript语言开发,请引入解压文件夹下的sdk.d.ts文件到项目中。 - - 示例:项目采用的是Laya Typescript版本进行开发,将该文件复制到libs目录下面 - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_007.png "🔍点击查看大图") - -* #### 到此,SDK的准备工作已经配置完毕,运行起来: - - 运行中碰到问题,[[请查看FAQ](faq.md)],或者微信群联系相关人员。 - - 正常运行,阅读SDK手册,开始[[SDK模块功能](modules.md)]接入。 \ No newline at end of file diff --git a/intro.md b/intro.md deleted file mode 100644 index 84e8e28..0000000 --- a/intro.md +++ /dev/null @@ -1,56 +0,0 @@ -# 噗嗤SDK -PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。 -PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。 - -**PCSDK提供的模块功能:** - -- [统计模块](stat.md) -- [分享视频模块](share.md) -- [配置参数模块️](online.md) -- [多平台接口模块](platform.md) -- [数据模块](data.md) -- [事件模块](event.md) - - - -# 噗嗤管理后台 -噗嗤管理后台对sdk中上报的各项数据进行分析,管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。 - -噗嗤管理后台地址: - -- https://data.d3games.com/#/login - -**友情提示:** - -- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。** -- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。** -- **登录后台即可使用后台提供的各项服务** - - - -**后台概览:** -## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图") - - - -**后台提供数据分析功能(不能跳转请联系管理员添加权限):** - -- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart) -- [分享数据分析](https://data.d3games.com/index.html#/share_exact) -- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list) -- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list) - - - -**后台提供配置相关功能(不能跳转请联系管理员添加权限):** - -- [分享/视频配置](https://data.d3games.com/index.html#/share_list) -- [配置参数](https://data.d3games.com/index.html#/config_list) - - -# 更多: -- 快速接入,请详读 [安装步骤](install.md) - - - -- 遇到问题可以查看 [FAQ](faq.md) \ No newline at end of file diff --git a/modules.md b/modules.md deleted file mode 100644 index f4a8dbd..0000000 --- a/modules.md +++ /dev/null @@ -1,87 +0,0 @@ -# 模块概览 -下图是PCSDK的概要思维导图,SDK所提供的所有功能都在下图列出(点击查看大图): - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_000.png "🔍点击查看大图") - - -[统计模块:stat](stat.md) - - 启动注册打点 - - setLoginInfo:设置登录信息 - - loadingFinish:资源加载完成 - - active:添加注册活跃用户 - - 关卡分析打点 - - logLevelRelive:游戏关卡复活上报 - - logLevelHide:游戏关卡页onHide上报 - - logLevelFail:游戏关卡失败上报 - - logLevelWin:游戏关卡成功上报 - - logMerge:游戏2合1合成最高等级上报 - - 交叉推广位:悬浮框、抽屉式、猜你喜欢 - - bannerList:获取对应类型交叉推广位列表 - - bannerNavigateTo:点击跳转到对应appid的游戏 - - addExposure:交叉推广位一条或者多条广告展示,添加曝光数据 - - 自定义事件 - - event:自定义打点事件 - -[数据模块:data](data.md) - - GameId:获取游戏的GameId,来源于config.js配置的GameId - - ChannelId:获取游戏渠道ID,来源于config.js配置的ChannelId - - UserId:获取用户ID,来源于setLoginInfo传递的openId的值 - - RegTime:获取用户注册时间,来源于setLoginInfo传递的regTime的值 - - ShareId:获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0。需接shareVideo模块 - - ShareKey:接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key - - Platform:获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) - - SystemId:获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备) - - QueryUserInviteUid:获取此次分享会话进入游戏,分享来源者用户ID,来源query的参数invite_user_uid - - IsCross:获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏 - - IsDrawer:获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏 - - IsGuessLike:获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏 - -[配置参数模块:online](online.md) - - updateOnlineConfig:拉取后台配置的配置参数数据,可代码中手动调用,也可SDK自动拉取 - - getParamsInt:根据在线参数key获取number类型参数值 - - getParamsObj:根据在线参数key获取object类型参数值 - - getParamsString:根据在线参数key获取string类型参数值 - -事件模块:event - -多平台接口模块:platform - -[分享视频模块:shareVideo](share.md) - - share:普通分享,不需要处理回调的场景 - - dispatch:分享视频分发入口,传入功能点英文命名的分享/视频key - - getShareVideoType:根据功能点在后台配置的分享/视频key,得到此功能点分享开关 diff --git a/online.md b/online.md deleted file mode 100644 index c1ee058..0000000 --- a/online.md +++ /dev/null @@ -1,165 +0,0 @@ - -# 配置参数模块 - ------- - -#### **简介** - -在线配置参数是噗嗤游戏开放的一个新模块功能,可以让开发者在后台【配置参数】栏中动态修改游戏使用的参数值。例如:动态修改游戏的数值,小到一个简单开关0/1切换、一个简单的数字配置;大到一个游戏json配置等。 - -该模块借鉴了[友盟在线配置参数](http://www.it610.com/article/4896789.htm)的设计思路。 - - - -#### **后台使用** - -设置在线配置参数,登录后台->头部tab切换到【游戏数据】->【配置相关】->【配置参数】可新增、编辑修改参数值,配置完毕后,通过online模块相关的api使用: - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_021.png "🔍点击查看大图") - - - -#### **接入API:** - -| **名称** | **功能说明** | -| ------------------------------- | ------------------------------------------------------------ | -| PCSDK.online.updateOnlineConfig | 拉取后台配置的配置参数数据,可代码中手动调用,也可以通过config.js中配置SDK主动拉取,注意:使用前请详细[阅读config.js的IsOnlineAutoUse和IsOnlineDebug参数详解](install.md#config_env) | -| PCSDK.online.getParamsInt | 根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数 | -| PCSDK.online.getParamsObj | 根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象 | -| PCSDK.online.getParamsString | 根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串 | - - - -1. ##### **updateOnlineConfig** - - ```javascript - PCSDK.online.updateOnlineConfig(): Promise - ``` - - 定义:拉取后台配置的配置参数数据, - - 提示: - - > [config.js中配置IsOnlineAutoUse](install.md#config_env)为true:SDK启动时会自动去拉取在线配置参数,开发者不需要调用此接口,不然会导致重复拉取 - > - > [config.js中配置IsOnlineAutoUse](install.md#config_env)为false:有两种理解方式:1)不接入使用在线配置参数模块;2)接入使用在线配置参数模块,开发者自己手动调用updateOnlineConfig api处理逻辑。 - > - > 下面示例会演示两种不同配置的使用范例: - - 参数: - - ``` - 无 - ``` - - 返回值: - - ``` - Promise - ``` - -
- - 示例1:config.js配置IsOnlineAutoUse为false,开发者调用updateOnlineConfig api手动拉取在线配置参数数据 - - ```javascript - // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关 - PCSDK.online.updateOnlineConfig().then(() => { - // 使用1:获取是否后台动态配置开启插屏广告,1为开启,0为关闭 - let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; - // isInterstitialAd && '显示插屏广告'; - - // 使用2:获取动态多个广告位开启的配置 - let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); - // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位'; - // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位'; - // pcGameOpenMap.Cross === 1 && '显示交叉推广位'; - - // 使用3:获取签到配置 - let signRewardCfg = PCSDK.online.getParamsObj('sign_reward_cfg', [100, 300, 500, 700, 900, 2000, 3000]); - - // 使用4:获取动态bannerUid - let bannerUid = PCSDK.online.getParamsString('banner_common_uid', 'adunit-fe38438f074c717f'); - // bannerUid && '显示banner'; - }); - ``` - - 示例2:config.js配置IsOnlineAutoUse为true,SDK启动时会自动调用 updateOnlineConfig api拉取在线配置参数数据 - - ```javascript - let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; - let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); - ``` - - - -2. ##### **getParamsInt** - - ```javascript - PCSDK.online.getParamsInt( key: string, defaultVal?: number ): number - ``` - - 定义:根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数 - - 参数: - - ```javascript - key: string 必传 后台 ->【配置参数】配置的key - defaultVal: number 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值 - ``` - - 返回值: - - ``` - number - ``` - - 示例:[查看上面的示例代码](online.md#sample) - -3. **getParamsObj** - - ```javascript - PCSDK.online.getParamsObj( key: string, defaultVal?: any ): any - ``` - - 定义:根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象 - - 参数: - - ```javascript - key: string 必传 后台 ->【配置参数】配置的key - defaultVal: any 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值 - ``` - - 返回值: - - ``` - object | array | null - ``` - - 示例:[查看上面的示例代码](online.md#sample) - -1. **getParamsString** - - ```javascript - PCSDK.online.getParamsString( key: string, defaultVal?: string ): string - ``` - - 定义:根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串 - - 参数: - - ```javascript - key: string 必传 后台 ->【配置参数】配置的key - defaultVal: string 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值 - ``` - - 返回值: - - ``` - string - ``` - - 示例:[查看上面的示例代码](online.md#sample) - - \ No newline at end of file diff --git a/outer/.gitignore b/outer/.gitignore new file mode 100644 index 0000000..b9be865 --- /dev/null +++ b/outer/.gitignore @@ -0,0 +1,64 @@ +# Node rules: +## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +## Dependency directory +## Commenting this out is preferred by some people, see +## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git +node_modules +node_modules/ +node_modules/**/* + +# Book build output +_book + +# eBook build output +*.epub +*.mobi +*.pdf +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties diff --git a/outer/README.md b/outer/README.md new file mode 100644 index 0000000..5dea247 --- /dev/null +++ b/outer/README.md @@ -0,0 +1,56 @@ +# 噗嗤SDK +PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。 +PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。 + +**PCSDK提供的模块功能:** + +- [统计模块](stat.md) +- [分享视频模块](share.md) +- [配置参数模块️](online.md) +- [多平台接口模块](platform.md) +- [数据模块](data.md) +- [事件模块](event.md) + + + +# 噗嗤管理后台 +噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。 + +噗嗤管理后台地址: + +- https://data.d3games.com/#/login + +**友情提示:** + +- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。** +- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。** +- **登录后台即可使用后台提供的各项服务** + + + +**后台概览:** +## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图") + + + +**后台提供数据分析功能(不能跳转请联系管理员添加权限):** + +- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart) +- [分享数据分析](https://data.d3games.com/index.html#/share_exact) +- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list) +- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list) + + + +**后台提供配置相关功能(不能跳转请联系管理员添加权限):** + +- [分享/视频配置](https://data.d3games.com/index.html#/share_list) +- [配置参数](https://data.d3games.com/index.html#/config_list) + + +# 更多: +- 快速接入,请详读 [安装步骤](install.md) + + + +- 遇到问题可以查看 [FAQ](faq.md) \ No newline at end of file diff --git a/outer/SUMMARY.md b/outer/SUMMARY.md new file mode 100644 index 0000000..5f8447c --- /dev/null +++ b/outer/SUMMARY.md @@ -0,0 +1,28 @@ +# Summary +## SDK入门 +* [SDK简介](intro.md) +* [SDK下载](download.md) +* [安装步骤️️️️](install.md) + +## SDK手册 +* [模块概览](modules.md) + +* [统计模块](stat.md) + * [启动注册打点️](stat_active.md) + * [关卡分析打点️️](stat_level.md) + * [支付结果打点](stat_pay.md) + * [自定义事件打点](stat_event.md) + * [交叉推广位](stat_ads.md) +* [分享视频模块](share.md) +* [配置参数模块️](online.md) +* [多平台接口模块](platform.md) + * [打开客服消息](platform.md#service) + * [检测自动更新](platform.md#checkUpdate) + * [复制文本内容](platform.md#copy) + * [震动接口](platform.md#vibrate) + * [小游戏推荐弹窗组件GamePortal](platform.md#gamePortal) + * [小游戏插屏广告组件InterstitialAd](platform.md#interstitialAd) + * [小游戏推荐icon组件GameIcon](platform.md#gameicon) +* [数据模块](data.md) +* [事件模块](event.md) +* [FAQ❎](faq.md) \ No newline at end of file diff --git a/outer/book.json b/outer/book.json new file mode 100644 index 0000000..5b8b71e --- /dev/null +++ b/outer/book.json @@ -0,0 +1,69 @@ +{ + "title": "噗嗤游戏使用文档", + "description": "记录 GitBook 的配置和一些插件的使用", + "author": "zhangjikai", + "output.name": "site", + "language": "zh-hans", + "gitbook": "3.2.3", + "root": ".", + "plugins": [ + "-lunr", + "-search", + "-sharing", + "-highlight", + "-livereload", + "emphasize", + "simple-page-toc@^0.1.1", + "prism", + "prism-themes", + "include-codeblock@^3.0.2", + "splitter@^0.0.8", + "tbfed-pagefooter@^0.0.1", + "expandable-chapters-small@^0.1.7", + "sectionx@^3.1.0", + "local-video@^1.0.1", + "anchor-navigation-ex", + "todo@^0.1.3", + "popup", + "lightbox", + "versions-select@^0.1.1", + "copy-code-button" + ], + "structure": { + "readme": "README.md" + }, + "styles": { + "website": "styles/website.css" + }, + "pluginsConfig": { + "versions": { + "options": [ + { + "value": "http://dep.miso-lab.com/sdkword/web/v1.0/intro.html", + "text": "外部游戏-v1.0.0.3" + }, + { + "value": "http://dep.miso-lab.com/sdkword/web/v2.0/intro.html", + "text": "内部游戏-v1.0.0.3" + } + ] + }, + "prism": { + "css": [ + "prism-themes/themes/prism-base16-ateliersulphurpool.light.css" + ] + }, + "anchor-navigation-ex": { + "associatedWithSummary": false, + "showLevel": true, + "multipleH1": true, + "mode": "float", + "pageTop": { + "showLevelIcon": false, + "level1Icon": "fa fa-hand-o-right", + "level2Icon": "fa fa-hand-o-right", + "level3Icon": "fa fa-hand-o-right" + } + } + } +} \ No newline at end of file diff --git a/outer/data.md b/outer/data.md new file mode 100644 index 0000000..26e7b8b --- /dev/null +++ b/outer/data.md @@ -0,0 +1,226 @@ + +# 数据模块 + +------ + +#### **简介** + +此模块为开发者提供游戏用到的一些数据信息,例如:config.js配置的GameId,ChannelId、从分享链接进入query携带的参数(share_id/share_key/user_invite_uid/channel_id)、setLogind设置的用户ID(userId)和用户注册时间(regTime)等等,详细请阅读下面的api。 + + + +#### **API:** + +| **名称** | **功能说明** | +| ------------------------------- | ------------------------------------------------------------ | +| PCSDK.data.GameId | 获取游戏的GameId,来源于config.js配置的GameId | +| PCSDK.data.ChannelId| 获取游戏渠道ID,来源于config.js配置的ChannelId | +| PCSDK.data.UserId | 获取用户ID,setLoginInfo传递的openId的值| +| PCSDK.data.RegTime | 获取用户注册时间,setLoginInfo传递的regTime的值 | +| PCSDK.data.ShareId | 获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0 | +| PCSDK.data.ShareKey | 接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key | +| PCSDK.data.Platform | 获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) | +| PCSDK.data.SystemId | 获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备) | +| PCSDK.data.QueryUserInviteUid | 获取此次分享会话进入游戏,分享来源者用户ID | +| PCSDK.data.IsCross | 获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏 | +| PCSDK.data.IsDrawer | 获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏 | +| PCSDK.data.IsGuessLike | 获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏 | + + + +1. ##### **GameId** + + ```javascript + PCSDK.data.GameId: number + ``` + + 定义:获取游戏的GameId,该值来源于congfig.js中的【GameId】配置。详细[阅读config.js的GameId参数详解](install.md#config_env) + + 示例: + + ```javascript + let gameId = PCSDK.data.GameId; + ``` +2. ##### **ChannelId** + + ```javascript + PCSDK.data.ChannelId: number + ``` + + 定义:获取游戏的渠道Id,该值来源于congfig.js中的【ChannelId】配置。详细[阅读config.js的ChannelId参数详解](install.md#config_env) + + 示例: + + ```javascript + let channelId = PCSDK.data.ChannelId; + ``` +3. ##### **UserId** + + ```javascript + PCSDK.data.UserId: number | string + ``` + + 定义:获取用户ID,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的openId + + 示例: + + ```javascript + let userId = PCSDK.data.UserId; + ``` +4. ##### **RegTime** + + ```javascript + PCSDK.data.RegTime: number + ``` + + 定义:获取用户第一次创角的时间戳,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的regTime + + 示例: + + ```javascript + let regTime = PCSDK.data.RegTime; + ``` +5. ##### **ShareId** + + ```javascript + PCSDK.data.ShareId: number + ``` + + 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_id参数,从分享会话点入游戏,获取此次分享会话的shareId,不是从分享会话点入游戏ShareId为0 + + 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍") + + ```javascript + // shareId的值为:680 + let shareId = PCSDK.data.ShareId; + ``` +6. ##### **ShareKey** + + ```javascript + PCSDK.data.ShareKey: string + ``` + + 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_key参数,从分享会话点入游戏,获取此次分享会话的shareKey,不是从分享会话点入游戏ShareKey为'' + + 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍") + + ```javascript + // shareKey的值为:success_double + let shareKey = PCSDK.data.ShareKey; + ``` +7. ##### **Platform** + + ```javascript + PCSDK.data.Platform: string + ``` + + 定义:获取游戏运行平台环境:devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) + + 示例: + + ```javascript + let platform = PCSDK.data.Platform; + switch (platform) { + case 'devtools': // 开发者工具 + + break; + + case 'ios': // 苹果设备 + + break; + + case 'android': // 安卓设备 + + break; + } + ``` +8. ##### **SystemId** + + ```javascript + PCSDK.data.SystemId: number + ``` + + 定义:获取游戏运行平台环境:0(开发者调试工具或ios)、1(安卓设备) + + 示例: + + ```javascript + let systemId = PCSDK.data.SystemId; + switch (systemId) { + case 0: // 开发者工具 or 苹果设备 + + break; + + case 1: // 安卓设备 + + break; + } + ``` +9. ##### **QueryUserInviteUid** + + ```javascript + PCSDK.data.QueryUserInviteUid: any + ``` + + 定义:获取此次分享会话进入游戏,分享来源者用户userId + + 接入SDK的分享视频模块,分享出去的链接query会携带invite_user_uid参数,从分享会话点入游戏,获取此次分享会话的邀请者id: invite_user_uid,不是从分享会话点入游戏QueryUserInviteUid为0。 + >>>开发者不接入SDK分享视频模块,游戏分享url的query参数必须要加入以下两个参数channel_id与user_invite_uid:channel_id的值通过ChannelId api获取,user_invite_uid的值可通过UserId api获取,也可以开发者从游戏中得到。 + >>>每次分享query请携带: + ```javascript + `channel_id=${ PCSDK.data.ChannelId }&user_invite_uid=${ PCSDK.data.UserId }` + ``` + + 示例: + + ```javascript + // 从分享会话邀请链接进入,获得的值为邀请者用户id,不是分享会话邀请进入获取值为0 + let inviteUid = PCSDK.data.QueryUserInviteUid; + ``` +10. ##### **IsCross**
+ + ```javascript + PCSDK.data.IsCross: boolean + ``` + + 定义:获取是否显示/隐藏交叉悬浮框推广位,true:显示,false:隐藏 + + 示例:获取是否显示交叉悬浮框推广位 + + ```javascript + // 设置交叉悬浮框推广位ui的显示隐藏 + let isShow = PCSDK.data.IsCross; + this.uiCross.visible = isShow; + ``` +11. ##### **IsDrawer** + + ```javascript + PCSDK.data.IsDrawer: boolean + ``` + + 定义:获取是否显示/隐藏交叉抽屉推广位,true:显示,false:隐藏 + + 示例: + + ```javascript + // 设置交叉抽屉推广位ui的显示隐藏 + let isShow = PCSDK.data.IsDrawer; + this.uiDrawer.visible = isShow; + ``` +12. ##### **IsGuessLike** + + ```javascript + PCSDK.data.IsGuessLike: boolean + ``` + + 定义:获取是否显示/隐藏交叉猜你喜欢推广位,true:显示,false:隐藏 + + 示例: + + ```javascript + // 设置交叉猜你喜欢推广位ui的显示隐藏 + let isShow = PCSDK.data.IsGuessLike; + this.uiGuessLike.visible = isShow; + ``` \ No newline at end of file diff --git a/outer/download.md b/outer/download.md new file mode 100644 index 0000000..0004689 --- /dev/null +++ b/outer/download.md @@ -0,0 +1,61 @@ +# SDK下载 + +------ + +## [v1.0.0.3 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.3.zip) + +> *发布时间*:2019.09.18 + +**新增:** + +1. 移除掉stat模块的onlineTimeLen和logout api。 +2. 微信小游戏引入GameIcon、GameBanner、GamePortal组件。 +3. config.js添加积分投放IntegralChannelId参数,用于积分投放渠道统计。 + +## [v1.0.0.2 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.2.zip) + +> *发布时间*:2019.09.11 + +**修复:** + +1. 修复外部游戏设置openId导致userId为0的问题:外部游戏openId替换userId。 + +**新增:** + +1. 外部游戏修改setLogind接口为setLoginInfo( { openId: strinng , retTime: number } )。 +2. loadingFinish传递isActive参数,isActive为true SDK在loadingFinish结束后自动调用active。 + +## [v1.0.0.1 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.1.zip) + +> *发布时间*:2019.09.04 + +**修复:** + +1. 修复外部游戏stat launch api调用时序问题导致参数传递异常 + +**新增:** + +1. config.js配置ShareData新增share_wxad_id参数:视频广告uid,配置此参数,推送看视频,不配置或者配置的uid无效则推送分享。 +2. stat模块的addLogLevel拆分为多个接口:logLevelRelive、logLevelWin、logLevelFail、logLevelHide,addLogLevel继续保留。 +3. data模块新增了三个控制交叉推广位动态控制显示/隐藏的api:IsCross、IsDrawer、IsGuessLike。 +4. share模块重新命名为:shareVideo,shareDispatch修改为dispatch、shareWithType修改为dispatchType、getShareType修改为getShareVideoType,原来的share模块还是能用。 + + +## [v1.0.0.0 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.0.zip) + +> *发布时间*:2019.08.31 + +**修复:** + +1. SDK外部版本不需要接入方调用stat 模块launch接口,SDK启动时候自动调用。 +2. QQ轻游戏分享不成功回调的问题。 +3. QQ轻游戏banner广告不贴底部的问题。 + +**新增:** + +1. config.js配置新增IsOnlineAutoUse、IsOnlineDebug、ShareRightKey配置参数。 + + 在线参数获取通过配置决定是否启动拉取,右上角分享配置进行读取shareKey。 + +2. SDK分享模块不区分内部还是外部游戏,都引入分享/视频模块功能。 + diff --git a/outer/event.md b/outer/event.md new file mode 100644 index 0000000..220605f --- /dev/null +++ b/outer/event.md @@ -0,0 +1,275 @@ +# 事件模块 +事件是一种观察者的设计模式,对象可以发布事件,然后其它对象可以观察该对象,等待这些时刻到来并通过运行代码来响应。 + +事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。 + +开发者游戏项目和PCSDK属于两个不同的模块,PCSDK会在SDK内部处理一些业务,想要把这些处理结果告知开发者,那么自定义事件就派上用场了,SDK封装了一个event模块:PCSDK.event,开发者可使用这个模块接收SDK内部派发的消息,也可以应用在游戏中不同模块中通信的情况。 + +PCSDK内部派发了以下几个内部消息,开发者可根据实际功能需要使用PCSDK.event api监听这些消息: + +> 1、app.show:多平台的onShow事件消息,例如微信小游戏、QQ轻游戏的onShow事件。使用方式: +> +> **PCSDK.event.add( 'app.show' , 处理此消息的事件函数, 事件函数上下文)** + +> 2、app.hide: 多平台的onHide事件消息,例如微信小游戏、QQ轻游戏的onHide事件。使用方式: +> +> **PCSDK.event.add( 'app.hide' , 处理此消息的事件函数, 事件函数上下文)** + +> 3、tactic.update:推送策略更新事件消息,接入[分享视频模块(shareVideo)](share.md)后,某个功能点当前分享/视频完成后,下一次推送策略类型会通过这个消息发送处理,开发者监听这个消息,可处理游戏页面上的ui展示(如:视频分享icon、视频分享文案等),[查看完整示例](share.md#detail)。使用方式: +> +> **PCSDK.event.add( 'tactic.update' , 处理此消息的事件函数, 事件函数上下文)** + + +#### **接入API**: + +| **名称** | **功能说明** | +| ---------------- | ------------------------------------------------------------ | +| PCSDK.event.add | 添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文 | +| PCSDK.event.once | 添加一个事件监听,执行一次后会自动移除此事件监听 | +| PCSDK.event.emit | 触发事件监听:执行所绑定的事件类型对应的触发函数 | +| PCSDK.event.remove | 移除事件监听:移除添加的事件类型的触发函数 | +| PCSDK.event.removeAll | 移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 | + +1. **add** + ```javascript + PCSDK.event.add( evt_name: string, listener: Function, context: any ): PCSDK.event + ``` + + 定义:添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文。与之对应的是移除事件监听:PCSDK.event.remove:页面销毁或者关闭的时候移除监听 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + + listener: Function 必传 触发函数func,事件处理监听函数 + + context: any 必传 触发函数func执行上下文 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.add('update.money', () => { }, this ) + .add('update.exp', () => { }, this ); + ``` +
+ 示例:游戏中进入Home场景监听金币更新函数,更新金币ui界面的值,关闭Home场景时,移除金币更新函数。 + + ```javascript + export default class HomeScene extends BaseView{ + protected addEvent() { + super.addEvent(); + // 添加注册金币更新事件监听 + PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + protected removeEvent() { + super.removeEvent(); + // 移除注册金币更新事件监听 + PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + /** + * 更新金币ui + */ + private handleUpdateMoney( money: number ){ + this.txtCoin.text = `${money}`; + } + } + + /** + * event事件枚举 + */ + export enum EventEnum{ + UPDATE_MONEY = 'update.money' + } + ``` +2. **once** + ```javascript + PCSDK.event.once( evt_name: string, listener: Function, context?: any ): PCSDK.event + ``` + + 定义:添加一个事件监听,执行一次后会自动移除此事件监听 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + + listener: Function 必传 触发函数func,事件处理监听函数 + + context: any 必传 触发函数func执行上下文 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.once('update.money', () => { }, this ) + .once('update.exp', () => { }, this ); + ``` + + 示例:游戏中进入Home场景监听金币更新函数一次,该函数执行完一次后会自动移除该监听事件函数。 + + ```javascript + export default class HomeScene extends BaseView{ + protected open(){ + super.open(); + // 添加一次注册金币更新事件监听,该事件监听执行一次后,自动移除 + PCSDK.event.once(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + /** + * 更新金币ui + */ + private handleUpdateMoney( money: number ){ + this.txtCoin.text = `${money}`; + } + } + + /** + * event事件枚举 + */ + export enum EventEnum{ + UPDATE_MONEY = 'update.money' + } + ``` +3. **emit** + ```javascript + PCSDK.event.emit( evt_name: string, ...args: any[] ): PCSDK.event + ``` + + 定义:派发事件监听消息:执行所绑定的事件类型对应的触发函数,可以传递一些触发函数需要的其他任意参数 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + + args: any[] 选传 触发函数需要的其他任意参数 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.emit('update.money', 10000) + .emit('update.exp', 2, 1000 ); + ``` + + 示例:游戏中金币领取奖励弹出框,点击领奖后派发金币更新的消息 + + ```javascript + // RewardCoinPopwin弹出框领奖励后,派发update.money消息 + export default class RewardCoinPopwin extends BaseView{ + private rewardCoin: number; + + protected open(){ + super.open(); + this.rewardCoin = 10000000; + } + + protected addEvent() { + super.addEvent(); + this.btnReward.on(Laya.Event.CLICK, this, this.onReward); + } + + protected removeEvent() { + super.removeEvent(); + this.btnReward.off(Laya.Event.CLICK, this, this.onReward); + } + + /** + * 金币领取奖励 + */ + private onReward(ev: Laya.Event){ + // 派发金币更新的消息,并把添加的金币传递 + PCSDK.event.emit(EventEnum.UPDATE_MONEY, this.rewardCoin ); + } + } + + // HomeScene监听update.money消息,处理加金币操作 + export default class HomeScene extends BaseView{ + protected addEvent() { + super.addEvent(); + // 添加注册金币更新事件监听 + PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + protected removeEvent() { + super.removeEvent(); + // 移除注册金币更新事件监听 + PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this); + } + + /** + * 更新金币ui + */ + private handleUpdateMoney( addMoney: number ){ + this.txtAddCoin.text = `${addMoney}`; + } + } + + /** + * event事件枚举 + */ + export enum EventEnum{ + UPDATE_MONEY = 'update.money' + } + ``` + +4. **remove** + ```javascript + PCSDK.event.remove( evt_name: string, listener: Function, context?: any ): PCSDK.event + ``` + + 定义:移除事件监听:移除添加的事件类型的触发函数。 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + + listener: Function 必传 触发函数func,事件处理监听函数 + + context: any 必传 触发函数func执行上下文 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.remove('update.money', () => { }, this ) + .remove('update.exp', () => { }, this ); + ``` + + 示例:[见上例](event.md#event_add) + +5. **removeAll** + ```javascript + PCSDK.event.removeAll( evt_name: string ): PCSDK.event + ``` + + 定义:移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 + + 参数: + + ```javascript + evt_name: string 必传 事件类型名称 + ``` + 返回值: + + ```javascript + PCSDK.event + 返回的是event对象,方便链式调用, 例如: + PCSDK.event.removeAll('update.money') + .removeAll('update.exp'); + ``` + + 示例: + + 移除游戏中所有update.money事件监听:PCSDK.event.removeAll('update.money'); + + 移除游戏中所有update.exp事件监听:PCSDK.event.removeAll('update.exp'); diff --git a/outer/faq.md b/outer/faq.md new file mode 100644 index 0000000..53425fe --- /dev/null +++ b/outer/faq.md @@ -0,0 +1,174 @@ +# FAQ + +------ + +#### **简介** + +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 + + + +#### **后台使用** + +完成启动注册打点后,登录后台->头部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/outer/install.md b/outer/install.md new file mode 100644 index 0000000..915d4e6 --- /dev/null +++ b/outer/install.md @@ -0,0 +1,218 @@ +# 安装步骤 + +------ + +## SDK下载 + +1. 下载最新版本的SDK [SDK下载](download.md) 。 +2. 解压下载的sdk-in-v{版本号}.zip包,解压文件夹里面的的目录结构: + +``` +├── sdk.d.ts +├── sdk/ +| ├── config.js +| └── entry.js +| └── libs/ + | └── game.min.js +``` + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_001.png "🔍点击查看大图") + +- **sdk.d.ts:sdk的ts声明文件,开发者项目采用Typescript开发,请复制该文件到项目中。** +- sdk/config.js:sdk配置文件,【[详细请阅读下方config.js参数说明](install.md#config)】 +- sdk/entry.js:sdk入口文件,引入了sdk所提供的模块功能 +- sdk/libs/game.min.js:sdk类库核心代码文件 + + + +## 配置合法域名 + +* ##### 管理员或开发者身份在微信小程序后台→设置→开发者设置中添加 request、download合法域名 + 正式环境 request 合法域名: + + https://dataapi.d3games.com (统计平台正式服域名) + + cdn资源请求合法域名: + + https://dep.miso-lab.com (>>>request、download均要添加<<<) + + + + + +​ +## SDK配置步骤 + +* #### 将下载下来的sdk压缩包,解压后,拷贝sdk文件夹到微信开发者工具项目中。 + + 示例:将sdk放入到小游戏开发者工具项目的src文件夹中 + + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_002.png "🔍点击查看大图") + + + + + +* #### 在game.js中将sdk.js文件使用require导入。 + + 示例:将sdk放入到小游戏开发者工具项目的src文件夹中 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_003.png "🔍点击查看大图") + + + +* #### 根据运营提供的信息修改sdk文件夹下的**config**.js文件(可横向拖动查看查看更多====>)
+
+ ```javascript + export default { + IsDebug: false, // 是否debug模式,debug模式会打印log,可使用stat模块setDebug api进行修改 + AdCacheDuration: 30, // 广告列表缓存持续时间间隔 + IsUseShareModule: true, // 是否使用分享模块 + IsOnlineAutoUse: true, // 是否开启sdk自动请求online模块(在线参数配置)的updateOnlineConfig,拉取在线参数配置 + IsOnlineDebug: true, // 是否开启online模块(配置参数模块)debug模式 + ShareRightKey: 'forward', // 右上角分享的shareKey,shareKey请阅读share模块说明,默认为forward,为空字符串则不使用右上角分享 + + ShareData: { // 必填,默认分享数据(拉取不到分享配置后使用,默认分享,SDK自动分配share_id为99999) + share_desc: 'xxx', + share_wxad_id: '', // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享 + share_icon: 'xxx' + }, + GameId: 0, // 必填,游戏ID,运营提供; + ChannelId: 0, // 必填,游戏渠道ID,运营提供; + IntegralChannelId: 0, // 必填,积分投放渠道ID,运营提供; + Secret: '***请配置你的Secret***', // 必填,游戏的secret key + MidasPay: { // 米大师虚拟支付配置 + OfferId: "0", // 在米大师申请的应用id + ZoneId: "1", // 分区ID,默认:1 + Mode: "game", // 支付的类型,不同的支付类型有各自额外要传的附加参数,默认:game + CurrencyType: "CNY", // 币种,默认:CNY + Platform: '' // 申请接入时的平台,platform与OfferId(米大师申请的应用id)有关,详情请阅读文档config.js参数MidasPay下的Platform配置 + } + }; +``` + + +参数详解: + +
+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启动时拉取后台配置的分享/视频列表,运营或者开发者登录后台后,配置分享/视频,开发者请详看分享视频模块接入。 + +5. **IsOnlineAutoUse( boolean ):**是否启用在线配置参数模块功能 + + false:两种处理 1)不启用在线配置参数模块功能; 2)启用在线配置参数功能,但是SDK启动时不自动调用updateOnlineConfig拉取后台配置参数列表,开发者在代码主动调用拉取在线配置参数:PCSDK.online.updateOnlineConfig(); + + 示例:开发者代码中主动拉取在线配置参数。 + + ```javascript + // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关 + PCSDK.online.updateOnlineConfig().then(() => { + // 获取是否后台动态配置开启插屏广告,1为开启,0为关闭 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; + // isInterstitialAd && '显示插屏广告'; + // 获取动态多个广告位开启的配置 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); + // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位'; + // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位'; + // pcGameOpenMap.Cross === 1 && '显示交叉推广位'; + }); + ``` + true:sdk启动时自动调用updateOnlineConfig拉取后台在线配置参数列表,开发者可通过 + + PCSDK.online.getParamsObj、PCSDK.online.getParamsInt、PCSDK.online.getParamsString、PCSDK.online.getParams api传递后台配置参数key获取在线配置参数。 + + 示例:IsOnlineAutoUse: true,开发者可使用下面api获取在线配置参数配置的值 + + ```javascript + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); + ``` + +6. **IsOnlineDebug( boolean ):**是否启用online模块(在线配置参数)debug模式,建议设置为true。 + + false:不启动debug模式,开发者主动调用updateOnlineConfig或者SDK启动时调用updateOnlineConfig都会把在线配置参数列表设置10分钟缓存,不用每次都去服务器请求,参照了友盟在线参数功能的设计 + + true: 开启debug模式,只要是请求updateOnlineConfig api都会立即发起请求,而不是去检测读取缓存 + +7. **ShareRightKey( string ):**右上角分享的shareKey,shareKey请阅读分享视频模块,默认为forward,为空字符串则不使用右上角分享,此配置在配置【IsUseShareModule: true】情况下生效。 + + 示例: + + 在后台的【分享/视频配置】栏目配置了一条分享key为:forward的分享配置 + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_004.png "🔍点击查看大图") + +8. **ShareData( object ):**此配置在【IsUseShareModule: true】起效,开发者如果接入了分享视频模块,>>> 请务必配置一条 <<<。 + + > IsUseShareModule设置true sdk启动拉取分享视频配置列表,如果分享视频列表拉取请求失败,或此shareKey不在分享视频配置列表中(登录后台 ->【游戏数据】->【分享/视频配置】栏没有配置分享key)就会使用此条设置的数据。 + + 示例:可从后台【游戏数据】->【分享/视频配置】中选取一条:复制文案,点击分享素材icon -> 查看大图 -> 右键查看分享图片的html源码复制src图片地址: + + ```json + { + // 分享文案内容 + share_desc: ' 半夜传来啪啪啪!竟是隔壁老王偷偷打气球', + // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享 + share_wxad_id: 'adunit-6958dcfc3f0bed31', + // 分享图 + share_icon: 'https://dep.miso-lab.com/data_analysis/games/res/5D57D4A3Yx.png' + } + ``` + + 操作步骤: + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_005.png "🔍点击查看大图") + +9. **GameId:必填,游戏id,请联系运营人员提供** + +10. **ChannelId:必填,游戏渠道id,请联系运营人员提供** + +11. **IntegralChannelId:必填,积分投放渠道ID,运营提供** + +12. **Secret:必填,游戏 Secret Key,请联系运营人员提供** + +13. **MidasPay( object ):**米大师虚拟支付配置,请注意下面规则 + + OfferId:在米大师申请的应用id,没有接入米大师(比如第三方支付),默认为"0" + + ZoneId:分区ID,默认:"1" + + Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game" + + CurrencyType:币种,默认:"CNY" + + Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。 + + 1)接入了米大师,填写"android"(ios暂时没有开放) + + 2)未接入米大师,使用其他支付,如果只支持android,则填写"android"; + + 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios"; + + 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios + + + +* #### 如果项目使用Typescript语言开发,请引入解压文件夹下的sdk.d.ts文件到项目中。 + + 示例:项目采用的是Laya Typescript版本进行开发,将该文件复制到libs目录下面 + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_007.png "🔍点击查看大图") + +* #### 到此,SDK的准备工作已经配置完毕,运行起来: + + 运行中碰到问题,[[请查看FAQ](faq.md)],或者微信群联系相关人员。 + + 正常运行,阅读SDK手册,开始[[SDK模块功能](modules.md)]接入。 \ No newline at end of file diff --git a/outer/intro.md b/outer/intro.md new file mode 100644 index 0000000..84e8e28 --- /dev/null +++ b/outer/intro.md @@ -0,0 +1,56 @@ +# 噗嗤SDK +PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。 +PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。 + +**PCSDK提供的模块功能:** + +- [统计模块](stat.md) +- [分享视频模块](share.md) +- [配置参数模块️](online.md) +- [多平台接口模块](platform.md) +- [数据模块](data.md) +- [事件模块](event.md) + + + +# 噗嗤管理后台 +噗嗤管理后台对sdk中上报的各项数据进行分析,管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。 + +噗嗤管理后台地址: + +- https://data.d3games.com/#/login + +**友情提示:** + +- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。** +- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。** +- **登录后台即可使用后台提供的各项服务** + + + +**后台概览:** +## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图") + + + +**后台提供数据分析功能(不能跳转请联系管理员添加权限):** + +- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart) +- [分享数据分析](https://data.d3games.com/index.html#/share_exact) +- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list) +- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list) + + + +**后台提供配置相关功能(不能跳转请联系管理员添加权限):** + +- [分享/视频配置](https://data.d3games.com/index.html#/share_list) +- [配置参数](https://data.d3games.com/index.html#/config_list) + + +# 更多: +- 快速接入,请详读 [安装步骤](install.md) + + + +- 遇到问题可以查看 [FAQ](faq.md) \ No newline at end of file diff --git a/outer/modules.md b/outer/modules.md new file mode 100644 index 0000000..f4a8dbd --- /dev/null +++ b/outer/modules.md @@ -0,0 +1,87 @@ +# 模块概览 +下图是PCSDK的概要思维导图,SDK所提供的所有功能都在下图列出(点击查看大图): + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_000.png "🔍点击查看大图") + + +[统计模块:stat](stat.md) + + 启动注册打点 + + setLoginInfo:设置登录信息 + + loadingFinish:资源加载完成 + + active:添加注册活跃用户 + + 关卡分析打点 + + logLevelRelive:游戏关卡复活上报 + + logLevelHide:游戏关卡页onHide上报 + + logLevelFail:游戏关卡失败上报 + + logLevelWin:游戏关卡成功上报 + + logMerge:游戏2合1合成最高等级上报 + + 交叉推广位:悬浮框、抽屉式、猜你喜欢 + + bannerList:获取对应类型交叉推广位列表 + + bannerNavigateTo:点击跳转到对应appid的游戏 + + addExposure:交叉推广位一条或者多条广告展示,添加曝光数据 + + 自定义事件 + + event:自定义打点事件 + +[数据模块:data](data.md) + + GameId:获取游戏的GameId,来源于config.js配置的GameId + + ChannelId:获取游戏渠道ID,来源于config.js配置的ChannelId + + UserId:获取用户ID,来源于setLoginInfo传递的openId的值 + + RegTime:获取用户注册时间,来源于setLoginInfo传递的regTime的值 + + ShareId:获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0。需接shareVideo模块 + + ShareKey:接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key + + Platform:获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) + + SystemId:获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备) + + QueryUserInviteUid:获取此次分享会话进入游戏,分享来源者用户ID,来源query的参数invite_user_uid + + IsCross:获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏 + + IsDrawer:获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏 + + IsGuessLike:获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏 + +[配置参数模块:online](online.md) + + updateOnlineConfig:拉取后台配置的配置参数数据,可代码中手动调用,也可SDK自动拉取 + + getParamsInt:根据在线参数key获取number类型参数值 + + getParamsObj:根据在线参数key获取object类型参数值 + + getParamsString:根据在线参数key获取string类型参数值 + +事件模块:event + +多平台接口模块:platform + +[分享视频模块:shareVideo](share.md) + + share:普通分享,不需要处理回调的场景 + + dispatch:分享视频分发入口,传入功能点英文命名的分享/视频key + + getShareVideoType:根据功能点在后台配置的分享/视频key,得到此功能点分享开关 diff --git a/outer/online.md b/outer/online.md new file mode 100644 index 0000000..c1ee058 --- /dev/null +++ b/outer/online.md @@ -0,0 +1,165 @@ + +# 配置参数模块 + +------ + +#### **简介** + +在线配置参数是噗嗤游戏开放的一个新模块功能,可以让开发者在后台【配置参数】栏中动态修改游戏使用的参数值。例如:动态修改游戏的数值,小到一个简单开关0/1切换、一个简单的数字配置;大到一个游戏json配置等。 + +该模块借鉴了[友盟在线配置参数](http://www.it610.com/article/4896789.htm)的设计思路。 + + + +#### **后台使用** + +设置在线配置参数,登录后台->头部tab切换到【游戏数据】->【配置相关】->【配置参数】可新增、编辑修改参数值,配置完毕后,通过online模块相关的api使用: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_021.png "🔍点击查看大图") + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------------- | ------------------------------------------------------------ | +| PCSDK.online.updateOnlineConfig | 拉取后台配置的配置参数数据,可代码中手动调用,也可以通过config.js中配置SDK主动拉取,注意:使用前请详细[阅读config.js的IsOnlineAutoUse和IsOnlineDebug参数详解](install.md#config_env) | +| PCSDK.online.getParamsInt | 根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数 | +| PCSDK.online.getParamsObj | 根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象 | +| PCSDK.online.getParamsString | 根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串 | + + + +1. ##### **updateOnlineConfig** + + ```javascript + PCSDK.online.updateOnlineConfig(): Promise + ``` + + 定义:拉取后台配置的配置参数数据, + + 提示: + + > [config.js中配置IsOnlineAutoUse](install.md#config_env)为true:SDK启动时会自动去拉取在线配置参数,开发者不需要调用此接口,不然会导致重复拉取 + > + > [config.js中配置IsOnlineAutoUse](install.md#config_env)为false:有两种理解方式:1)不接入使用在线配置参数模块;2)接入使用在线配置参数模块,开发者自己手动调用updateOnlineConfig api处理逻辑。 + > + > 下面示例会演示两种不同配置的使用范例: + + 参数: + + ``` + 无 + ``` + + 返回值: + + ``` + Promise + ``` + +
+ + 示例1:config.js配置IsOnlineAutoUse为false,开发者调用updateOnlineConfig api手动拉取在线配置参数数据 + + ```javascript + // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关 + PCSDK.online.updateOnlineConfig().then(() => { + // 使用1:获取是否后台动态配置开启插屏广告,1为开启,0为关闭 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; + // isInterstitialAd && '显示插屏广告'; + + // 使用2:获取动态多个广告位开启的配置 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); + // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位'; + // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位'; + // pcGameOpenMap.Cross === 1 && '显示交叉推广位'; + + // 使用3:获取签到配置 + let signRewardCfg = PCSDK.online.getParamsObj('sign_reward_cfg', [100, 300, 500, 700, 900, 2000, 3000]); + + // 使用4:获取动态bannerUid + let bannerUid = PCSDK.online.getParamsString('banner_common_uid', 'adunit-fe38438f074c717f'); + // bannerUid && '显示banner'; + }); + ``` + + 示例2:config.js配置IsOnlineAutoUse为true,SDK启动时会自动调用 updateOnlineConfig api拉取在线配置参数数据 + + ```javascript + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1; + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 }); + ``` + + + +2. ##### **getParamsInt** + + ```javascript + PCSDK.online.getParamsInt( key: string, defaultVal?: number ): number + ``` + + 定义:根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数 + + 参数: + + ```javascript + key: string 必传 后台 ->【配置参数】配置的key + defaultVal: number 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值 + ``` + + 返回值: + + ``` + number + ``` + + 示例:[查看上面的示例代码](online.md#sample) + +3. **getParamsObj** + + ```javascript + PCSDK.online.getParamsObj( key: string, defaultVal?: any ): any + ``` + + 定义:根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象 + + 参数: + + ```javascript + key: string 必传 后台 ->【配置参数】配置的key + defaultVal: any 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值 + ``` + + 返回值: + + ``` + object | array | null + ``` + + 示例:[查看上面的示例代码](online.md#sample) + +1. **getParamsString** + + ```javascript + PCSDK.online.getParamsString( key: string, defaultVal?: string ): string + ``` + + 定义:根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串 + + 参数: + + ```javascript + key: string 必传 后台 ->【配置参数】配置的key + defaultVal: string 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值 + ``` + + 返回值: + + ``` + string + ``` + + 示例:[查看上面的示例代码](online.md#sample) + + \ No newline at end of file diff --git a/outer/platform.md b/outer/platform.md new file mode 100644 index 0000000..65ab0ba --- /dev/null +++ b/outer/platform.md @@ -0,0 +1,577 @@ +# 多平台接口模块:PCSDK.platform + +------ + +#### **简介** + +所谓多平台指的是微信小游戏、QQ轻游戏、今日头条、oppo等游戏发布的平台。微信和QQ接口文档api相似度99%,微信、QQ、今日头条平台的接口api相似度80%以上,虽然相似度很高,但是仍需要针对差异性做一些处理。多平台接口模块就是想要在SDK内部去抹平了各个平台差异性的处理,达到同一个api调用,应用多个平台的作用。 + +#### **此模块是参照微信小游戏提供的api进行封装的公用方法,提供了以下游戏中常用到的功能:** + +2. **打开客服消息:openCustomerServiceConversation** 整理来自[wx.openCustomerServiceConversation](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html) + +3. **检测版本更新:checkUpdate** 整理来自:[wx.getUpdateManager](https://developers.weixin.qq.com/minigame/dev/api/base/update/UpdateManager.html) +4. **显示模态弹出框:showModal** 整理来自:[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html) +5. **复制文本:copy** 整理来自:[wx.setClipboardData](https://developers.weixin.qq.com/minigame/dev/api/device/clipboard/wx.setClipboardData.html) +6. **长震动:vibrateLong** 整理来自:[wx.vibrateLong](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateLong.html) +7. **短震动:vibrateShort** 整理来自:[wx.vibrateShort](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateShort.html) +9. **微信小游戏推荐弹窗组件GamePortal:isGamePortalPlaying 与 gamePortalShow** 整理来自:[wx.createGamePortal](https://developers.weixin.qq.com/minigame/dev/api/game-portal/GameBanner.html) +10. **微信小游戏插屏广告组件InterstitialAd:isInterstitialPlaying 与 interstitialShow** 整理来自:[wx.createInterstitialAd](https://developers.weixin.qq.com/minigame/dev/api/ad/InterstitialAd.html) +11. **微信小游戏推荐icon组件GameIcon:gameIconShow 与 gameIconDestroy** 整理来自:[wx.createGameIcon](https://developers.weixin.qq.com/minigame/dev/api/game-portal/wx.createGameIcon.html) + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------ | ------------------------------------------------------------ | +| PCSDK.platform.openCustomerServiceConversation | 进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力、钻石和进入跳转充值等,[具体用法请看](platform.md#service)| +| PCSDK.platform.checkUpdate | 检测版本是否有更新,如果版本更新会弹出确认框 | +| PCSDK.platform.copy | 设置系统剪贴板的内容。微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s | +| PCSDK.platform.vibrateShort | 使手机发生较短时间的振动(15 ms) | +| PCSDK.platform.vibrateLong | 使手机发生较长时间的振动(400 ms) | +| PCSDK.platform.gamePortalShow | 传入adUnitId创建并展示小游戏推荐弹窗组件 | +| PCSDK.platform.isGamePortalPlaying | 是否正在加载小游戏推荐弹窗组件 | +| PCSDK.platform.interstitialShow | 传入adUnitId创建并展示小游戏插屏广告组件 | +| PCSDK.platform.isInterstitialPlaying | 是否正在加载小游戏插屏广告组件 | +| PCSDK.platform.gameIconShow | 创建并显示小游戏推荐icon组件 | +| PCSDK.platform.gameIconDestroy | 销毁正在展示的小游戏推荐icon组件 | + + + + + +
+ +2. **openCustomerServiceConversation** + + ```javascript + PCSDK.platform.openCustomerServiceConversation( params?: _CustomerServiceConversationObject ): void + ``` + + 定义:进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力和进入跳转充值 + + 参数: + + ```javascript + params _CustomerServiceConversationObject 选传,不传递打开一个普通的客户会话。[参数说明参照](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html) + { + sessionFrom string 选传 会话来源 + showMessageCard boolean 选传 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息 + sendMessageTitle string 选传 会话内消息卡片标题 + sendMessagePath string 选传 会话内消息卡片路径 + sendMessageImg string 选传 会话内消息卡片图片路径 + success function 选传 接口调用成功的回调函数 + fail function 选传 接口调用失败的回调函数 + complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行) + } + ``` + 返回值: + + ``` + void + 无 + ``` + + 示例1:进入普通的客服会话 + + ```javascript + PCSDK.platform.openCustomerServiceConversation(); + ``` + 示例2:应用场景如进入客服会话跳转领取体力、钻石等等: 示例为跳转客服领取18888钻石奖励,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断)。 + + ```javascript + // 跳转客服领取18888钻石奖励,开发者可根据示例修改 + PCSDK.platform.openCustomerServiceConversation({ + showMessageCard: true, + sendMessageTitle: '钻石已发送,点击领取钻石!', + sendMessagePath: '', + sendMessageImg: 'http://dep.miso-lab.com/mergeguns/bin/res/image/service_reward.png', // 图片icon对应的域名记得加入到request和download白名单中 + success: () => { + // 打开跳转客服成功,记录成功状态,在游戏全局注册的onShow监听通过判断这个状态去请求接口领取奖励 + // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改 + AppDataManager.I.set('service.reward.data', { + status: 1, // 可以领奖 + reward: 18888 // 获得18888钻石 + }); + }, + fail: (err) => { + console.log("openCustomerServiceConversation fail: ", err); + } + }); + // 在游戏中全局注册的onShow事件监听中检测是 + // 游戏入口:Main.cs + class Main { + constructor() { + this.init(); + } + + private init() { + PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this)); + PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this)); + } + + private onShow(opts) { + // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断 + let serviceRewardData = AppDataManager.I.get('service.reward.data'); + if (serviceRewardData && serviceRewardData.status === 1) { + AppDataManager.I.set('service.reward.data', null); + // 奖励发放,处理发放后的逻辑,比如每天只能领取一次的记录,防止重复刷奖励 + } + } + + private onHide(){ + // 监听平台的onHide事件 + } + } + ``` + 示例3:应用场景例如进入客服会话,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断),点击右下角的充值按钮后,跳转充值,充值完成后在onShow中处理:需要后台提供api接口,验证充值合理性并发放奖励,**此接口需要后端支持**。 + + ```javascript + // 跳转客服充值,开发者可根据示例修改,sendMessagePath请严格按照示例中提供的参数 + /** + * 充值跳转客服 + * @param itemId 购买道具商品id + * @param money 购买商品花费,单位元 + */ + private openServiceWithItem(itemId: number, money: number) { + PCSDK.platform.openCustomerServiceConversation({ + showMessageCard: true, + sendMessageTitle: `充值${money}元`, + sendMessagePath: `channel=${PCSDK.data.ChannelId}&item=${itemId}&uid=${PCSDK.data.UserId}&pf=${PCSDK.data.SystemId}`, + sendMessageImg: 'http://dep.miso-lab.com/idiom/bin/share/pay.png', // 图片icon对应的域名记得加入到request和download白名单中 + success: () => { + // 打开跳转客服成功,记录成功状态,onShow通过判断这个状态去请求接口领取奖励 + // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改 + AppDataManager.I.set('service.pay.data', { + status: 1, // 可以领奖 + itemId: itemId, // 购买道具商品id + money: money // 购买商品花费,单位元 + }); + }, + fail: (err) => { + console.log("openCustomerServiceConversation fail: ", err); + } + }); + } + + // 在游戏中全局注册的onShow事件监听中检测是 + // 游戏入口:Main.cs + class Main { + constructor() { + this.init(); + } + + private init() { + PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this)); + PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this)); + } + + private onShow(opts) { + // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断 + let serviceRewardData = AppDataManager.I.get('service.pay.data'); + if (serviceRewardData && serviceRewardData.status === 1) { + AppDataManager.I.set('service.pay.data', null); + // 领取奖励的逻辑,比如每天只能领取一次的记录,防止重复刷奖励 + // 请求后端接口验证奖励合理性 + } + } + + private onHide(){ + // 监听平台的onHide事件 + } + } + ``` +
+3. **checkUpdate** + + ```javascript + PCSDK.platform.checkUpdate( params?: _ShowModalObject ): void + ``` + 定义:检测版本是否有更新,如果版本有更新会弹出确认框,参数可不传递,不传递有版本更新会弹出下图的默认确认框;开发者可自定义弹出框的显示样式,参数与[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html)一模一样。 + 建议此api在游戏的入口调用。 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_029.png "🔍点击查看大图") + + 参数: + + ```javascript + params _ShowModalObject 选传 不传递有版本更新会弹出上图样式默认确认框;开发者可自定义弹出框的显示样式,参数参照wx.showModal的参数 + { + title string 选传 提示的标题,默认为:更新提示 + content string 选传 提示的内容,默认为:新版本已经准备好,是否重启应用? + showCancel boolean 选传 是否显示取消按钮,默认为:false不显示 + cancelText string 选传 取消按钮的文字,最多4个字符 + cancelColor string 选传 取消按钮的文字颜色,必须是16进制格式的颜色字符串 + confirmText string 选传 确认按钮的文字,最多4个字符 + confirmColor string 选传 确认按钮的文字颜色,必须是16进制格式的颜色字符串 + success function 选传 接口调用成功的回调函数 + fail function 选传 接口调用失败的回调函数 + complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行) + } + ``` + 返回值: + + ``` + void + 无 + ``` + + 示例:在游戏入口类中检测是否有版本更新 + + 1)、依照下面的示例接入checkUpdate api + + ```javascript + class Main { + constructor() { + this.init(); + } + + private init() { + this.checkUpdate(); + } + + private checkUpdate() { + // 调用SDK的checkUpdate,微信版本有更新,会自动弹出更新确认框 + PCSDK.platform.checkUpdate(); + + // 自定义更新弹出框 + /* + PCSDK.platform.checkUpdate({ + showCancel: true, + content: '客官,xxx游戏有更新了!', + cancelText: '放弃' + }); + */ + } + } + + ``` + 2)、接入代码完毕后,按照下图的操作本地开发工具调试是否接入成功。 + + I、选择:添加编译模式。 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_030.png "🔍点击查看大图") + II、选择:自定义模式名称、勾选下次编译时模拟更新、选择模拟成功还是失败状态,点击确定。 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_031.png "🔍点击查看大图") + III、开发工具会自动重新启动游戏,弹出更新框,看到弹出框接入成功。 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_032.png "🔍点击查看大图") +
+4. **copy** + + ```javascript + PCSDK.platform.copy( str: string ): Promise + ``` + 定义:设置系统剪贴板的内容。提示:微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s + + 参数: + + ```javascript + str string 必传 剪贴板的内容 + + ``` + 返回值: + + ``` + Promise + Promise resolve复制系统剪贴板内容成功回调,reject失败回调 + ``` + + 示例: + + ```javascript + PCSDK.platform.copy('这是我想要复制的内容') + .then( ret => { + // 打印复制的内容 + console.log(ret.data); + }) + .catch(err => { + console.warn('复制失败', err); + }); + ``` +
+4. **vibrateShort** +```javascript + PCSDK.platform.vibrateShort(): Promise +``` +定义:使手机发生较短时间的振动(15 ms)。仅在 iPhone 7 / 7 Plus 以上及 Android 机型生效 +参数: + + ```javascript + 无 + ``` +示例: + + ```javascript + PCSDK.platform.vibrateShort(); + + ``` +5. **vibrateLong** + + ```javascript + PCSDK.platform.vibrateLong(): Promise + ``` + 定义:使手机发生较长时间的振动(400 ms) + 参数: + ```javascript + 无 + ``` + 示例: + ```javascript + PCSDK.platform.vibrateLong(); + ``` +
+6. **gamePortalShow** + ```javascript + PCSDK.platform.gamePortalShow(adUnitId: string): Promise + ``` + 定义:传入adUnitId创建并展示小游戏推荐弹窗组件,Promise resolve创建展示成功回调,reject创建失败回调。 + + 参数: + ```javascript + adUnitId string 必传 小游戏推荐弹窗组件推荐单元id + ``` + 返回值: + ```javascript + Promise + Promise resolve创建展示成功回调,reject创建失败回调 + ``` + 示例: + ```javascript + // 例子1:显示弹窗组件 + let adUnitId: string = 'PBgAAgPWNXGtCwcA'; + PCSDK.platform.gamePortalShow(adUnitId); + + // 例子2:显示推荐弹窗组件,如果显示不成功,则显示小游戏插屏广告,插屏广告api使用请继续往下看。 + let adUnitId: string = 'PBgAAgPWNXGtCwcA'; + PCSDK.platform.gamePortalShow(adUnitId).catch(err => { + // 推荐弹窗组件显示不成功显示插屏广告 + adUnitId = 'adunit-4da0ec77513f8eea'; + PCSDK.platform.interstitialShow(adUnitId); + }); + + ``` +7. **isGamePortalPlaying** + + ```javascript + PCSDK.platform.isGamePortalPlaying(): boolean + ``` + + 定义:是否正在加载小游戏推荐弹窗组件;在PCSDK.platform.gamePortalShow api内部,如果正在创建弹窗组件会在Promise reject返回错误提示信息。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + boolean + ``` + + 示例: + + ```javascript + let isPlaying = PCSDK.platform.isGamePortalPlaying(); + + ``` +
+8. **interstitialShow** + + ```javascript + PCSDK.platform.interstitialShow(adUnitId: string): Promise + ``` + + 定义:传入adUnitId创建并展示小游戏插屏广告组件,Promise resolve创建展示成功回调,reject创建失败回调 + + 参数: + + ```javascript + adUnitId string 必传 小游戏插屏广告组件广告单元id + ``` + 返回值: + + ```javascript + Promise + Promise resolve创建展示成功回调,reject创建失败回调 + ``` + + 示例: + + ```javascript + // 例子1:显示插屏广告组件 + let adUnitId: string = 'adunit-4da0ec77513f8eea'; + PCSDK.platform.interstitialShow(adUnitId); + + // 例子2:显示插屏广告组件,如果显示不成功,则显示小游戏推荐弹窗组件。 + let adUnitId: string = 'adunit-4da0ec77513f8eea'; + PCSDK.platform.interstitialShow(adUnitId).catch( err => { + // 加载不成功显示小游戏推荐弹窗组件 + adUnitId = 'PBgAAgPWNXGtCwcA'; + PCSDK.platform.gamePortalShow(adUnitId); + }); + ``` +9. **isInterstitialPlaying** + + ```javascript + PCSDK.platform.isInterstitialPlaying(): boolean + ``` + + 定义:是否正在加载小游戏插屏广告组件;在PCSDK.platform.interstitialShow如果正在创建插屏广告会在Promise reject返回错误提示信息。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + boolean + ``` + + 示例: + + ```javascript + let isPlaying = PCSDK.platform.isInterstitialPlaying(); + + ``` +
+10. **gameIconShow** + ```javascript + PCSDK.platform.gameIconShow(adUnitId: string, opts: { count: number, style: Array<_GameIconStyleItem> }): Promise + ``` + + 定义:创建并显示小游戏推荐icon组件。 + + 参数: + + ```javascript + adUnitId string 必传 小游戏推荐icon组件广告单元id + opts object 必传 扩展参数,目前支持count和style两个属性值 + { + count number 必传 游戏icon的数量,请注意,正式版下面渲染出来的icon数量会小于等于count,请注册做好样式兼容 + style Array<_GameIconStyleItem> 必传 数组的每一项可以针对对应的icon设置位置和样式等信息,style的每一项称为_GameIconStyleItem + } + + Object _GameIconStyleItem:单个游戏icon的位置和样式信息 + { + appNameHidden boolean 必传 游戏名称是否隐藏 + color string 必传 游戏名称的颜色色值 + size number 必传 游戏icon的宽高值 + borderWidth number 必传 游戏icon的border尺寸 + borderColor string 必传 游戏icon的border颜色色值 + left number 必传 游戏icon的X轴坐标 + top number 必传 游戏icon的Y轴坐标 + } + ``` + 返回值: + + ```javascript + Promise + Promise resolve创建展示成功回调,reject创建失败回调 + ``` + + 示例: + + ```javascript + // 显示1个推荐icon组件 + private showGameIcon(){ + let adUnitId: string = 'PBgAAgPWNXGkQ4p0'; + let {windowWidth} = PCSDK.platform.getSystemData(); + PCSDK.platform.gameIconShow(adUnitId, { + count: 1, + style: [ + { + appNameHidden: false, + color: "#FF0000", + size: 50, + borderWidth: 0, + borderColor: "#FF0000", + left: (windowWidth / 750) * 550, + top: (windowWidth / 750) * 150 + } + ] + }) + .then(() => { + // console.warn('显示GameIcon成功'); + }) + .catch((err) => { + // console.warn('显示GameIcon失败'); + }); + } + + ``` +11. **gameIconDestroy** + + ```javascript + PCSDK.platform.gameIconDestroy(): void + ``` + + 定义:销毁正在展示的小游戏推荐icon组件。展示推荐icon组件广告后,请记得在页面关闭时候调用此api销毁GameIcon。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + void + ``` + + 示例: + + ```javascript + + private open(){ + super.open(); + this.showGameIcon(); + } + + private close(){ + super.close(); + this.destoryGameIcon(); + } + + // 显示2个推荐icon组件 + private showGameIcon(){ + let adUnitId: string = 'PBgAAgPWNXGkQ4p0'; + let {windowWidth} = PCSDK.platform.getSystemData(); + PCSDK.platform.gameIconShow(adUnitId, { + count: 2, + style: [ + { + appNameHidden: false, + color: "#FF0000", + size: 50, + borderWidth: 0, + borderColor: "#FF0000", + left: (windowWidth / 750) * 450, + top: (windowWidth / 750) * 150 + }, + { + appNameHidden: false, + color: "#FF0000", + size: 50, + borderWidth: 0, + borderColor: "#FF0000", + left: (windowWidth / 750) * 550, + top: (windowWidth / 750) * 150 + } + ] + }) + .then(() => { + // console.warn('显示GameIcon成功'); + }) + .catch((err) => { + // console.warn('显示GameIcon失败'); + }); + } + + // 销毁展示创建的GameIcon组件 + private destoryGameIcon(){ + PCSDK.platform.gameIconDestroy(); + } + + ``` \ No newline at end of file diff --git a/outer/share.md b/outer/share.md new file mode 100644 index 0000000..2f52757 --- /dev/null +++ b/outer/share.md @@ -0,0 +1,539 @@ + +# 分享视频模块 + +------ + +#### **简介** +小游戏生态中,普遍把平台提供的分享/视频接口更多用于某个奖励领取、获取n倍奖励、游戏死亡复活、转盘额外次数获得等等一种有效途径(分享:拉取新用户,视频:赚钱广告费);噗嗤游戏在分享or视频推送不断的探索迭代中,总结了一套分享/视频积分策略,集成在SDK中开放给开发者,开发者只需对游戏中分享视频功能点命名一个英文名称key(分享视频key),这个key关联分享文案、分享图、分享开关(推送类型)、视频uid等等在后台配置好,使用SDK提供的一个dispatch api传入英文名称key即可完成接入工作。 + +- 分享/视频配置可以让开发者在后台中动态修改相关功能点的分享/视频配置内容。 + +- 新增某个功能的分享点配置、在线修改相关功能点的分享图或文案、在线切换某个功能点按钮的分享/视频推送类型。 + +- 调用SDK的dispatch api,dispatch会根据后台配置的分享开关(推送类型)自动进行分发:推送分享还是视频全权交由SDK去处理,开发者只需要传入成功/失败回调函数,成功回调函数处理发放领取奖励、n倍奖励、成功复活等操作,失败回调函数处理参数传递的msg信息。 + +#### **疑惑解答** +1. 为什么要引入这个模块? + + > 游戏中很多n倍奖励、复活、额外奖励等功能点通常需要分享或者视频才能额外获得,游戏上线后,运营很有可能会对某些功能点有额外的需求修改:a功能点获取由分享改成视频方式获取、b功能点由视频改成分享方式获取、c功能点需要在前面n次看视频获得后全是分享获得、为某某功能的分享图想换一个、拉取视频不成功自动切换分享等等;为了应对这些不同情形,我们把分享和视频点包装成一个模块,a功能点也不在局限于只是简单的分享、b功能只是视频,而是通过后台分享开关去灵活切换。所有功能点入口调用都是使用dispatch,每个功能点都是转化为一个分享视频key在后台管理。 + +2. 什么是分享视频key? + + > 分享视频key是一个功能点的英文名称,这个key配置在后台中,关联分享文案、分享图、分享开关(推送类型)、视频uid等等信息。某个功能点(不论是分享还是视频方式)调用dispatch传入这个key,SDK会读取这个key关联的信息,根据分享开关(推送类型)来推送分享(需要分享文案、分享图)还是推送视频(需要视频uid)。 + +3. 什么是分享视频分发? + + > 调用dispatch api传入分享视频key,SDK会查找这个key在后台配置的数据,SDK读取数据中分享开关(推送类型)的字段信息,通过这个开关类型来判断推给用户是分享还是视频,这个根据类型来推送的操作就是分发操作。 + +4. 游戏中之前是玩家分享n次后变成看视频或者是看视频n次后全是分享,dispatch能满足吗? + + > 上面的问题dispatch也同样支持,还是同样的调用方式,不需要做其他额外处理,dispatch是怎么做到的了:分享开关(推送类型)有一个分享积分选择项,这个选项就是通过积分策略实现了上面问题。 + > + + +#### **后台使用** + +配置分享视频配置,登录后台->头部tab切换到【游戏数据】->【配置相关】->【分享/视频配置】可新增、编辑修改分享/视频内容: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_023.png "🔍点击查看大图") + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_024.png "🔍点击查看大图") + +接入分享视频模块后,后台已经对分享和视频数据分别进行整理统计了,游戏接入方可实时查看分享/视频的各项数据: + +查看分享分析,登录后台->头部tab切换到【游戏数据】->【产品分析】->【分享分析】可阅览游戏分享数据的各项统计: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_025.png "🔍点击查看大图") + +查看视频广告详情,登录后台->头部tab切换到【游戏数据】->【配置相关】->【视频广告详情】可阅览游戏各个功能点视频数据统计: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_026.png "🔍点击查看大图") + + + +#### **接入必读** + +- 接入此模块前,请[**前往sdk/config.js文件中配置【IsUseShareModule: true 】开启分享视频模块功能**](install.md#config_env),此参数配置为true,才能正常使用此模块的功能,SDK启动时会自动拉取后台配置所有功能点的分享/视频配置列表。 + +- 微信小游戏开发者接入此模块,如果游戏有很多分享点,提审时避免触犯微信平台的[滥用分享行为](https://developers.weixin.qq.com/minigame/product/#_5-1-滥用分享行为),在后台【配置参数】中配置了一个SDK内部使用的[配置参数](online.md)share_unlock,进行分享开关切换:1(开启)0(关闭),提审时设置为0,审核通过后设为1。share_unlock设置为0,所有的功能点不会分享完成、拉起看完视频后发放奖励,而是直接发放奖励,这样就能避免审核时,如果是推送分享拉起分享,被微信认为是诱导分享,被拒的可能性。 + +- sdk/config.js的配置参数ShareRightKey,表示右上角分享的分享视频key,请配置到后台【分享/视频配置】中。如果ShareRightKey配置不为空,SDK会自动调用微信的右上角分享接口(wx.onShareAppMessage),实现右上角分享功能,注意的是开发者在游戏中已经有注册wx.onShareAppMessage需要删除掉,不然游戏中onShareAppMessage的注册事件会把SDK中的注册事件处理函数覆盖掉,导致还是使用的是开发者注册的右上角分享功能。 + +- sdk/config.js的配置参数ShareData表示默认分享视频配置,此条配置应用在两种情况下: + + > 1、请求功能点的分享/视频配置列表出错,使用key去查找对应的分享配置肯定是查找不到的,会读取此条默认数据。 + > + > + > + > 2、请求功能点的分享/视频配置列表成功了,但是这个key没有配置到后台,也会读取此条默认数据 + +#### **接入**API: + +| **名称** | **功能说明** | +| ------------------------------- | ------------------------------------------------------------ | +| PCSDK.shareVideo.share | 普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 | +| PCSDK.shareVideo.dispatch | 分享视频分发入口,传入功能点英文命名的分享/视频key | +| PCSDK.shareVideo.getShareVideoType | 根据功能点在后台配置的分享/视频key,得到此功能点分享开关(推送类型)SDK计算得到最终推送类型:-1(无视频无分享)、0(分享)、1(异步分享)、5(分享积分)、2(视频)、3(无视频则分享)、4(视频和分享)(控制分享和视频两个按钮的显示) | + + + +1. ##### **share** + + ```javascript + PCSDK.shareVideo.share(key:sring, params?: any, opts?: any): void + ``` + + 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 + + 参数: + + ```javascript + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key) + + params: object 选传 扩展参数:分享链接query携带自定义参数,{ key: value }对象形式,该对象传递的参数会与SDK内部query参数一起组成query(查询参数, key1=val1&key2=val2的格式)的值,SDK内部参数key有:channel_id、user_invite_uid、share_id、share_key。 + + 提示:params传递的对象中如果含有传递SDK内部query参数key,会被SDK内部参数值覆盖,所以开发者避免传递这些key。 + + opts: object 选传 可不传递 + + ``` + + 返回值: + + ```javascript + void + ``` + + 示例:游戏首页分享到群的功能,假如config.js配置的ChannelId: 20024;后台配置的分享视频key: home_share2group、此分享key的id:512;用户id:100000。 + + ```javascript + // 示例1: + // 分享后生成的query:share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000 + PCSDK.shareVideo.share( 'home_share2group' ); + + // 示例2:第二个参数是分享生成的query携带的参数 + // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000 + PCSDK.shareVideo.share( 'home_share2group', { + type:99 + }); + + // 示例3:第二个参数是分享生成的query携带的参数,传递SDK内部query参数:channel_id + // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000 + PCSDK.shareVideo.share( 'home_share2group', { + type:99, + channel_id:10000 + }); + ``` + +2. ##### **dispatch** + + ```javascript + PCSDK.shareVideo.dispatch( key: string, params?: { success: Function, fail: Function, context?: any} ): void + ``` + + 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 + + 参数: + + ```javascript + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key) + + params: object 选传 扩展参数:success分享视频成功回调处理函数,fail分享视频失败回调处理函数,contex函数执行上下文 + { + success: ( from:number, ret: any | null ) => void, + error: ( from:number, error: object | null ) => void, + context: any + } + + from:此次分发成功推送类型 + from返回枚举值为: + 0:无视频无分享(后台配置分享开关(推送类型)or 应对审核分享关闭:配置参数share_unlock设置为0) + 1:推送同步分享 + 2:推送异步分享 + 3:推送视频 + + error:此次分发失败的错误消息 + error返回枚举值为: + { code: 1000, msg: '要看完视频哦!' }, + { code: 1001, msg: '视频加载失败!' }, + { code: 999, msg: '视频UID不存在!' }, + { code: 1002, msg: '视频组件未开放!' }, + { code: 1003, msg: '正在观看视频中...' }, + { code: 1004, msg: '分享失败,请尝试发送至不同群!' }, + { code: 1005, msg: '别总骚扰这个群,换个群分享吧!' }, + { code: 1006, msg: '请分享到群哦!' }, + { code: 1007, msg: '分享到群才能领取更多~' }, + { code: 1008, msg: '分享失败,请尝试发送至不同群!' }, + { code: 1009, msg: '今日已达分享上限次数,请明日再来' } + ``` + + 返回值: + + ```javascript + void + ``` + + 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。 + + 演示 + + ```javascript + // DiamondDoublePopwin.ts文件 + export default class DiamondDoublePopwin extends BaseView{ + protected addEvent() { + super.addEvent(); + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用) + this.btnFree.on(Laya.Event.CLICK, this, this.onReward); + // 分享双倍 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward); + // 视频双倍 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward); + } + + protected removeEvent() { + super.removeEvent(); + this.btnFree.off(Laya.Event.CLICK, this, this.onReward); + this.btnShare.off(Laya.Event.CLICK, this, this.onReward); + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward); + } + + // 领取奖励操作 + private onReward(){ + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), { + success: this.handleReward, + fail: this.handleError, + context: this + } ); + } + + // 分享/视频成功后回调处理函数:发奖励 + private handleReward(from: ShareVideoFrom, ret: any | null){ + // 分享成功、视频成功、无视频无分享 + } + + // 分享/视频失败后回调处理函数:弹出提示 + private handleError(from: ShareVideoFrom, error: any | null){ + // 返回错误,处理错误msg信息,自定义处理 + if( error ){ + wx.showToast({ + title: error.msg + }); + } + } + } + + // Enums.ts文件 + // 分享视频key枚举,每个key表示一个功能点 + enum ShareVideoKeys { + // 钻石双倍获取 + DiamondDouble = 'diamond_double', + // 失败获得双倍奖励 + FailRewardDouble = 'fail_reward_double' + } + + // 分享视频功能点最终处理方式 + enum ShareVideoFrom{ + None = 0, // 无视频无分享 + Share = 1, // 分享 + ShareAsync = 2, // 异步分享 + Video = 3, // 看视频 + } + ``` + +3. ##### **getShareVideoType** + + ```javascript + PCSDK.shareVideo.getShareVideoType( key: string ): number + ``` + + 定义:根据分享视频key获取此次shareVideo模块推送的分享视频类型值:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分);此api用于通过得到的类型值处理页面的ui状态(微信和QQ平台对按钮的icon有强制限制):显示视频icon、显示分享icon、既没有分享icon,也没有视频icon。 + + 参数: + ```javascript + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key) + ``` + + 返回值: + + ```javascript + number + 返回值此次点击功能按钮触发的推送类型:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分) + 分享视频类型枚举值如下: + // 推送类型:分享视频类型枚举 + enum ShareVideoType { + None = -1, // -1无分享无视频 + Share = 0, // 0分享 + ShareAysnc = 1, // 1异步分享 + ShareIntegral = 5, // 5分享积分 + Video = 2, // 2看视频 + VideoToShare = 3, // 3无视频则分享 + VideoAndShare = 4 // 4视频和分享(控制分享和视频两个按钮的显示) , + } + ``` + + 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。 + + ```javascript + // DiamondDoublePopwin.ts文件 + export default class DiamondDoublePopwin extends BaseView{ + protected addEvent() { + super.addEvent(); + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用) + this.btnFree.on(Laya.Event.CLICK, this, this.onReward); + // 分享双倍 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward); + // 视频双倍 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward); + } + + protected removeEvent() { + super.removeEvent(); + this.btnFree.off(Laya.Event.CLICK, this, this.onReward); + this.btnShare.off(Laya.Event.CLICK, this, this.onReward); + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward); + } + + // 每次打开此popwin执行onOpen + protected onOpen(){ + super.onOpen(); + this.iniitRewardUI(); + } + + // 初始化/更新获得奖励按钮ui + private initRewardUI() { + let shareVideoType: ShareVideoType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString()); + switch (shareVideoType) { + case ShareVideoType.Share: // 同步分享 + case ShareVideoType.ShareAysnc: // 异步分享 + case ShareVideoType.ShareIntegral: // 分享积分 + this.btnFree.visible = false; + this.btnShare.visible = true; + this.btnVideo.visible = false; + break; + + case ShareVideoType.Video: // 推送视频 + case ShareVideoType.VideoToShare: // 无视频则分享 + // 视频ui状态 + this.btnFree.visible = false; + this.btnShare.visible = false; + this.btnVideo.visible = true; + break; + + default: // 无视频和无分享 + // 既不显示分享ui又不显示视频ui,直接领奖ui状态 + this.btnFree.visible = true; + this.btnShare.visible = false; + this.btnVideo.visible = false; + break; + } + } + + // 领取奖励操作 + private onReward(){ + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), { + success: this.handleReward, + fail: this.handleError, + context: this + } ); + } + + // 分享/视频成功后回调处理函数:发奖励 + private handleReward(from: ShareVideoFrom, ret: any | null){ + // 分享成功、视频成功、无视频无分享 + } + + // 分享/视频失败后回调处理函数:弹出提示 + private handleError(from: ShareVideoFrom, error: any | null){ + // 返回错误,处理错误msg信息,自定义处理 + if( error ){ + wx.showToast({ + title: error.msg + }); + } + } + } + + // Enums.ts文件 + // 分享视频类型(与后台一一对应) + export enum ShareVideoType { + None = -1, // -1无分享无视频 + Share = 0, // 0同步分享 + ShareAysnc = 1, // 1异步分享 + ShareIntegral = 5, // 5分享积分 + Video = 2, // 2看视频 + VideoToShare = 3, // 3无视频则分享 + VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示) + } + + // 分享视频key枚举,每个key表示一个功能点 + enum ShareVideoKeys { + // 钻石双倍获取 + DiamondDouble = 'diamond_double', + // 失败获得双倍奖励 + FailRewardDouble = 'fail_reward_double' + } + + // 分享视频功能点最终推送类型 + enum ShareVideoFrom{ + None = 0, // 无视频无分享 + Share = 1, // 分享 + ShareAsync = 2, // 异步分享 + Video = 3, // 看视频 + } + + ``` +
+ 下面演示dispatch和getShareVideoType两个api的完整使用,Laya引擎开发: + + 页面功能点按钮做三个状态: + + 1、看视频状态(显示视频icon) + + 2、分享状态(显示分享icon) + + 3、直接领奖(没有icon,审核状态) + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_1.png "🔍点击查看大图") + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_2.png "🔍点击查看大图") + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_3.png "🔍点击查看大图") + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_4.png "🔍点击查看大图") + + 例如,一个领取钻石双倍,页面的按钮ui通过下面的方式进行切换 + + 1、页面做三个按钮:视频icon按钮、分享icon按钮、直接领取按钮 + + 2、进入页面根据配置的key获取类型,显示对应类型ui:调用下面的initRewardUI(可随意命名) + + 3、分享或者视频后,SDK会发送一个tactic.update的消息过来,使用PCSDK.event.add注册监听,PCSDK.event.remove移除监听(PCSDK.event详细了解请查看[事件模块](event.md)),监听事件处理下一次推送显示ui状态:执行一下initRewardUI。 + + 4、给三个按钮都注册事件:onReward + ```javascript + // DiamondDoublePopwin.ts文件 + export default class DiamondDoublePopwin extends BaseView { + protected addEvent() { + super.addEvent(); + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用) + this.btnFree.on(Laya.Event.CLICK, this, this.onReward); + // 分享双倍 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward); + // 视频双倍 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward); + // PCSDK.event.add注册监听SDK发送的消息:tactic.update,更新获得奖励按钮ui + PCSDK.event.add('tactic.update', this.initRewardUI, this); + } + + protected removeEvent() { + super.removeEvent(); + this.btnFree.off(Laya.Event.CLICK, this, this.onReward); + this.btnShare.off(Laya.Event.CLICK, this, this.onReward); + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward); + // PCSDK.event.remove移除监听SDK发送的消息:tactic.update + PCSDK.event.remove('tactic.update', this.initRewardUI, this); + } + + // 每次打开此popwin执行onOpen + protected onOpen(){ + super.onOpen(); + // 界面打开 + this.initRewardUI(); + } + + // 领取奖励操作 + private onReward(){ + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), { + success: this.handleReward, + context: this + } ); + } + + // 分享/视频成功后回调处理函数:发奖励 + private handleReward(from: ShareVideoFrom, ret: any | null){ + // 分享成功、视频成功、无视频无分享 + } + + // 分享/视频失败后回调处理函数:弹出提示 + private handleError(from: ShareVideoFrom, error: any | null){ + // 返回错误,处理错误msg信息,自定义处理 + if( error ){ + wx.showToast({ + title: error.msg + }); + } + } + + // 初始化/更新获得奖励按钮ui + private initRewardUI() { + let shareVideoType: ShareType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString()); + switch (shareVideoType) { + case ShareVideoType.Share: // 同步分享 + case ShareVideoType.ShareAysnc: // 异步分享 + case ShareVideoType.ShareIntegral: // 分享积分 + // 分享ui状态 + this.stat_share.play(0,false); + // 等同于 + // this.btnFree.visible = false; + // this.btnShare.visible = true; + // this.btnVideo.visible = false; + break; + + case ShareVideoType.Video: // 视频 + case ShareVideoType.VideoToShare: // 无视频则分享 + // 视频ui状态 + this.stat_video.play(0,false); + // 等同于 + // this.btnFree.visible = false; + // this.btnShare.visible = false; + // this.btnVideo.visible = true; + break; + + default: // 无视频和无分享 + // 既不显示分享ui又不显示视频ui,直接领奖ui状态 + this.stat_free.play(0,false); + // 等同于 + // this.btnFree.visible = true; + // this.btnShare.visible = false; + // this.btnVideo.visible = false; + break; + } + } + } + + // Enums.ts文件 + // 分享视频类型(与后台一一对应) + export enum ShareVideoType { + None = -1, // -1无分享无视频 + Share = 0, // 0同步分享 + ShareAysnc = 1, // 1异步分享 + ShareIntegral = 5, // 5分享积分 + Video = 2, // 2看视频 + VideoToShare = 3, // 3无视频则分享 + VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示) + } + + // 分享视频key枚举,每个key表示一个功能点 + enum ShareVideoKeys { + // 钻石双倍获取 + DiamondDouble = 'diamond_double', + // 失败获得双倍奖励 + FailRewardDouble = 'fail_reward_double' + } + + // 分享视频功能点最终推送类型 + enum ShareVideoFrom{ + None = 0, // 无视频无分享 + Share = 1, // 分享 + ShareAsync = 2, // 异步分享 + Video = 3, // 看视频 + } + ``` + + + +#### **终章:** + +这个模块的内容点比较多,接入的注意事项也比较多,望接入者细度使用说明和理解示例意图。 + +噗嗤游戏的小伙伴在开发公司内部游戏中使用此模块,简单封装了SDK分享视频模块的几个通用方法,提供开发者参考,**[点击下载](https://dep.miso-lab.com/sdkword/tools/sdk-share-tools-1.0.0.zip)**。 diff --git a/outer/stat.md b/outer/stat.md new file mode 100644 index 0000000..137d3c8 --- /dev/null +++ b/outer/stat.md @@ -0,0 +1,255 @@ +# 启动注册打点 + +------ + +#### **简介** + +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 + + + +#### **后台使用** + +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png) + +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png) + + + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------ | ------------------------------------------------------------ | +| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 | +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) | +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 | + + + +接入流程图: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png) + +1. **setLoginInfo** +
+ ```javascript + PCSDK.stat.setLoginInfo( data: object ): void + ``` + + 定义:游戏成功登录到服务器,获取到openId和用户信息:openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息 + + 参数: + + ```javascript + data: object +{ + openId: string 必传,openId + regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒) + } + ``` + 返回值: + + ```javascript + 无 + ``` + + 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。 + 该示例,只是模拟使用环境。 + + ```javascript + // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。 + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + PCSDK.stat.setLogind({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + ``` + +2. **loadingFinish** + + ```javascript + PCSDK.stat.loadingFinish(): Promise + ``` + + 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) + + 参数: + + ``` + 无 + ``` + 返回值: + + ```javascript + Promise + Promise resolve 加载打点成功完成回调 + ``` + + 示例: + + ```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() { + // 打点:loadingFinish + PCSDK.stat.loadingFinish(); + } + + // 更新资源加载进度条 + private onProgressMain(ret) { + let progress = ret.data; + this.skin.txtProgress.text = Math.floor(progress * 100) + '%'; + } + ``` + +3. **active** + + ```javascript + PCSDK.stat.active(): void + ``` + + 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式: + 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。 + + 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + void + 无 + ``` + + 示例: + + ```javascript + // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active + // 资源加载loading界面 + class LoadingScene(){ + constructor(){ + // 登录 + this.login(); + // 加载资源 + this.loadResouce(); + } + + /** + * 登录 + */ + private login(){ + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + // 打点:设置用户信息 + PCSDK.stat.setLoginInfo({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + } + + /** + * 加载资源 + */ + private loadResouce(){ + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + /** + * 加载资源完成回调监听 + */ + private onLoadedMain(){ + // 打点:加载资源完成 + PCSDK.stat.loadingFinish().then( () => { + // 打点:用户活跃注册打点 + PCSDK.stat.active(); + + // 进入home主页场景 + SceneManager.I.switchScene(HomeScene); + }); + } + } + + // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。 + // 资源加载loading界面 + class LoadingScene(){ + constructor(){ + // 登录 + this.login(); + // 加载资源 + this.loadResouce(); + } + + /** + * 登录 + */ + private login(){ + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + // 打点:设置用户信息 + PCSDK.stat.setLoginInfo({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + } + + /** + * 加载资源 + */ + private loadResouce(){ + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + /** + * 加载资源完成回调监听 + */ + private onLoadedMain(){ + // 打点:加载资源完成 + PCSDK.stat.loadingFinish().then( () => { + // 进入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/outer/stat_active.md b/outer/stat_active.md new file mode 100644 index 0000000..137d3c8 --- /dev/null +++ b/outer/stat_active.md @@ -0,0 +1,255 @@ +# 启动注册打点 + +------ + +#### **简介** + +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 + + + +#### **后台使用** + +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png) + +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png) + + + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------ | ------------------------------------------------------------ | +| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 | +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) | +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 | + + + +接入流程图: + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png) + +1. **setLoginInfo** +
+ ```javascript + PCSDK.stat.setLoginInfo( data: object ): void + ``` + + 定义:游戏成功登录到服务器,获取到openId和用户信息:openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息 + + 参数: + + ```javascript + data: object +{ + openId: string 必传,openId + regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒) + } + ``` + 返回值: + + ```javascript + 无 + ``` + + 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。 + 该示例,只是模拟使用环境。 + + ```javascript + // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。 + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + PCSDK.stat.setLogind({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + ``` + +2. **loadingFinish** + + ```javascript + PCSDK.stat.loadingFinish(): Promise + ``` + + 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) + + 参数: + + ``` + 无 + ``` + 返回值: + + ```javascript + Promise + Promise resolve 加载打点成功完成回调 + ``` + + 示例: + + ```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() { + // 打点:loadingFinish + PCSDK.stat.loadingFinish(); + } + + // 更新资源加载进度条 + private onProgressMain(ret) { + let progress = ret.data; + this.skin.txtProgress.text = Math.floor(progress * 100) + '%'; + } + ``` + +3. **active** + + ```javascript + PCSDK.stat.active(): void + ``` + + 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式: + 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。 + + 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。 + + 参数: + + ```javascript + 无 + ``` + 返回值: + + ```javascript + void + 无 + ``` + + 示例: + + ```javascript + // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active + // 资源加载loading界面 + class LoadingScene(){ + constructor(){ + // 登录 + this.login(); + // 加载资源 + this.loadResouce(); + } + + /** + * 登录 + */ + private login(){ + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + // 打点:设置用户信息 + PCSDK.stat.setLoginInfo({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + } + + /** + * 加载资源 + */ + private loadResouce(){ + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + /** + * 加载资源完成回调监听 + */ + private onLoadedMain(){ + // 打点:加载资源完成 + PCSDK.stat.loadingFinish().then( () => { + // 打点:用户活跃注册打点 + PCSDK.stat.active(); + + // 进入home主页场景 + SceneManager.I.switchScene(HomeScene); + }); + } + } + + // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。 + // 资源加载loading界面 + class LoadingScene(){ + constructor(){ + // 登录 + this.login(); + // 加载资源 + this.loadResouce(); + } + + /** + * 登录 + */ + private login(){ + Api.login().then( data => { + let { user_openid, user_reg_time } = data; + // 打点:设置用户信息 + PCSDK.stat.setLoginInfo({ + openId: user_openid, // openId + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 + }); + }); + } + + /** + * 加载资源 + */ + private loadResouce(){ + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); + } + + /** + * 加载资源完成回调监听 + */ + private onLoadedMain(){ + // 打点:加载资源完成 + PCSDK.stat.loadingFinish().then( () => { + // 进入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/outer/stat_ads.md b/outer/stat_ads.md new file mode 100644 index 0000000..e78aea7 --- /dev/null +++ b/outer/stat_ads.md @@ -0,0 +1,530 @@ +# 交叉推广位 + +------ + +#### **简介** + +交叉推广位是在游戏中展示其他游戏,用户点击某个游戏跳转进入游戏,达到共享用户的目的。 + +噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析查看。 + +**3种广告类型:悬浮框交叉推广位、抽屉式交叉推广位、猜你喜欢交叉推广位,对应类型值为:40、70、50** + +1. 悬浮框交叉推广位,推荐位置:首页、结算页 + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_013.png "🔍点击查看大图") + +2. 抽屉式交叉推广位,推荐位置:首页、结算页 + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_014.png "🔍点击查看大图") + +3. 猜你喜欢交叉推广位,推荐位置:结算页 + + ![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)。 + +- **接入3种交叉推广位后,为了防止微信审核被拒(被拒理由:微信认定游戏跳转到其他游戏太多,判断游戏是一个游戏盒子,拒绝审核通过),为了防范被拒,在[数据模块](data.md)提供了三个数据获取api:PCSDK.data.IsCross、PCSDK.data.IsDrawer、PCSDK.data.IsGuessLike,控制3种推广位广告的显示隐藏,开发者在游戏中对三种广告控制显示隐藏状态。[详请请阅读数据api](data.md#ad_cross)。** + +- 噗嗤游戏为了方便开发者接入调试交叉推广位,后台已经配置测试使用的3种类型推广位,提供以下10个推广位appid,开发者复制下面的navigateToMiniProgramAppIdList json数据,配置到game.json的navigateToMiniProgramAppIdList参数: + + 水果爆破 :"wx26822126b4d99eda", + + 球球涂涂涂:"wxac0750884d5bed0c", + + 狂野漂移3D:"wx019a09df638e6683", + + 星星爱消消:"wx9ff47d13a88e5511", + + 土耳其方块消消乐:"wx89efb2282d65a2d0", + + 成语小才子:"wxd4d478c7d331ce80", + + 球球蹦蹦蹦:"wxabee9afe62d0b114", + + 俄罗斯方块连连消:"wx4cd087f19f4cb7c3", + + 球球爆爆爆:"wxae33d68413f40641", + + 疯狂水果一刀切:"wxdf26a04c53d6f1e9" + + ```javascript + "navigateToMiniProgramAppIdList": [ + "wx26822126b4d99eda", + "wxac0750884d5bed0c", + "wx019a09df638e6683", + "wx9ff47d13a88e5511", + "wx89efb2282d65a2d0", + "wxd4d478c7d331ce80", + "wxabee9afe62d0b114", + "wx4cd087f19f4cb7c3", + "wxae33d68413f40641", + "wxdf26a04c53d6f1e9" + ] + ``` + + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_010.png "🔍点击查看大图") + + + + +#### **接入API:** + +| **名称** | **功能说明** | +| --------------------------- | ------------------------------------------------------------ | +| PCSDK.stat.bannerList | 根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型:40(悬浮框交叉推广位)、70(抽屉式交叉推广位)、50(猜你喜欢交叉推广位) | +| PCSDK.stat.bannerNavigateTo | 交叉推广位点击跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram) | +| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK内部会在onHide时候上报数据到后台 | + + + +1. ##### **bannerList** + + ```javascript + PCSDK.stat.loadingFinish(banner_type): Promise + ``` + + 定义:根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型 + + 参数: + + ``` + 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" + } + } + ] + } + + ``` + + > **返回的数据banner_list列表解析为 Array< BannerData >,BannerData是banner_list每一项数据实体,下面的bannerNavigateTo与addExposure接口api参数banner_data属于此BannerData结构**。 + + 示例: + + ```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. ##### **bannerNavigateTo** + + ```javascript + PCSDK.stat.bannerNavigateTo( location:number, banner_data: any, opts?: { extraData?: string; envVersion?: string }): Promise + ``` + + 定义:交叉推广位点击游戏跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram), 第三个参数配置可参考[wx.navigateToMiniProgram extraData、envVersion配置信息](https://developers.weixin.qq.com/minigame/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html) + + 参数: + + ```javascript + 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用户信息 + /** + * 演示交叉推广位使用示例 + */ + 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. ##### **addExposure** + + ```javascript + PCSDK.stat.addExposure( location: number, banner_data: Array< any > | any ): void + ``` + + 定义:对一个或者多个展示的推广位添加曝光,SDK在onHide时候上报曝光数据到后台,后台进行统计查阅 + + 参数: + + ```javascript + location: number 必传,统一传递为:100 + + banner_data:any 必传,添加展推广位曝光数据,可添加一个或者多个曝光数据,banner_data参数数据结构为上面bannerList api返回的列表数据的项BannerData实体结构:Array | BannerData + + ``` + + > 提示: + > + > 展示猜你喜欢/抽屉式交叉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。 + > + > 展示悬浮框交叉推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api + + 示例:根据悬浮框交叉推广位类型调用PCSDK.stat.bannnerList接口获取悬浮框交叉推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。 + ```javascript + /** + * 演示交叉推广位使用示例 + */ +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/outer/stat_event.md b/outer/stat_event.md new file mode 100644 index 0000000..a811d33 --- /dev/null +++ b/outer/stat_event.md @@ -0,0 +1,153 @@ +# 自定义事件打点 + +------ + +#### **简介** + +自定义事件是噗嗤游戏为开发者提供的自助分析功能:事件触发去重人数、次数等信息。游戏的任意位置需要统计触达人数、次数等都可以使用事件来实现,后台提供分析数据可查看,并不局限于用户的行为事件。 + +#### **后台使用** + +接入自定义事件打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】可查看自定义事件次数、去重人数等详细信息(此功能需要管理员添加权限): + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_018.png "🔍点击查看大图") + + + +#### **接入必读** + +接入自定义事件打点前,请[前往后台](https://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枚举 + +```javascript +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 | 自定义事件打点,使用前请[前往后台](https://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, '主界面'); + PopwinMananger.I.openWin(SignPopwin); + } + + // 开始加载资源 + 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 + }); + } + + export enum EventKeys { + // 升级奖励, + LvUpRewards = 'lv_up_rewards', + // 点击主界面-签到, + FunctionSign = 'function_sign', + // 加载, + LoadingExhibition = 'loading_exhibition' + } + ``` diff --git a/outer/stat_level.md b/outer/stat_level.md new file mode 100644 index 0000000..255bdad --- /dev/null +++ b/outer/stat_level.md @@ -0,0 +1,297 @@ +# 关卡分析打点 + +------ + +#### **简介** + +关卡分析,为开发者提供小游戏详细的关卡数据,分析各关卡玩家的通关状况,帮助开发者从数据角度衡量游戏设计的合理性,调节难易度,观察各关卡道具使用情况和奖励获取状况,对比分析各个指标,通过量化玩家数据,提高游戏体验。 + +#### **后台使用** + +接入关卡分析接口后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【关卡分析】可查看关卡进入用户数据、失败次数、失败率、平均完成时间等): + +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_020.png "🔍点击查看大图") + + + +#### **接入API**: + +| **名称** | **功能说明** | +| ---------------- | ------------------------------------------------------------ | +| PCSDK.stat.logLevelRelive | 游戏关卡复活上报 | +| PCSDK.stat.logLevelHide | 游戏关卡onHide上报,在游戏界面注册wx.onHide事件,判断不属于复活、失败、成功状态下上报此数据 | +| PCSDK.stat.logLevelFail | 游戏关卡失败上报 | +| PCSDK.stat.logLevelWin | 游戏关卡成功上报 | +| PCSDK.stat.logMerge | 游戏二合一合成最高等级上报 | + + + +1. #### **logLevelRelive** + + ```javascript + PCSDK.stat.logLevelRelive(levelId: string | number , params?: { attr?: number, ext?: any } ): void + ``` + + 定义:关卡复活成功数据上报 + + 参数: + + ``` + levelId: string | number 必传,游戏关卡id + + params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext + { + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 + } + ``` + + [点此查看完整示例](stat_level.md#sample)如何添加关卡复活成功打点代码 + +2. #### **logLevelHide** + + ```javascript + PCSDK.stat.logLevelHide(levelId: string | number , params?: { attr?: number, ext?: any } ): void + ``` + 定义:监听游戏战斗界面onHide时上报关卡的数据。什么是界面onHide?[请详读微信小游戏wx.onHide](https://developers.weixin.qq.com/minigame/dev/api/base/app/life-cycle/wx.onHide.html) + 注意事项: + + > 1)游戏战斗界面监听平台的onHide事件,使用此api上报关卡onHide打点。 + > + > + + > 2)游戏战斗界面退出后,要移除onHide事件监听,避免在其他界面下,onHide时候执行此次上报。 + > + > + + > 3)一定要屏蔽游戏复活中、游戏失败、游戏通过成功状态,这三种状态下避免上报此打点,详看下面示例。 + + 参数: + + ``` + levelId: string | number 必传,游戏关卡id + + params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext + { + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 + } + ``` + [点此查看完整示例](stat_level.md#sample)如何添加关卡onHide打点代码 + +3. #### **logLevelFail** + + ```javascript + PCSDK.stat.logLevelFail(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void + ``` + + 定义:关卡失败数据上报 + + 参数: + + ``` + levelId: string | number 必传,游戏关卡id + + params: object 必传,关卡需要的其他参数 + { + ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒 + first: number 必传 是否第一次体验关卡,1是,0否 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 + } + ``` + [点此查看完整示例](stat_level.md#sample)如何添加关卡失败打点代码 + +4. #### **logLevelWin** + + ```javascript + PCSDK.stat.logLevelWin(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void + ``` + + 定义:关卡成功通关数据上报 + + 参数: + + ``` + levelId: string | number 必传,游戏关卡id + + params: object 必传,关卡需要的其他参数 + { + ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒 + first: number 必传 是否第一次体验关卡,1是,0否 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 + } + ``` +
完整示例,以上四个接口使用场景: +> SDK中监听了onHide事件,当游戏onHide时,SDK会发送事件名为'app.hide'的自定义事件,开发者可在代码中使用PCSDK.event.bindEvent监听该事件,使用PCSDK.event.removeEvent移除对应监听事件,[详细文档event模块文档请阅读event事件模块](evennt.md)。 + + ```javascript + /** + * 游戏界面 + **/ + exports class GameScene extends BaseView{ + // 关卡id + private missionId: number; + // 当前选中使用的枪支等级 + private currSelectGun: number; + // 游戏状态机 + private gameState: GameState; + // 关卡开始时间 + private enterTime: number; + + constructor(){ + this.gameState = GameState.Idle; + } + + // 游戏界面打开 + open(){ + super.open(); + this.gameState = GameState.Idle; + this.enterTime = new Date().getTime(); + this.addEvent(); + } + + // 游戏界面关闭 + close(){ + super.close(); + this.removeEvent(); + } + + // 添加游戏事件监听 + private addEvent(){ + // 监听SDK中app.hide事件事件消息 + PCSDK.event.bindEvent( 'app.hide', this.handleHide, this); + // 监听游戏中level.relive事件消息 + EventCenter.I.add('level.relive', this, this.handleLevelRelive); + } + + // 移除游戏事件监听 + private removeEvent(){ + PCSDK.event.removeEvent( 'app.hide', this.handleHide, this); + EventCenter.I.remove('level.relive', this, this.handleLevelRelive); + } + + // 游戏复活中 + private doGameRelive(){ + this.setState(GameState.Relive); + } + + // 游戏通关失败 + private doGameFail(){ + this.setState(GameState.Fail); + } + + // 游戏通关成功 + private doGameWin(){ + this.setState(GameState.Win); + } + + // SDK发出的app.hide事件监听 + private handleHide() { + // 战斗界面onHide上报logLevelHide(游戏通关成功、游戏通关失败、游戏复活中不进行上报logLevelHide打点) + if(!(this.isState(GameState.Win) || this.isState(GameState.Fail) || this.isState(GameState.Relive))) + PCSDK.stat.logLevelHide(this.missionId, { + attr: this.currSelectGun + }); + } + + // 监听关卡复活成功消息 + private handleLevelRelive(){ + // 关卡复活成功上报 + PCSDK.stat.logLevelRelive(this.missionId, { + attr: this.currSelectGun + }); + } + + private isState(state: GameState) { + return this.state === state; + } + + // 设置状态机 + private setState(state: GameState) { + if (this.isState(state)) return; + + this.state = state; + let costTime: number; // 关卡消耗时间 + let failNum: number; // 关卡失败次数 + switch (state) { + case GameState.Win: // 处理成功 + // 关卡成功上报 + costTime = new Date().getTime() - this.enterTime; + failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId); + PCSDK.stat.logLevelWin(this.missionId, { + ctime: costTime, + first: failNum ? 0 : 1, + attr: this.currSelectGun, + ext: { + currHp: 100000 + } + }); + break; + + case GameState.Fail: // 处理失败 + // 关卡失败上报 + costTime = new Date().getTime() - this.enterTime; + failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId); + PCSDK.stat.logLevelFail(this.missionId, { + ctime: costTime, + first: failNum ? 0 : 1, + attr: this.currSelectGun + }); + break; + + case GameState.Relive:// 处理复活中 + // 弹出复活操作界面 + PopWinManager.I.openPopwin(RelivePopwinn); + break; + } + } + } + + /** + * 复活界面 + **/ + exports class RelivePopwinn extends BaseView{ + // 复活界面关闭 + close(){ + super.close(); + // 关闭模拟:复活成功,发送复活成功消息 + EventCenter.I.emit('level.relive'); + } + } + + // 游戏状态状态机 + enum GameState{ + Idle, // 初始状态 + Fail, // 失败状态 + Win, // 成功通关状态 + Relive // 正在复活状态 + } + ``` + +5. #### **logMerge** + + ```javascript + PCSDK.stat.logMerge(mergeLv: number): void + ``` + + 定义:游戏二合一合成最高等级上报 + + 参数: + + ``` + mergeLv: number 必传,二合一合成最高等级 + ``` + + 示例:二合一部分,合成最高等级时候上报 + + ```javascript + // 合成最新等级合成 + private handleMergeLastestLv(lastestLv: number){ + // 合成最新等级上报 + PCSDK.stat.logMerge( lastestLv ); + } + ``` + + \ No newline at end of file diff --git a/outer/stat_pay.md b/outer/stat_pay.md new file mode 100644 index 0000000..f7c8ff0 --- /dev/null +++ b/outer/stat_pay.md @@ -0,0 +1,112 @@ +# 支付结果打点 + +------ + +#### **简介** + +支付上报,是开发者使用米大师或者第三方其他支付(比如H5支付),支付回调后把支付结果(失败支付、成功支付、取消支付)上报到后台。 + +#### **注意事项** + +{% em %} 使用api,需在[config.js中配置MidasPay](install.md#configJs)信息。 {% endem %} + +**MidasPay( object )配置:**米大师虚拟支付配置,请注意下面规则 + + OfferId:在米大师申请的应用id,没有接入米大师,默认为"0" + + ZoneId:分区ID,默认:"1" + + Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game" + + CurrencyType:币种,默认:"CNY" + + Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。 + + 1)接入了米大师,填写"android"(ios暂时没有开放) + + 2)未接入米大师,使用其他支付,如果只支持android,则填写"android"; + + 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios"; + + 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios + + + +#### **接入API:** + +| **名称** | **功能说明** | +| ------------------------ | ------------------------------------------------------------ | +| PCSDK.stat.logPay | 开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付) | + + +1. **logPay** + + ```javascript + PCSDK.stat.logPay( params: object ): void + ``` + + 定义:开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付)。该api需在[config.js中配置MidasPay](install.md#configJs)信息。 + + 参数: + + ``` + params object 必传 打点参数 + { + type: number 必传 支付类型:0(支付失败),1(支付成功),-1(取消支付); + source: string 必传 游戏服务商生成的订单号,没有则为空字符串 + amount: number 必传 实际支付金额,单位分 + buy_id: string | number; 必传 商品ID + buy_name: string; 必传 商品名称 + item_info: string 必传 获得的道具内容:道具id及数量,逗号分隔,多项使用分号分隔 => 1,1;2,10;3,100 + } + ``` + 返回值: + + ``` + void + 无 + ``` + + 示例:客户端游戏支付完成后上报支付打点,下例只是演示logPay用法 + + ```javascript + private reqPay() { + // 模拟的支付,开发者需更加实际接入支付 + Api.I.pay().then( ret => { + switch(ret.code){ + case 1: // 支付成功回调处理 + PCSDK.stat.logPay({ + type: 1, // 成功支付 + source: "10000400", // 订单号,没有则为空字符串 + amount: 10 * 100, // 10元 + buy_id: 58, // 支付的商品id + buy_name: "钻石*152,金币*188888888", + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90 + }); + break; + + case 0: // 支付失败回调处理 + PCSDK.stat.logPay({ + type: 0, // 失败支付 + source: "10000400", // 订单号,没有则为空字符串 + amount: 10 * 100, // 10元 + buy_id: 58, // 支付的商品id + buy_name: "钻石*152,金币*188888888", + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90 + }); + break; + + case -1: // 支付取消回调处理 + PCSDK.stat.logPay({ + type: -1, // 取消支付 + source: "10000400", // 订单号,没有则为空字符串 + amount: 10 * 100, // 10元 + buy_id: 58, // 支付的商品id + buy_name: "钻石*152,金币*188888888", + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90 + }); + break; + } + }); + } + ``` \ No newline at end of file diff --git a/outer/styles/website.css b/outer/styles/website.css new file mode 100644 index 0000000..7d92dfd --- /dev/null +++ b/outer/styles/website.css @@ -0,0 +1,68 @@ +/* CSS for website */ +h1 , h2{ + border-bottom: 1px solid #EFEAEA; + padding-bottom: 3px; +} +.markdown-section>:first-child { + margin-top: 0!important; +} +.page-wrapper { + margin-top: -1.275em; +} +.book .book-body .page-wrapper .page-inner section.normal { + min-height:350px; + margin-bottom: 30px; +} + +.book .book-body .page-wrapper .page-inner section.normal hr { + height: 0px; + padding: 0; + margin: 1.7em 0; + overflow: hidden; + background-color: #e7e7e7; + border-bottom: 1px dotted #e7e7e7; +} + +.video-js { + width:100%; + height: 100%; +} + +pre[class*="language-"] { + border: none; + background-color: #f7f7f7; + /* font-size: 1em; */ + line-height: 1.2em; +} + +.book .book-body .page-wrapper .page-inner section.normal { + font-size: 16px; + font-family: "ubuntu", "Tahoma", "Microsoft YaHei", arial, sans-serif; +} + +.aceCode { + font-size: 14px !important; +} + +input[type=checkbox]{ + margin-left: -2em; +} + +.page-footer span{ + font-size: 12px; +} + +.page-footer .copyright { + float: left; +} + +.body, html { + overflow-y: hidden; +} + +.versions-select select { + height: 2em; + line-height: 2em; + border-radius: 4px; + background: #efefef; +} diff --git a/platform.md b/platform.md deleted file mode 100644 index 65ab0ba..0000000 --- a/platform.md +++ /dev/null @@ -1,577 +0,0 @@ -# 多平台接口模块:PCSDK.platform - ------- - -#### **简介** - -所谓多平台指的是微信小游戏、QQ轻游戏、今日头条、oppo等游戏发布的平台。微信和QQ接口文档api相似度99%,微信、QQ、今日头条平台的接口api相似度80%以上,虽然相似度很高,但是仍需要针对差异性做一些处理。多平台接口模块就是想要在SDK内部去抹平了各个平台差异性的处理,达到同一个api调用,应用多个平台的作用。 - -#### **此模块是参照微信小游戏提供的api进行封装的公用方法,提供了以下游戏中常用到的功能:** - -2. **打开客服消息:openCustomerServiceConversation** 整理来自[wx.openCustomerServiceConversation](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html) - -3. **检测版本更新:checkUpdate** 整理来自:[wx.getUpdateManager](https://developers.weixin.qq.com/minigame/dev/api/base/update/UpdateManager.html) -4. **显示模态弹出框:showModal** 整理来自:[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html) -5. **复制文本:copy** 整理来自:[wx.setClipboardData](https://developers.weixin.qq.com/minigame/dev/api/device/clipboard/wx.setClipboardData.html) -6. **长震动:vibrateLong** 整理来自:[wx.vibrateLong](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateLong.html) -7. **短震动:vibrateShort** 整理来自:[wx.vibrateShort](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateShort.html) -9. **微信小游戏推荐弹窗组件GamePortal:isGamePortalPlaying 与 gamePortalShow** 整理来自:[wx.createGamePortal](https://developers.weixin.qq.com/minigame/dev/api/game-portal/GameBanner.html) -10. **微信小游戏插屏广告组件InterstitialAd:isInterstitialPlaying 与 interstitialShow** 整理来自:[wx.createInterstitialAd](https://developers.weixin.qq.com/minigame/dev/api/ad/InterstitialAd.html) -11. **微信小游戏推荐icon组件GameIcon:gameIconShow 与 gameIconDestroy** 整理来自:[wx.createGameIcon](https://developers.weixin.qq.com/minigame/dev/api/game-portal/wx.createGameIcon.html) - - - -#### **接入API:** - -| **名称** | **功能说明** | -| ------------------------ | ------------------------------------------------------------ | -| PCSDK.platform.openCustomerServiceConversation | 进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力、钻石和进入跳转充值等,[具体用法请看](platform.md#service)| -| PCSDK.platform.checkUpdate | 检测版本是否有更新,如果版本更新会弹出确认框 | -| PCSDK.platform.copy | 设置系统剪贴板的内容。微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s | -| PCSDK.platform.vibrateShort | 使手机发生较短时间的振动(15 ms) | -| PCSDK.platform.vibrateLong | 使手机发生较长时间的振动(400 ms) | -| PCSDK.platform.gamePortalShow | 传入adUnitId创建并展示小游戏推荐弹窗组件 | -| PCSDK.platform.isGamePortalPlaying | 是否正在加载小游戏推荐弹窗组件 | -| PCSDK.platform.interstitialShow | 传入adUnitId创建并展示小游戏插屏广告组件 | -| PCSDK.platform.isInterstitialPlaying | 是否正在加载小游戏插屏广告组件 | -| PCSDK.platform.gameIconShow | 创建并显示小游戏推荐icon组件 | -| PCSDK.platform.gameIconDestroy | 销毁正在展示的小游戏推荐icon组件 | - - - - - -
- -2. **openCustomerServiceConversation** - - ```javascript - PCSDK.platform.openCustomerServiceConversation( params?: _CustomerServiceConversationObject ): void - ``` - - 定义:进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力和进入跳转充值 - - 参数: - - ```javascript - params _CustomerServiceConversationObject 选传,不传递打开一个普通的客户会话。[参数说明参照](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html) - { - sessionFrom string 选传 会话来源 - showMessageCard boolean 选传 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息 - sendMessageTitle string 选传 会话内消息卡片标题 - sendMessagePath string 选传 会话内消息卡片路径 - sendMessageImg string 选传 会话内消息卡片图片路径 - success function 选传 接口调用成功的回调函数 - fail function 选传 接口调用失败的回调函数 - complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行) - } - ``` - 返回值: - - ``` - void - 无 - ``` - - 示例1:进入普通的客服会话 - - ```javascript - PCSDK.platform.openCustomerServiceConversation(); - ``` - 示例2:应用场景如进入客服会话跳转领取体力、钻石等等: 示例为跳转客服领取18888钻石奖励,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断)。 - - ```javascript - // 跳转客服领取18888钻石奖励,开发者可根据示例修改 - PCSDK.platform.openCustomerServiceConversation({ - showMessageCard: true, - sendMessageTitle: '钻石已发送,点击领取钻石!', - sendMessagePath: '', - sendMessageImg: 'http://dep.miso-lab.com/mergeguns/bin/res/image/service_reward.png', // 图片icon对应的域名记得加入到request和download白名单中 - success: () => { - // 打开跳转客服成功,记录成功状态,在游戏全局注册的onShow监听通过判断这个状态去请求接口领取奖励 - // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改 - AppDataManager.I.set('service.reward.data', { - status: 1, // 可以领奖 - reward: 18888 // 获得18888钻石 - }); - }, - fail: (err) => { - console.log("openCustomerServiceConversation fail: ", err); - } - }); - // 在游戏中全局注册的onShow事件监听中检测是 - // 游戏入口:Main.cs - class Main { - constructor() { - this.init(); - } - - private init() { - PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this)); - PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this)); - } - - private onShow(opts) { - // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断 - let serviceRewardData = AppDataManager.I.get('service.reward.data'); - if (serviceRewardData && serviceRewardData.status === 1) { - AppDataManager.I.set('service.reward.data', null); - // 奖励发放,处理发放后的逻辑,比如每天只能领取一次的记录,防止重复刷奖励 - } - } - - private onHide(){ - // 监听平台的onHide事件 - } - } - ``` - 示例3:应用场景例如进入客服会话,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断),点击右下角的充值按钮后,跳转充值,充值完成后在onShow中处理:需要后台提供api接口,验证充值合理性并发放奖励,**此接口需要后端支持**。 - - ```javascript - // 跳转客服充值,开发者可根据示例修改,sendMessagePath请严格按照示例中提供的参数 - /** - * 充值跳转客服 - * @param itemId 购买道具商品id - * @param money 购买商品花费,单位元 - */ - private openServiceWithItem(itemId: number, money: number) { - PCSDK.platform.openCustomerServiceConversation({ - showMessageCard: true, - sendMessageTitle: `充值${money}元`, - sendMessagePath: `channel=${PCSDK.data.ChannelId}&item=${itemId}&uid=${PCSDK.data.UserId}&pf=${PCSDK.data.SystemId}`, - sendMessageImg: 'http://dep.miso-lab.com/idiom/bin/share/pay.png', // 图片icon对应的域名记得加入到request和download白名单中 - success: () => { - // 打开跳转客服成功,记录成功状态,onShow通过判断这个状态去请求接口领取奖励 - // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改 - AppDataManager.I.set('service.pay.data', { - status: 1, // 可以领奖 - itemId: itemId, // 购买道具商品id - money: money // 购买商品花费,单位元 - }); - }, - fail: (err) => { - console.log("openCustomerServiceConversation fail: ", err); - } - }); - } - - // 在游戏中全局注册的onShow事件监听中检测是 - // 游戏入口:Main.cs - class Main { - constructor() { - this.init(); - } - - private init() { - PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this)); - PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this)); - } - - private onShow(opts) { - // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断 - let serviceRewardData = AppDataManager.I.get('service.pay.data'); - if (serviceRewardData && serviceRewardData.status === 1) { - AppDataManager.I.set('service.pay.data', null); - // 领取奖励的逻辑,比如每天只能领取一次的记录,防止重复刷奖励 - // 请求后端接口验证奖励合理性 - } - } - - private onHide(){ - // 监听平台的onHide事件 - } - } - ``` -
-3. **checkUpdate** - - ```javascript - PCSDK.platform.checkUpdate( params?: _ShowModalObject ): void - ``` - 定义:检测版本是否有更新,如果版本有更新会弹出确认框,参数可不传递,不传递有版本更新会弹出下图的默认确认框;开发者可自定义弹出框的显示样式,参数与[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html)一模一样。 - 建议此api在游戏的入口调用。 - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_029.png "🔍点击查看大图") - - 参数: - - ```javascript - params _ShowModalObject 选传 不传递有版本更新会弹出上图样式默认确认框;开发者可自定义弹出框的显示样式,参数参照wx.showModal的参数 - { - title string 选传 提示的标题,默认为:更新提示 - content string 选传 提示的内容,默认为:新版本已经准备好,是否重启应用? - showCancel boolean 选传 是否显示取消按钮,默认为:false不显示 - cancelText string 选传 取消按钮的文字,最多4个字符 - cancelColor string 选传 取消按钮的文字颜色,必须是16进制格式的颜色字符串 - confirmText string 选传 确认按钮的文字,最多4个字符 - confirmColor string 选传 确认按钮的文字颜色,必须是16进制格式的颜色字符串 - success function 选传 接口调用成功的回调函数 - fail function 选传 接口调用失败的回调函数 - complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行) - } - ``` - 返回值: - - ``` - void - 无 - ``` - - 示例:在游戏入口类中检测是否有版本更新 - - 1)、依照下面的示例接入checkUpdate api - - ```javascript - class Main { - constructor() { - this.init(); - } - - private init() { - this.checkUpdate(); - } - - private checkUpdate() { - // 调用SDK的checkUpdate,微信版本有更新,会自动弹出更新确认框 - PCSDK.platform.checkUpdate(); - - // 自定义更新弹出框 - /* - PCSDK.platform.checkUpdate({ - showCancel: true, - content: '客官,xxx游戏有更新了!', - cancelText: '放弃' - }); - */ - } - } - - ``` - 2)、接入代码完毕后,按照下图的操作本地开发工具调试是否接入成功。 - - I、选择:添加编译模式。 - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_030.png "🔍点击查看大图") - II、选择:自定义模式名称、勾选下次编译时模拟更新、选择模拟成功还是失败状态,点击确定。 - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_031.png "🔍点击查看大图") - III、开发工具会自动重新启动游戏,弹出更新框,看到弹出框接入成功。 - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_032.png "🔍点击查看大图") -
-4. **copy** - - ```javascript - PCSDK.platform.copy( str: string ): Promise - ``` - 定义:设置系统剪贴板的内容。提示:微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s - - 参数: - - ```javascript - str string 必传 剪贴板的内容 - - ``` - 返回值: - - ``` - Promise - Promise resolve复制系统剪贴板内容成功回调,reject失败回调 - ``` - - 示例: - - ```javascript - PCSDK.platform.copy('这是我想要复制的内容') - .then( ret => { - // 打印复制的内容 - console.log(ret.data); - }) - .catch(err => { - console.warn('复制失败', err); - }); - ``` -
-4. **vibrateShort** -```javascript - PCSDK.platform.vibrateShort(): Promise -``` -定义:使手机发生较短时间的振动(15 ms)。仅在 iPhone 7 / 7 Plus 以上及 Android 机型生效 -参数: - - ```javascript - 无 - ``` -示例: - - ```javascript - PCSDK.platform.vibrateShort(); - - ``` -5. **vibrateLong** - - ```javascript - PCSDK.platform.vibrateLong(): Promise - ``` - 定义:使手机发生较长时间的振动(400 ms) - 参数: - ```javascript - 无 - ``` - 示例: - ```javascript - PCSDK.platform.vibrateLong(); - ``` -
-6. **gamePortalShow** - ```javascript - PCSDK.platform.gamePortalShow(adUnitId: string): Promise - ``` - 定义:传入adUnitId创建并展示小游戏推荐弹窗组件,Promise resolve创建展示成功回调,reject创建失败回调。 - - 参数: - ```javascript - adUnitId string 必传 小游戏推荐弹窗组件推荐单元id - ``` - 返回值: - ```javascript - Promise - Promise resolve创建展示成功回调,reject创建失败回调 - ``` - 示例: - ```javascript - // 例子1:显示弹窗组件 - let adUnitId: string = 'PBgAAgPWNXGtCwcA'; - PCSDK.platform.gamePortalShow(adUnitId); - - // 例子2:显示推荐弹窗组件,如果显示不成功,则显示小游戏插屏广告,插屏广告api使用请继续往下看。 - let adUnitId: string = 'PBgAAgPWNXGtCwcA'; - PCSDK.platform.gamePortalShow(adUnitId).catch(err => { - // 推荐弹窗组件显示不成功显示插屏广告 - adUnitId = 'adunit-4da0ec77513f8eea'; - PCSDK.platform.interstitialShow(adUnitId); - }); - - ``` -7. **isGamePortalPlaying** - - ```javascript - PCSDK.platform.isGamePortalPlaying(): boolean - ``` - - 定义:是否正在加载小游戏推荐弹窗组件;在PCSDK.platform.gamePortalShow api内部,如果正在创建弹窗组件会在Promise reject返回错误提示信息。 - - 参数: - - ```javascript - 无 - ``` - 返回值: - - ```javascript - boolean - ``` - - 示例: - - ```javascript - let isPlaying = PCSDK.platform.isGamePortalPlaying(); - - ``` -
-8. **interstitialShow** - - ```javascript - PCSDK.platform.interstitialShow(adUnitId: string): Promise - ``` - - 定义:传入adUnitId创建并展示小游戏插屏广告组件,Promise resolve创建展示成功回调,reject创建失败回调 - - 参数: - - ```javascript - adUnitId string 必传 小游戏插屏广告组件广告单元id - ``` - 返回值: - - ```javascript - Promise - Promise resolve创建展示成功回调,reject创建失败回调 - ``` - - 示例: - - ```javascript - // 例子1:显示插屏广告组件 - let adUnitId: string = 'adunit-4da0ec77513f8eea'; - PCSDK.platform.interstitialShow(adUnitId); - - // 例子2:显示插屏广告组件,如果显示不成功,则显示小游戏推荐弹窗组件。 - let adUnitId: string = 'adunit-4da0ec77513f8eea'; - PCSDK.platform.interstitialShow(adUnitId).catch( err => { - // 加载不成功显示小游戏推荐弹窗组件 - adUnitId = 'PBgAAgPWNXGtCwcA'; - PCSDK.platform.gamePortalShow(adUnitId); - }); - ``` -9. **isInterstitialPlaying** - - ```javascript - PCSDK.platform.isInterstitialPlaying(): boolean - ``` - - 定义:是否正在加载小游戏插屏广告组件;在PCSDK.platform.interstitialShow如果正在创建插屏广告会在Promise reject返回错误提示信息。 - - 参数: - - ```javascript - 无 - ``` - 返回值: - - ```javascript - boolean - ``` - - 示例: - - ```javascript - let isPlaying = PCSDK.platform.isInterstitialPlaying(); - - ``` -
-10. **gameIconShow** - ```javascript - PCSDK.platform.gameIconShow(adUnitId: string, opts: { count: number, style: Array<_GameIconStyleItem> }): Promise - ``` - - 定义:创建并显示小游戏推荐icon组件。 - - 参数: - - ```javascript - adUnitId string 必传 小游戏推荐icon组件广告单元id - opts object 必传 扩展参数,目前支持count和style两个属性值 - { - count number 必传 游戏icon的数量,请注意,正式版下面渲染出来的icon数量会小于等于count,请注册做好样式兼容 - style Array<_GameIconStyleItem> 必传 数组的每一项可以针对对应的icon设置位置和样式等信息,style的每一项称为_GameIconStyleItem - } - - Object _GameIconStyleItem:单个游戏icon的位置和样式信息 - { - appNameHidden boolean 必传 游戏名称是否隐藏 - color string 必传 游戏名称的颜色色值 - size number 必传 游戏icon的宽高值 - borderWidth number 必传 游戏icon的border尺寸 - borderColor string 必传 游戏icon的border颜色色值 - left number 必传 游戏icon的X轴坐标 - top number 必传 游戏icon的Y轴坐标 - } - ``` - 返回值: - - ```javascript - Promise - Promise resolve创建展示成功回调,reject创建失败回调 - ``` - - 示例: - - ```javascript - // 显示1个推荐icon组件 - private showGameIcon(){ - let adUnitId: string = 'PBgAAgPWNXGkQ4p0'; - let {windowWidth} = PCSDK.platform.getSystemData(); - PCSDK.platform.gameIconShow(adUnitId, { - count: 1, - style: [ - { - appNameHidden: false, - color: "#FF0000", - size: 50, - borderWidth: 0, - borderColor: "#FF0000", - left: (windowWidth / 750) * 550, - top: (windowWidth / 750) * 150 - } - ] - }) - .then(() => { - // console.warn('显示GameIcon成功'); - }) - .catch((err) => { - // console.warn('显示GameIcon失败'); - }); - } - - ``` -11. **gameIconDestroy** - - ```javascript - PCSDK.platform.gameIconDestroy(): void - ``` - - 定义:销毁正在展示的小游戏推荐icon组件。展示推荐icon组件广告后,请记得在页面关闭时候调用此api销毁GameIcon。 - - 参数: - - ```javascript - 无 - ``` - 返回值: - - ```javascript - void - ``` - - 示例: - - ```javascript - - private open(){ - super.open(); - this.showGameIcon(); - } - - private close(){ - super.close(); - this.destoryGameIcon(); - } - - // 显示2个推荐icon组件 - private showGameIcon(){ - let adUnitId: string = 'PBgAAgPWNXGkQ4p0'; - let {windowWidth} = PCSDK.platform.getSystemData(); - PCSDK.platform.gameIconShow(adUnitId, { - count: 2, - style: [ - { - appNameHidden: false, - color: "#FF0000", - size: 50, - borderWidth: 0, - borderColor: "#FF0000", - left: (windowWidth / 750) * 450, - top: (windowWidth / 750) * 150 - }, - { - appNameHidden: false, - color: "#FF0000", - size: 50, - borderWidth: 0, - borderColor: "#FF0000", - left: (windowWidth / 750) * 550, - top: (windowWidth / 750) * 150 - } - ] - }) - .then(() => { - // console.warn('显示GameIcon成功'); - }) - .catch((err) => { - // console.warn('显示GameIcon失败'); - }); - } - - // 销毁展示创建的GameIcon组件 - private destoryGameIcon(){ - PCSDK.platform.gameIconDestroy(); - } - - ``` \ No newline at end of file diff --git a/share.md b/share.md deleted file mode 100644 index 2f52757..0000000 --- a/share.md +++ /dev/null @@ -1,539 +0,0 @@ - -# 分享视频模块 - ------- - -#### **简介** -小游戏生态中,普遍把平台提供的分享/视频接口更多用于某个奖励领取、获取n倍奖励、游戏死亡复活、转盘额外次数获得等等一种有效途径(分享:拉取新用户,视频:赚钱广告费);噗嗤游戏在分享or视频推送不断的探索迭代中,总结了一套分享/视频积分策略,集成在SDK中开放给开发者,开发者只需对游戏中分享视频功能点命名一个英文名称key(分享视频key),这个key关联分享文案、分享图、分享开关(推送类型)、视频uid等等在后台配置好,使用SDK提供的一个dispatch api传入英文名称key即可完成接入工作。 - -- 分享/视频配置可以让开发者在后台中动态修改相关功能点的分享/视频配置内容。 - -- 新增某个功能的分享点配置、在线修改相关功能点的分享图或文案、在线切换某个功能点按钮的分享/视频推送类型。 - -- 调用SDK的dispatch api,dispatch会根据后台配置的分享开关(推送类型)自动进行分发:推送分享还是视频全权交由SDK去处理,开发者只需要传入成功/失败回调函数,成功回调函数处理发放领取奖励、n倍奖励、成功复活等操作,失败回调函数处理参数传递的msg信息。 - -#### **疑惑解答** -1. 为什么要引入这个模块? - - > 游戏中很多n倍奖励、复活、额外奖励等功能点通常需要分享或者视频才能额外获得,游戏上线后,运营很有可能会对某些功能点有额外的需求修改:a功能点获取由分享改成视频方式获取、b功能点由视频改成分享方式获取、c功能点需要在前面n次看视频获得后全是分享获得、为某某功能的分享图想换一个、拉取视频不成功自动切换分享等等;为了应对这些不同情形,我们把分享和视频点包装成一个模块,a功能点也不在局限于只是简单的分享、b功能只是视频,而是通过后台分享开关去灵活切换。所有功能点入口调用都是使用dispatch,每个功能点都是转化为一个分享视频key在后台管理。 - -2. 什么是分享视频key? - - > 分享视频key是一个功能点的英文名称,这个key配置在后台中,关联分享文案、分享图、分享开关(推送类型)、视频uid等等信息。某个功能点(不论是分享还是视频方式)调用dispatch传入这个key,SDK会读取这个key关联的信息,根据分享开关(推送类型)来推送分享(需要分享文案、分享图)还是推送视频(需要视频uid)。 - -3. 什么是分享视频分发? - - > 调用dispatch api传入分享视频key,SDK会查找这个key在后台配置的数据,SDK读取数据中分享开关(推送类型)的字段信息,通过这个开关类型来判断推给用户是分享还是视频,这个根据类型来推送的操作就是分发操作。 - -4. 游戏中之前是玩家分享n次后变成看视频或者是看视频n次后全是分享,dispatch能满足吗? - - > 上面的问题dispatch也同样支持,还是同样的调用方式,不需要做其他额外处理,dispatch是怎么做到的了:分享开关(推送类型)有一个分享积分选择项,这个选项就是通过积分策略实现了上面问题。 - > - - -#### **后台使用** - -配置分享视频配置,登录后台->头部tab切换到【游戏数据】->【配置相关】->【分享/视频配置】可新增、编辑修改分享/视频内容: - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_023.png "🔍点击查看大图") - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_024.png "🔍点击查看大图") - -接入分享视频模块后,后台已经对分享和视频数据分别进行整理统计了,游戏接入方可实时查看分享/视频的各项数据: - -查看分享分析,登录后台->头部tab切换到【游戏数据】->【产品分析】->【分享分析】可阅览游戏分享数据的各项统计: - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_025.png "🔍点击查看大图") - -查看视频广告详情,登录后台->头部tab切换到【游戏数据】->【配置相关】->【视频广告详情】可阅览游戏各个功能点视频数据统计: - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_026.png "🔍点击查看大图") - - - -#### **接入必读** - -- 接入此模块前,请[**前往sdk/config.js文件中配置【IsUseShareModule: true 】开启分享视频模块功能**](install.md#config_env),此参数配置为true,才能正常使用此模块的功能,SDK启动时会自动拉取后台配置所有功能点的分享/视频配置列表。 - -- 微信小游戏开发者接入此模块,如果游戏有很多分享点,提审时避免触犯微信平台的[滥用分享行为](https://developers.weixin.qq.com/minigame/product/#_5-1-滥用分享行为),在后台【配置参数】中配置了一个SDK内部使用的[配置参数](online.md)share_unlock,进行分享开关切换:1(开启)0(关闭),提审时设置为0,审核通过后设为1。share_unlock设置为0,所有的功能点不会分享完成、拉起看完视频后发放奖励,而是直接发放奖励,这样就能避免审核时,如果是推送分享拉起分享,被微信认为是诱导分享,被拒的可能性。 - -- sdk/config.js的配置参数ShareRightKey,表示右上角分享的分享视频key,请配置到后台【分享/视频配置】中。如果ShareRightKey配置不为空,SDK会自动调用微信的右上角分享接口(wx.onShareAppMessage),实现右上角分享功能,注意的是开发者在游戏中已经有注册wx.onShareAppMessage需要删除掉,不然游戏中onShareAppMessage的注册事件会把SDK中的注册事件处理函数覆盖掉,导致还是使用的是开发者注册的右上角分享功能。 - -- sdk/config.js的配置参数ShareData表示默认分享视频配置,此条配置应用在两种情况下: - - > 1、请求功能点的分享/视频配置列表出错,使用key去查找对应的分享配置肯定是查找不到的,会读取此条默认数据。 - > - > - > - > 2、请求功能点的分享/视频配置列表成功了,但是这个key没有配置到后台,也会读取此条默认数据 - -#### **接入**API: - -| **名称** | **功能说明** | -| ------------------------------- | ------------------------------------------------------------ | -| PCSDK.shareVideo.share | 普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 | -| PCSDK.shareVideo.dispatch | 分享视频分发入口,传入功能点英文命名的分享/视频key | -| PCSDK.shareVideo.getShareVideoType | 根据功能点在后台配置的分享/视频key,得到此功能点分享开关(推送类型)SDK计算得到最终推送类型:-1(无视频无分享)、0(分享)、1(异步分享)、5(分享积分)、2(视频)、3(无视频则分享)、4(视频和分享)(控制分享和视频两个按钮的显示) | - - - -1. ##### **share** - - ```javascript - PCSDK.shareVideo.share(key:sring, params?: any, opts?: any): void - ``` - - 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 - - 参数: - - ```javascript - key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key) - - params: object 选传 扩展参数:分享链接query携带自定义参数,{ key: value }对象形式,该对象传递的参数会与SDK内部query参数一起组成query(查询参数, key1=val1&key2=val2的格式)的值,SDK内部参数key有:channel_id、user_invite_uid、share_id、share_key。 - - 提示:params传递的对象中如果含有传递SDK内部query参数key,会被SDK内部参数值覆盖,所以开发者避免传递这些key。 - - opts: object 选传 可不传递 - - ``` - - 返回值: - - ```javascript - void - ``` - - 示例:游戏首页分享到群的功能,假如config.js配置的ChannelId: 20024;后台配置的分享视频key: home_share2group、此分享key的id:512;用户id:100000。 - - ```javascript - // 示例1: - // 分享后生成的query:share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000 - PCSDK.shareVideo.share( 'home_share2group' ); - - // 示例2:第二个参数是分享生成的query携带的参数 - // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000 - PCSDK.shareVideo.share( 'home_share2group', { - type:99 - }); - - // 示例3:第二个参数是分享生成的query携带的参数,传递SDK内部query参数:channel_id - // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000 - PCSDK.shareVideo.share( 'home_share2group', { - type:99, - channel_id:10000 - }); - ``` - -2. ##### **dispatch** - - ```javascript - PCSDK.shareVideo.dispatch( key: string, params?: { success: Function, fail: Function, context?: any} ): void - ``` - - 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 - - 参数: - - ```javascript - key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key) - - params: object 选传 扩展参数:success分享视频成功回调处理函数,fail分享视频失败回调处理函数,contex函数执行上下文 - { - success: ( from:number, ret: any | null ) => void, - error: ( from:number, error: object | null ) => void, - context: any - } - - from:此次分发成功推送类型 - from返回枚举值为: - 0:无视频无分享(后台配置分享开关(推送类型)or 应对审核分享关闭:配置参数share_unlock设置为0) - 1:推送同步分享 - 2:推送异步分享 - 3:推送视频 - - error:此次分发失败的错误消息 - error返回枚举值为: - { code: 1000, msg: '要看完视频哦!' }, - { code: 1001, msg: '视频加载失败!' }, - { code: 999, msg: '视频UID不存在!' }, - { code: 1002, msg: '视频组件未开放!' }, - { code: 1003, msg: '正在观看视频中...' }, - { code: 1004, msg: '分享失败,请尝试发送至不同群!' }, - { code: 1005, msg: '别总骚扰这个群,换个群分享吧!' }, - { code: 1006, msg: '请分享到群哦!' }, - { code: 1007, msg: '分享到群才能领取更多~' }, - { code: 1008, msg: '分享失败,请尝试发送至不同群!' }, - { code: 1009, msg: '今日已达分享上限次数,请明日再来' } - ``` - - 返回值: - - ```javascript - void - ``` - - 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。 - - 演示 - - ```javascript - // DiamondDoublePopwin.ts文件 - export default class DiamondDoublePopwin extends BaseView{ - protected addEvent() { - super.addEvent(); - // 免费领取双倍(应对微信审核,审核分享不能开放时候使用) - this.btnFree.on(Laya.Event.CLICK, this, this.onReward); - // 分享双倍 - this.btnShare.on(Laya.Event.CLICK, this, this.onReward); - // 视频双倍 - this.btnVideo.on(Laya.Event.CLICK, this, this.onReward); - } - - protected removeEvent() { - super.removeEvent(); - this.btnFree.off(Laya.Event.CLICK, this, this.onReward); - this.btnShare.off(Laya.Event.CLICK, this, this.onReward); - this.btnVideo.off(Laya.Event.CLICK, this, this.onReward); - } - - // 领取奖励操作 - private onReward(){ - PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), { - success: this.handleReward, - fail: this.handleError, - context: this - } ); - } - - // 分享/视频成功后回调处理函数:发奖励 - private handleReward(from: ShareVideoFrom, ret: any | null){ - // 分享成功、视频成功、无视频无分享 - } - - // 分享/视频失败后回调处理函数:弹出提示 - private handleError(from: ShareVideoFrom, error: any | null){ - // 返回错误,处理错误msg信息,自定义处理 - if( error ){ - wx.showToast({ - title: error.msg - }); - } - } - } - - // Enums.ts文件 - // 分享视频key枚举,每个key表示一个功能点 - enum ShareVideoKeys { - // 钻石双倍获取 - DiamondDouble = 'diamond_double', - // 失败获得双倍奖励 - FailRewardDouble = 'fail_reward_double' - } - - // 分享视频功能点最终处理方式 - enum ShareVideoFrom{ - None = 0, // 无视频无分享 - Share = 1, // 分享 - ShareAsync = 2, // 异步分享 - Video = 3, // 看视频 - } - ``` - -3. ##### **getShareVideoType** - - ```javascript - PCSDK.shareVideo.getShareVideoType( key: string ): number - ``` - - 定义:根据分享视频key获取此次shareVideo模块推送的分享视频类型值:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分);此api用于通过得到的类型值处理页面的ui状态(微信和QQ平台对按钮的icon有强制限制):显示视频icon、显示分享icon、既没有分享icon,也没有视频icon。 - - 参数: - ```javascript - key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key) - ``` - - 返回值: - - ```javascript - number - 返回值此次点击功能按钮触发的推送类型:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分) - 分享视频类型枚举值如下: - // 推送类型:分享视频类型枚举 - enum ShareVideoType { - None = -1, // -1无分享无视频 - Share = 0, // 0分享 - ShareAysnc = 1, // 1异步分享 - ShareIntegral = 5, // 5分享积分 - Video = 2, // 2看视频 - VideoToShare = 3, // 3无视频则分享 - VideoAndShare = 4 // 4视频和分享(控制分享和视频两个按钮的显示) , - } - ``` - - 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。 - - ```javascript - // DiamondDoublePopwin.ts文件 - export default class DiamondDoublePopwin extends BaseView{ - protected addEvent() { - super.addEvent(); - // 免费领取双倍(应对微信审核,审核分享不能开放时候使用) - this.btnFree.on(Laya.Event.CLICK, this, this.onReward); - // 分享双倍 - this.btnShare.on(Laya.Event.CLICK, this, this.onReward); - // 视频双倍 - this.btnVideo.on(Laya.Event.CLICK, this, this.onReward); - } - - protected removeEvent() { - super.removeEvent(); - this.btnFree.off(Laya.Event.CLICK, this, this.onReward); - this.btnShare.off(Laya.Event.CLICK, this, this.onReward); - this.btnVideo.off(Laya.Event.CLICK, this, this.onReward); - } - - // 每次打开此popwin执行onOpen - protected onOpen(){ - super.onOpen(); - this.iniitRewardUI(); - } - - // 初始化/更新获得奖励按钮ui - private initRewardUI() { - let shareVideoType: ShareVideoType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString()); - switch (shareVideoType) { - case ShareVideoType.Share: // 同步分享 - case ShareVideoType.ShareAysnc: // 异步分享 - case ShareVideoType.ShareIntegral: // 分享积分 - this.btnFree.visible = false; - this.btnShare.visible = true; - this.btnVideo.visible = false; - break; - - case ShareVideoType.Video: // 推送视频 - case ShareVideoType.VideoToShare: // 无视频则分享 - // 视频ui状态 - this.btnFree.visible = false; - this.btnShare.visible = false; - this.btnVideo.visible = true; - break; - - default: // 无视频和无分享 - // 既不显示分享ui又不显示视频ui,直接领奖ui状态 - this.btnFree.visible = true; - this.btnShare.visible = false; - this.btnVideo.visible = false; - break; - } - } - - // 领取奖励操作 - private onReward(){ - PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), { - success: this.handleReward, - fail: this.handleError, - context: this - } ); - } - - // 分享/视频成功后回调处理函数:发奖励 - private handleReward(from: ShareVideoFrom, ret: any | null){ - // 分享成功、视频成功、无视频无分享 - } - - // 分享/视频失败后回调处理函数:弹出提示 - private handleError(from: ShareVideoFrom, error: any | null){ - // 返回错误,处理错误msg信息,自定义处理 - if( error ){ - wx.showToast({ - title: error.msg - }); - } - } - } - - // Enums.ts文件 - // 分享视频类型(与后台一一对应) - export enum ShareVideoType { - None = -1, // -1无分享无视频 - Share = 0, // 0同步分享 - ShareAysnc = 1, // 1异步分享 - ShareIntegral = 5, // 5分享积分 - Video = 2, // 2看视频 - VideoToShare = 3, // 3无视频则分享 - VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示) - } - - // 分享视频key枚举,每个key表示一个功能点 - enum ShareVideoKeys { - // 钻石双倍获取 - DiamondDouble = 'diamond_double', - // 失败获得双倍奖励 - FailRewardDouble = 'fail_reward_double' - } - - // 分享视频功能点最终推送类型 - enum ShareVideoFrom{ - None = 0, // 无视频无分享 - Share = 1, // 分享 - ShareAsync = 2, // 异步分享 - Video = 3, // 看视频 - } - - ``` -
- 下面演示dispatch和getShareVideoType两个api的完整使用,Laya引擎开发: - - 页面功能点按钮做三个状态: - - 1、看视频状态(显示视频icon) - - 2、分享状态(显示分享icon) - - 3、直接领奖(没有icon,审核状态) - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_1.png "🔍点击查看大图") - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_2.png "🔍点击查看大图") - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_3.png "🔍点击查看大图") - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_4.png "🔍点击查看大图") - - 例如,一个领取钻石双倍,页面的按钮ui通过下面的方式进行切换 - - 1、页面做三个按钮:视频icon按钮、分享icon按钮、直接领取按钮 - - 2、进入页面根据配置的key获取类型,显示对应类型ui:调用下面的initRewardUI(可随意命名) - - 3、分享或者视频后,SDK会发送一个tactic.update的消息过来,使用PCSDK.event.add注册监听,PCSDK.event.remove移除监听(PCSDK.event详细了解请查看[事件模块](event.md)),监听事件处理下一次推送显示ui状态:执行一下initRewardUI。 - - 4、给三个按钮都注册事件:onReward - ```javascript - // DiamondDoublePopwin.ts文件 - export default class DiamondDoublePopwin extends BaseView { - protected addEvent() { - super.addEvent(); - // 免费领取双倍(应对微信审核,审核分享不能开放时候使用) - this.btnFree.on(Laya.Event.CLICK, this, this.onReward); - // 分享双倍 - this.btnShare.on(Laya.Event.CLICK, this, this.onReward); - // 视频双倍 - this.btnVideo.on(Laya.Event.CLICK, this, this.onReward); - // PCSDK.event.add注册监听SDK发送的消息:tactic.update,更新获得奖励按钮ui - PCSDK.event.add('tactic.update', this.initRewardUI, this); - } - - protected removeEvent() { - super.removeEvent(); - this.btnFree.off(Laya.Event.CLICK, this, this.onReward); - this.btnShare.off(Laya.Event.CLICK, this, this.onReward); - this.btnVideo.off(Laya.Event.CLICK, this, this.onReward); - // PCSDK.event.remove移除监听SDK发送的消息:tactic.update - PCSDK.event.remove('tactic.update', this.initRewardUI, this); - } - - // 每次打开此popwin执行onOpen - protected onOpen(){ - super.onOpen(); - // 界面打开 - this.initRewardUI(); - } - - // 领取奖励操作 - private onReward(){ - PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), { - success: this.handleReward, - context: this - } ); - } - - // 分享/视频成功后回调处理函数:发奖励 - private handleReward(from: ShareVideoFrom, ret: any | null){ - // 分享成功、视频成功、无视频无分享 - } - - // 分享/视频失败后回调处理函数:弹出提示 - private handleError(from: ShareVideoFrom, error: any | null){ - // 返回错误,处理错误msg信息,自定义处理 - if( error ){ - wx.showToast({ - title: error.msg - }); - } - } - - // 初始化/更新获得奖励按钮ui - private initRewardUI() { - let shareVideoType: ShareType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString()); - switch (shareVideoType) { - case ShareVideoType.Share: // 同步分享 - case ShareVideoType.ShareAysnc: // 异步分享 - case ShareVideoType.ShareIntegral: // 分享积分 - // 分享ui状态 - this.stat_share.play(0,false); - // 等同于 - // this.btnFree.visible = false; - // this.btnShare.visible = true; - // this.btnVideo.visible = false; - break; - - case ShareVideoType.Video: // 视频 - case ShareVideoType.VideoToShare: // 无视频则分享 - // 视频ui状态 - this.stat_video.play(0,false); - // 等同于 - // this.btnFree.visible = false; - // this.btnShare.visible = false; - // this.btnVideo.visible = true; - break; - - default: // 无视频和无分享 - // 既不显示分享ui又不显示视频ui,直接领奖ui状态 - this.stat_free.play(0,false); - // 等同于 - // this.btnFree.visible = true; - // this.btnShare.visible = false; - // this.btnVideo.visible = false; - break; - } - } - } - - // Enums.ts文件 - // 分享视频类型(与后台一一对应) - export enum ShareVideoType { - None = -1, // -1无分享无视频 - Share = 0, // 0同步分享 - ShareAysnc = 1, // 1异步分享 - ShareIntegral = 5, // 5分享积分 - Video = 2, // 2看视频 - VideoToShare = 3, // 3无视频则分享 - VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示) - } - - // 分享视频key枚举,每个key表示一个功能点 - enum ShareVideoKeys { - // 钻石双倍获取 - DiamondDouble = 'diamond_double', - // 失败获得双倍奖励 - FailRewardDouble = 'fail_reward_double' - } - - // 分享视频功能点最终推送类型 - enum ShareVideoFrom{ - None = 0, // 无视频无分享 - Share = 1, // 分享 - ShareAsync = 2, // 异步分享 - Video = 3, // 看视频 - } - ``` - - - -#### **终章:** - -这个模块的内容点比较多,接入的注意事项也比较多,望接入者细度使用说明和理解示例意图。 - -噗嗤游戏的小伙伴在开发公司内部游戏中使用此模块,简单封装了SDK分享视频模块的几个通用方法,提供开发者参考,**[点击下载](https://dep.miso-lab.com/sdkword/tools/sdk-share-tools-1.0.0.zip)**。 diff --git a/stat.md b/stat.md deleted file mode 100644 index 137d3c8..0000000 --- a/stat.md +++ /dev/null @@ -1,255 +0,0 @@ -# 启动注册打点 - ------- - -#### **简介** - -启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 - - - -#### **后台使用** - -完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png) - -点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息: - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png) - - - - - -#### **接入API:** - -| **名称** | **功能说明** | -| ------------------------ | ------------------------------------------------------------ | -| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 | -| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) | -| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 | - - - -接入流程图: - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png) - -1. **setLoginInfo** -
- ```javascript - PCSDK.stat.setLoginInfo( data: object ): void - ``` - - 定义:游戏成功登录到服务器,获取到openId和用户信息:openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息 - - 参数: - - ```javascript - data: object -{ - openId: string 必传,openId - regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒) - } - ``` - 返回值: - - ```javascript - 无 - ``` - - 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。 - 该示例,只是模拟使用环境。 - - ```javascript - // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。 - Api.login().then( data => { - let { user_openid, user_reg_time } = data; - PCSDK.stat.setLogind({ - openId: user_openid, // openId - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 - }); - }); - ``` - -2. **loadingFinish** - - ```javascript - PCSDK.stat.loadingFinish(): Promise - ``` - - 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) - - 参数: - - ``` - 无 - ``` - 返回值: - - ```javascript - Promise - Promise resolve 加载打点成功完成回调 - ``` - - 示例: - - ```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() { - // 打点:loadingFinish - PCSDK.stat.loadingFinish(); - } - - // 更新资源加载进度条 - private onProgressMain(ret) { - let progress = ret.data; - this.skin.txtProgress.text = Math.floor(progress * 100) + '%'; - } - ``` - -3. **active** - - ```javascript - PCSDK.stat.active(): void - ``` - - 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式: - 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。 - - 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。 - - 参数: - - ```javascript - 无 - ``` - 返回值: - - ```javascript - void - 无 - ``` - - 示例: - - ```javascript - // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active - // 资源加载loading界面 - class LoadingScene(){ - constructor(){ - // 登录 - this.login(); - // 加载资源 - this.loadResouce(); - } - - /** - * 登录 - */ - private login(){ - Api.login().then( data => { - let { user_openid, user_reg_time } = data; - // 打点:设置用户信息 - PCSDK.stat.setLoginInfo({ - openId: user_openid, // openId - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 - }); - }); - } - - /** - * 加载资源 - */ - private loadResouce(){ - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); - } - - /** - * 加载资源完成回调监听 - */ - private onLoadedMain(){ - // 打点:加载资源完成 - PCSDK.stat.loadingFinish().then( () => { - // 打点:用户活跃注册打点 - PCSDK.stat.active(); - - // 进入home主页场景 - SceneManager.I.switchScene(HomeScene); - }); - } - } - - // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。 - // 资源加载loading界面 - class LoadingScene(){ - constructor(){ - // 登录 - this.login(); - // 加载资源 - this.loadResouce(); - } - - /** - * 登录 - */ - private login(){ - Api.login().then( data => { - let { user_openid, user_reg_time } = data; - // 打点:设置用户信息 - PCSDK.stat.setLoginInfo({ - openId: user_openid, // openId - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 - }); - }); - } - - /** - * 加载资源 - */ - private loadResouce(){ - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); - } - - /** - * 加载资源完成回调监听 - */ - private onLoadedMain(){ - // 打点:加载资源完成 - PCSDK.stat.loadingFinish().then( () => { - // 进入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 deleted file mode 100644 index 137d3c8..0000000 --- a/stat_active.md +++ /dev/null @@ -1,255 +0,0 @@ -# 启动注册打点 - ------- - -#### **简介** - -启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。 - - - -#### **后台使用** - -完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息: -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png) - -点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息: - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png) - - - - - -#### **接入API:** - -| **名称** | **功能说明** | -| ------------------------ | ------------------------------------------------------------ | -| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 | -| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) | -| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 | - - - -接入流程图: - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png) - -1. **setLoginInfo** -
- ```javascript - PCSDK.stat.setLoginInfo( data: object ): void - ``` - - 定义:游戏成功登录到服务器,获取到openId和用户信息:openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息 - - 参数: - - ```javascript - data: object -{ - openId: string 必传,openId - regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒) - } - ``` - 返回值: - - ```javascript - 无 - ``` - - 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。 - 该示例,只是模拟使用环境。 - - ```javascript - // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。 - Api.login().then( data => { - let { user_openid, user_reg_time } = data; - PCSDK.stat.setLogind({ - openId: user_openid, // openId - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 - }); - }); - ``` - -2. **loadingFinish** - - ```javascript - PCSDK.stat.loadingFinish(): Promise - ``` - - 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) - - 参数: - - ``` - 无 - ``` - 返回值: - - ```javascript - Promise - Promise resolve 加载打点成功完成回调 - ``` - - 示例: - - ```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() { - // 打点:loadingFinish - PCSDK.stat.loadingFinish(); - } - - // 更新资源加载进度条 - private onProgressMain(ret) { - let progress = ret.data; - this.skin.txtProgress.text = Math.floor(progress * 100) + '%'; - } - ``` - -3. **active** - - ```javascript - PCSDK.stat.active(): void - ``` - - 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式: - 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。 - - 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。 - - 参数: - - ```javascript - 无 - ``` - 返回值: - - ```javascript - void - 无 - ``` - - 示例: - - ```javascript - // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active - // 资源加载loading界面 - class LoadingScene(){ - constructor(){ - // 登录 - this.login(); - // 加载资源 - this.loadResouce(); - } - - /** - * 登录 - */ - private login(){ - Api.login().then( data => { - let { user_openid, user_reg_time } = data; - // 打点:设置用户信息 - PCSDK.stat.setLoginInfo({ - openId: user_openid, // openId - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 - }); - }); - } - - /** - * 加载资源 - */ - private loadResouce(){ - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); - } - - /** - * 加载资源完成回调监听 - */ - private onLoadedMain(){ - // 打点:加载资源完成 - PCSDK.stat.loadingFinish().then( () => { - // 打点:用户活跃注册打点 - PCSDK.stat.active(); - - // 进入home主页场景 - SceneManager.I.switchScene(HomeScene); - }); - } - } - - // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。 - // 资源加载loading界面 - class LoadingScene(){ - constructor(){ - // 登录 - this.login(); - // 加载资源 - this.loadResouce(); - } - - /** - * 登录 - */ - private login(){ - Api.login().then( data => { - let { user_openid, user_reg_time } = data; - // 打点:设置用户信息 - PCSDK.stat.setLoginInfo({ - openId: user_openid, // openId - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒 - }); - }); - } - - /** - * 加载资源 - */ - private loadResouce(){ - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain(); - } - - /** - * 加载资源完成回调监听 - */ - private onLoadedMain(){ - // 打点:加载资源完成 - PCSDK.stat.loadingFinish().then( () => { - // 进入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_ads.md b/stat_ads.md deleted file mode 100644 index e78aea7..0000000 --- a/stat_ads.md +++ /dev/null @@ -1,530 +0,0 @@ -# 交叉推广位 - ------- - -#### **简介** - -交叉推广位是在游戏中展示其他游戏,用户点击某个游戏跳转进入游戏,达到共享用户的目的。 - -噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析查看。 - -**3种广告类型:悬浮框交叉推广位、抽屉式交叉推广位、猜你喜欢交叉推广位,对应类型值为:40、70、50** - -1. 悬浮框交叉推广位,推荐位置:首页、结算页 - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_013.png "🔍点击查看大图") - -2. 抽屉式交叉推广位,推荐位置:首页、结算页 - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_014.png "🔍点击查看大图") - -3. 猜你喜欢交叉推广位,推荐位置:结算页 - - ![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)。 - -- **接入3种交叉推广位后,为了防止微信审核被拒(被拒理由:微信认定游戏跳转到其他游戏太多,判断游戏是一个游戏盒子,拒绝审核通过),为了防范被拒,在[数据模块](data.md)提供了三个数据获取api:PCSDK.data.IsCross、PCSDK.data.IsDrawer、PCSDK.data.IsGuessLike,控制3种推广位广告的显示隐藏,开发者在游戏中对三种广告控制显示隐藏状态。[详请请阅读数据api](data.md#ad_cross)。** - -- 噗嗤游戏为了方便开发者接入调试交叉推广位,后台已经配置测试使用的3种类型推广位,提供以下10个推广位appid,开发者复制下面的navigateToMiniProgramAppIdList json数据,配置到game.json的navigateToMiniProgramAppIdList参数: - - 水果爆破 :"wx26822126b4d99eda", - - 球球涂涂涂:"wxac0750884d5bed0c", - - 狂野漂移3D:"wx019a09df638e6683", - - 星星爱消消:"wx9ff47d13a88e5511", - - 土耳其方块消消乐:"wx89efb2282d65a2d0", - - 成语小才子:"wxd4d478c7d331ce80", - - 球球蹦蹦蹦:"wxabee9afe62d0b114", - - 俄罗斯方块连连消:"wx4cd087f19f4cb7c3", - - 球球爆爆爆:"wxae33d68413f40641", - - 疯狂水果一刀切:"wxdf26a04c53d6f1e9" - - ```javascript - "navigateToMiniProgramAppIdList": [ - "wx26822126b4d99eda", - "wxac0750884d5bed0c", - "wx019a09df638e6683", - "wx9ff47d13a88e5511", - "wx89efb2282d65a2d0", - "wxd4d478c7d331ce80", - "wxabee9afe62d0b114", - "wx4cd087f19f4cb7c3", - "wxae33d68413f40641", - "wxdf26a04c53d6f1e9" - ] - ``` - - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_010.png "🔍点击查看大图") - - - - -#### **接入API:** - -| **名称** | **功能说明** | -| --------------------------- | ------------------------------------------------------------ | -| PCSDK.stat.bannerList | 根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型:40(悬浮框交叉推广位)、70(抽屉式交叉推广位)、50(猜你喜欢交叉推广位) | -| PCSDK.stat.bannerNavigateTo | 交叉推广位点击跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram) | -| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK内部会在onHide时候上报数据到后台 | - - - -1. ##### **bannerList** - - ```javascript - PCSDK.stat.loadingFinish(banner_type): Promise - ``` - - 定义:根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型 - - 参数: - - ``` - 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" - } - } - ] - } - - ``` - - > **返回的数据banner_list列表解析为 Array< BannerData >,BannerData是banner_list每一项数据实体,下面的bannerNavigateTo与addExposure接口api参数banner_data属于此BannerData结构**。 - - 示例: - - ```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. ##### **bannerNavigateTo** - - ```javascript - PCSDK.stat.bannerNavigateTo( location:number, banner_data: any, opts?: { extraData?: string; envVersion?: string }): Promise - ``` - - 定义:交叉推广位点击游戏跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram), 第三个参数配置可参考[wx.navigateToMiniProgram extraData、envVersion配置信息](https://developers.weixin.qq.com/minigame/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html) - - 参数: - - ```javascript - 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用户信息 - /** - * 演示交叉推广位使用示例 - */ - 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. ##### **addExposure** - - ```javascript - PCSDK.stat.addExposure( location: number, banner_data: Array< any > | any ): void - ``` - - 定义:对一个或者多个展示的推广位添加曝光,SDK在onHide时候上报曝光数据到后台,后台进行统计查阅 - - 参数: - - ```javascript - location: number 必传,统一传递为:100 - - banner_data:any 必传,添加展推广位曝光数据,可添加一个或者多个曝光数据,banner_data参数数据结构为上面bannerList api返回的列表数据的项BannerData实体结构:Array | BannerData - - ``` - - > 提示: - > - > 展示猜你喜欢/抽屉式交叉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。 - > - > 展示悬浮框交叉推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api - - 示例:根据悬浮框交叉推广位类型调用PCSDK.stat.bannnerList接口获取悬浮框交叉推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。 - ```javascript - /** - * 演示交叉推广位使用示例 - */ -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 deleted file mode 100644 index a811d33..0000000 --- a/stat_event.md +++ /dev/null @@ -1,153 +0,0 @@ -# 自定义事件打点 - ------- - -#### **简介** - -自定义事件是噗嗤游戏为开发者提供的自助分析功能:事件触发去重人数、次数等信息。游戏的任意位置需要统计触达人数、次数等都可以使用事件来实现,后台提供分析数据可查看,并不局限于用户的行为事件。 - -#### **后台使用** - -接入自定义事件打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】可查看自定义事件次数、去重人数等详细信息(此功能需要管理员添加权限): - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_018.png "🔍点击查看大图") - - - -#### **接入必读** - -接入自定义事件打点前,请[前往后台](https://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枚举 - -```javascript -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 | 自定义事件打点,使用前请[前往后台](https://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, '主界面'); - PopwinMananger.I.openWin(SignPopwin); - } - - // 开始加载资源 - 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 - }); - } - - export enum EventKeys { - // 升级奖励, - LvUpRewards = 'lv_up_rewards', - // 点击主界面-签到, - FunctionSign = 'function_sign', - // 加载, - LoadingExhibition = 'loading_exhibition' - } - ``` diff --git a/stat_level.md b/stat_level.md deleted file mode 100644 index 255bdad..0000000 --- a/stat_level.md +++ /dev/null @@ -1,297 +0,0 @@ -# 关卡分析打点 - ------- - -#### **简介** - -关卡分析,为开发者提供小游戏详细的关卡数据,分析各关卡玩家的通关状况,帮助开发者从数据角度衡量游戏设计的合理性,调节难易度,观察各关卡道具使用情况和奖励获取状况,对比分析各个指标,通过量化玩家数据,提高游戏体验。 - -#### **后台使用** - -接入关卡分析接口后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【关卡分析】可查看关卡进入用户数据、失败次数、失败率、平均完成时间等): - -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_020.png "🔍点击查看大图") - - - -#### **接入API**: - -| **名称** | **功能说明** | -| ---------------- | ------------------------------------------------------------ | -| PCSDK.stat.logLevelRelive | 游戏关卡复活上报 | -| PCSDK.stat.logLevelHide | 游戏关卡onHide上报,在游戏界面注册wx.onHide事件,判断不属于复活、失败、成功状态下上报此数据 | -| PCSDK.stat.logLevelFail | 游戏关卡失败上报 | -| PCSDK.stat.logLevelWin | 游戏关卡成功上报 | -| PCSDK.stat.logMerge | 游戏二合一合成最高等级上报 | - - - -1. #### **logLevelRelive** - - ```javascript - PCSDK.stat.logLevelRelive(levelId: string | number , params?: { attr?: number, ext?: any } ): void - ``` - - 定义:关卡复活成功数据上报 - - 参数: - - ``` - levelId: string | number 必传,游戏关卡id - - params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext - { - attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) - ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 - } - ``` - - [点此查看完整示例](stat_level.md#sample)如何添加关卡复活成功打点代码 - -2. #### **logLevelHide** - - ```javascript - PCSDK.stat.logLevelHide(levelId: string | number , params?: { attr?: number, ext?: any } ): void - ``` - 定义:监听游戏战斗界面onHide时上报关卡的数据。什么是界面onHide?[请详读微信小游戏wx.onHide](https://developers.weixin.qq.com/minigame/dev/api/base/app/life-cycle/wx.onHide.html) - 注意事项: - - > 1)游戏战斗界面监听平台的onHide事件,使用此api上报关卡onHide打点。 - > - > - - > 2)游戏战斗界面退出后,要移除onHide事件监听,避免在其他界面下,onHide时候执行此次上报。 - > - > - - > 3)一定要屏蔽游戏复活中、游戏失败、游戏通过成功状态,这三种状态下避免上报此打点,详看下面示例。 - - 参数: - - ``` - levelId: string | number 必传,游戏关卡id - - params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext - { - attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) - ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 - } - ``` - [点此查看完整示例](stat_level.md#sample)如何添加关卡onHide打点代码 - -3. #### **logLevelFail** - - ```javascript - PCSDK.stat.logLevelFail(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void - ``` - - 定义:关卡失败数据上报 - - 参数: - - ``` - levelId: string | number 必传,游戏关卡id - - params: object 必传,关卡需要的其他参数 - { - ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒 - first: number 必传 是否第一次体验关卡,1是,0否 - attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) - ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 - } - ``` - [点此查看完整示例](stat_level.md#sample)如何添加关卡失败打点代码 - -4. #### **logLevelWin** - - ```javascript - PCSDK.stat.logLevelWin(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void - ``` - - 定义:关卡成功通关数据上报 - - 参数: - - ``` - levelId: string | number 必传,游戏关卡id - - params: object 必传,关卡需要的其他参数 - { - ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒 - first: number 必传 是否第一次体验关卡,1是,0否 - attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级) - ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式 - } - ``` -
完整示例,以上四个接口使用场景: -> SDK中监听了onHide事件,当游戏onHide时,SDK会发送事件名为'app.hide'的自定义事件,开发者可在代码中使用PCSDK.event.bindEvent监听该事件,使用PCSDK.event.removeEvent移除对应监听事件,[详细文档event模块文档请阅读event事件模块](evennt.md)。 - - ```javascript - /** - * 游戏界面 - **/ - exports class GameScene extends BaseView{ - // 关卡id - private missionId: number; - // 当前选中使用的枪支等级 - private currSelectGun: number; - // 游戏状态机 - private gameState: GameState; - // 关卡开始时间 - private enterTime: number; - - constructor(){ - this.gameState = GameState.Idle; - } - - // 游戏界面打开 - open(){ - super.open(); - this.gameState = GameState.Idle; - this.enterTime = new Date().getTime(); - this.addEvent(); - } - - // 游戏界面关闭 - close(){ - super.close(); - this.removeEvent(); - } - - // 添加游戏事件监听 - private addEvent(){ - // 监听SDK中app.hide事件事件消息 - PCSDK.event.bindEvent( 'app.hide', this.handleHide, this); - // 监听游戏中level.relive事件消息 - EventCenter.I.add('level.relive', this, this.handleLevelRelive); - } - - // 移除游戏事件监听 - private removeEvent(){ - PCSDK.event.removeEvent( 'app.hide', this.handleHide, this); - EventCenter.I.remove('level.relive', this, this.handleLevelRelive); - } - - // 游戏复活中 - private doGameRelive(){ - this.setState(GameState.Relive); - } - - // 游戏通关失败 - private doGameFail(){ - this.setState(GameState.Fail); - } - - // 游戏通关成功 - private doGameWin(){ - this.setState(GameState.Win); - } - - // SDK发出的app.hide事件监听 - private handleHide() { - // 战斗界面onHide上报logLevelHide(游戏通关成功、游戏通关失败、游戏复活中不进行上报logLevelHide打点) - if(!(this.isState(GameState.Win) || this.isState(GameState.Fail) || this.isState(GameState.Relive))) - PCSDK.stat.logLevelHide(this.missionId, { - attr: this.currSelectGun - }); - } - - // 监听关卡复活成功消息 - private handleLevelRelive(){ - // 关卡复活成功上报 - PCSDK.stat.logLevelRelive(this.missionId, { - attr: this.currSelectGun - }); - } - - private isState(state: GameState) { - return this.state === state; - } - - // 设置状态机 - private setState(state: GameState) { - if (this.isState(state)) return; - - this.state = state; - let costTime: number; // 关卡消耗时间 - let failNum: number; // 关卡失败次数 - switch (state) { - case GameState.Win: // 处理成功 - // 关卡成功上报 - costTime = new Date().getTime() - this.enterTime; - failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId); - PCSDK.stat.logLevelWin(this.missionId, { - ctime: costTime, - first: failNum ? 0 : 1, - attr: this.currSelectGun, - ext: { - currHp: 100000 - } - }); - break; - - case GameState.Fail: // 处理失败 - // 关卡失败上报 - costTime = new Date().getTime() - this.enterTime; - failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId); - PCSDK.stat.logLevelFail(this.missionId, { - ctime: costTime, - first: failNum ? 0 : 1, - attr: this.currSelectGun - }); - break; - - case GameState.Relive:// 处理复活中 - // 弹出复活操作界面 - PopWinManager.I.openPopwin(RelivePopwinn); - break; - } - } - } - - /** - * 复活界面 - **/ - exports class RelivePopwinn extends BaseView{ - // 复活界面关闭 - close(){ - super.close(); - // 关闭模拟:复活成功,发送复活成功消息 - EventCenter.I.emit('level.relive'); - } - } - - // 游戏状态状态机 - enum GameState{ - Idle, // 初始状态 - Fail, // 失败状态 - Win, // 成功通关状态 - Relive // 正在复活状态 - } - ``` - -5. #### **logMerge** - - ```javascript - PCSDK.stat.logMerge(mergeLv: number): void - ``` - - 定义:游戏二合一合成最高等级上报 - - 参数: - - ``` - mergeLv: number 必传,二合一合成最高等级 - ``` - - 示例:二合一部分,合成最高等级时候上报 - - ```javascript - // 合成最新等级合成 - private handleMergeLastestLv(lastestLv: number){ - // 合成最新等级上报 - PCSDK.stat.logMerge( lastestLv ); - } - ``` - - \ No newline at end of file diff --git a/stat_pay.md b/stat_pay.md deleted file mode 100644 index f7c8ff0..0000000 --- a/stat_pay.md +++ /dev/null @@ -1,112 +0,0 @@ -# 支付结果打点 - ------- - -#### **简介** - -支付上报,是开发者使用米大师或者第三方其他支付(比如H5支付),支付回调后把支付结果(失败支付、成功支付、取消支付)上报到后台。 - -#### **注意事项** - -{% em %} 使用api,需在[config.js中配置MidasPay](install.md#configJs)信息。 {% endem %} - -**MidasPay( object )配置:**米大师虚拟支付配置,请注意下面规则 - - OfferId:在米大师申请的应用id,没有接入米大师,默认为"0" - - ZoneId:分区ID,默认:"1" - - Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game" - - CurrencyType:币种,默认:"CNY" - - Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。 - - 1)接入了米大师,填写"android"(ios暂时没有开放) - - 2)未接入米大师,使用其他支付,如果只支持android,则填写"android"; - - 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios"; - - 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios - - - -#### **接入API:** - -| **名称** | **功能说明** | -| ------------------------ | ------------------------------------------------------------ | -| PCSDK.stat.logPay | 开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付) | - - -1. **logPay** - - ```javascript - PCSDK.stat.logPay( params: object ): void - ``` - - 定义:开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付)。该api需在[config.js中配置MidasPay](install.md#configJs)信息。 - - 参数: - - ``` - params object 必传 打点参数 - { - type: number 必传 支付类型:0(支付失败),1(支付成功),-1(取消支付); - source: string 必传 游戏服务商生成的订单号,没有则为空字符串 - amount: number 必传 实际支付金额,单位分 - buy_id: string | number; 必传 商品ID - buy_name: string; 必传 商品名称 - item_info: string 必传 获得的道具内容:道具id及数量,逗号分隔,多项使用分号分隔 => 1,1;2,10;3,100 - } - ``` - 返回值: - - ``` - void - 无 - ``` - - 示例:客户端游戏支付完成后上报支付打点,下例只是演示logPay用法 - - ```javascript - private reqPay() { - // 模拟的支付,开发者需更加实际接入支付 - Api.I.pay().then( ret => { - switch(ret.code){ - case 1: // 支付成功回调处理 - PCSDK.stat.logPay({ - type: 1, // 成功支付 - source: "10000400", // 订单号,没有则为空字符串 - amount: 10 * 100, // 10元 - buy_id: 58, // 支付的商品id - buy_name: "钻石*152,金币*188888888", - item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90 - }); - break; - - case 0: // 支付失败回调处理 - PCSDK.stat.logPay({ - type: 0, // 失败支付 - source: "10000400", // 订单号,没有则为空字符串 - amount: 10 * 100, // 10元 - buy_id: 58, // 支付的商品id - buy_name: "钻石*152,金币*188888888", - item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90 - }); - break; - - case -1: // 支付取消回调处理 - PCSDK.stat.logPay({ - type: -1, // 取消支付 - source: "10000400", // 订单号,没有则为空字符串 - amount: 10 * 100, // 10元 - buy_id: 58, // 支付的商品id - buy_name: "钻石*152,金币*188888888", - item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90 - }); - break; - } - }); - } - ``` \ No newline at end of file diff --git a/styles/website.css b/styles/website.css deleted file mode 100644 index 7d92dfd..0000000 --- a/styles/website.css +++ /dev/null @@ -1,68 +0,0 @@ -/* CSS for website */ -h1 , h2{ - border-bottom: 1px solid #EFEAEA; - padding-bottom: 3px; -} -.markdown-section>:first-child { - margin-top: 0!important; -} -.page-wrapper { - margin-top: -1.275em; -} -.book .book-body .page-wrapper .page-inner section.normal { - min-height:350px; - margin-bottom: 30px; -} - -.book .book-body .page-wrapper .page-inner section.normal hr { - height: 0px; - padding: 0; - margin: 1.7em 0; - overflow: hidden; - background-color: #e7e7e7; - border-bottom: 1px dotted #e7e7e7; -} - -.video-js { - width:100%; - height: 100%; -} - -pre[class*="language-"] { - border: none; - background-color: #f7f7f7; - /* font-size: 1em; */ - line-height: 1.2em; -} - -.book .book-body .page-wrapper .page-inner section.normal { - font-size: 16px; - font-family: "ubuntu", "Tahoma", "Microsoft YaHei", arial, sans-serif; -} - -.aceCode { - font-size: 14px !important; -} - -input[type=checkbox]{ - margin-left: -2em; -} - -.page-footer span{ - font-size: 12px; -} - -.page-footer .copyright { - float: left; -} - -.body, html { - overflow-y: hidden; -} - -.versions-select select { - height: 2em; - line-height: 2em; - border-radius: 4px; - background: #efefef; -} -- libgit2 0.21.0