Commit ab28df7a5a549576ce191828497fa3a204f0b65b

Authored by 小川 费
1 parent 5f3728df
Exists in master

1

.gitignore
... ... @@ -1,64 +0,0 @@
1   -# Node rules:
2   -## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
3   -.grunt
4   -
5   -## Dependency directory
6   -## Commenting this out is preferred by some people, see
7   -## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git
8   -node_modules
9   -node_modules/
10   -node_modules/**/*
11   -
12   -# Book build output
13   -_book
14   -
15   -# eBook build output
16   -*.epub
17   -*.mobi
18   -*.pdf
19   -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion
20   -
21   -*.iml
22   -
23   -## Directory-based project format:
24   -.idea/
25   -# if you remove the above rule, at least ignore the following:
26   -
27   -# User-specific stuff:
28   -# .idea/workspace.xml
29   -# .idea/tasks.xml
30   -# .idea/dictionaries
31   -
32   -# Sensitive or high-churn files:
33   -# .idea/dataSources.ids
34   -# .idea/dataSources.xml
35   -# .idea/sqlDataSources.xml
36   -# .idea/dynamic.xml
37   -# .idea/uiDesigner.xml
38   -
39   -# Gradle:
40   -# .idea/gradle.xml
41   -# .idea/libraries
42   -
43   -# Mongo Explorer plugin:
44   -# .idea/mongoSettings.xml
45   -
46   -## File-based project format:
47   -*.ipr
48   -*.iws
49   -
50   -## Plugin-specific files:
51   -
52   -# IntelliJ
53   -/out/
54   -
55   -# mpeltonen/sbt-idea plugin
56   -.idea_modules/
57   -
58   -# JIRA plugin
59   -atlassian-ide-plugin.xml
60   -
61   -# Crashlytics plugin (for Android Studio and IntelliJ)
62   -com_crashlytics_export_strings.xml
63   -crashlytics.properties
64   -crashlytics-build.properties
README.md
... ... @@ -1,56 +0,0 @@
1   -# 噗嗤SDK
2   -PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。
3   -PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。
4   -
5   -**PCSDK提供的模块功能:**
6   -
7   -- [统计模块](stat.md)
8   -- [分享视频模块](share.md)
9   -- [配置参数模块️](online.md)
10   -- [多平台接口模块](platform.md)
11   -- [数据模块](data.md)
12   -- [事件模块](event.md)
13   -
14   -
15   -
16   -# 噗嗤管理后台
17   -噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。
18   -
19   -噗嗤管理后台地址:
20   -
21   -- https://data.d3games.com/#/login
22   -
23   -**友情提示:**
24   -
25   -- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。**
26   -- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。**
27   -- **登录后台即可使用后台提供的各项服务**
28   -
29   -
30   -
31   -**后台概览:**
32   -## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图")
33   -
34   -
35   -
36   -**后台提供数据分析功能(不能跳转请联系管理员添加权限):**
37   -
38   -- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart)
39   -- [分享数据分析](https://data.d3games.com/index.html#/share_exact)
40   -- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list)
41   -- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list)
42   -
43   -
44   -
45   -**后台提供配置相关功能(不能跳转请联系管理员添加权限):**
46   -
47   -- [分享/视频配置](https://data.d3games.com/index.html#/share_list)
48   -- [配置参数](https://data.d3games.com/index.html#/config_list)
49   -
50   -
51   -# 更多:
52   -- 快速接入,请详读 [安装步骤](install.md)
53   -
54   -
55   -
56   -- 遇到问题可以查看 [FAQ](faq.md)
57 0 \ No newline at end of file
SUMMARY.md
... ... @@ -1,28 +0,0 @@
1   -# Summary
2   -## SDK入门
3   -* [SDK简介](intro.md)
4   -* [SDK下载](download.md)
5   -* [安装步骤️️️️](install.md)
6   -
7   -## SDK手册
8   -* [模块概览](modules.md)
9   -
10   -* [统计模块](stat.md)
11   - * [启动注册打点️](stat_active.md)
12   - * [关卡分析打点️️](stat_level.md)
13   - * [支付结果打点](stat_pay.md)
14   - * [自定义事件打点](stat_event.md)
15   - * [交叉推广位](stat_ads.md)
16   -* [分享视频模块](share.md)
17   -* [配置参数模块️](online.md)
18   -* [多平台接口模块](platform.md)
19   - * [打开客服消息](platform.md#service)
20   - * [检测自动更新](platform.md#checkUpdate)
21   - * [复制文本内容](platform.md#copy)
22   - * [震动接口](platform.md#vibrate)
23   - * [小游戏推荐弹窗组件GamePortal](platform.md#gamePortal)
24   - * [小游戏插屏广告组件InterstitialAd](platform.md#interstitialAd)
25   - * [小游戏推荐icon组件GameIcon](platform.md#gameicon)
26   -* [数据模块](data.md)
27   -* [事件模块](event.md)
28   -* [FAQ❎](faq.md)
29 0 \ No newline at end of file
book.json
... ... @@ -1,56 +0,0 @@
1   -{
2   - "title": "噗嗤游戏使用文档",
3   - "description": "记录 GitBook 的配置和一些插件的使用",
4   - "author": "zhangjikai",
5   - "output.name": "site",
6   - "language": "zh-hans",
7   - "gitbook": "3.2.3",
8   - "root": ".",
9   - "plugins": [
10   - "-lunr",
11   - "-search",
12   - "-sharing",
13   - "-highlight",
14   - "-livereload",
15   - "emphasize",
16   - "simple-page-toc@^0.1.1",
17   - "prism",
18   - "prism-themes",
19   - "include-codeblock@^3.0.2",
20   - "splitter@^0.0.8",
21   - "tbfed-pagefooter@^0.0.1",
22   - "expandable-chapters-small@^0.1.7",
23   - "sectionx@^3.1.0",
24   - "local-video@^1.0.1",
25   - "anchor-navigation-ex",
26   - "todo@^0.1.3",
27   - "popup",
28   - "lightbox",
29   - "copy-code-button"
30   - ],
31   - "structure": {
32   - "readme": "README.md"
33   - },
34   - "styles": {
35   - "website": "styles/website.css"
36   - },
37   - "pluginsConfig": {
38   - "prism": {
39   - "css": [
40   - "prism-themes/themes/prism-base16-ateliersulphurpool.light.css"
41   - ]
42   - },
43   - "anchor-navigation-ex": {
44   - "associatedWithSummary": false,
45   - "showLevel": true,
46   - "multipleH1": true,
47   - "mode": "float",
48   - "pageTop": {
49   - "showLevelIcon": false,
50   - "level1Icon": "fa fa-hand-o-right",
51   - "level2Icon": "fa fa-hand-o-right",
52   - "level3Icon": "fa fa-hand-o-right"
53   - }
54   - }
55   - }
56   -}
57 0 \ No newline at end of file
... ... @@ -1,226 +0,0 @@
1   -
2   -# 数据模块
3   -
4   -------
5   -
6   -#### **简介**
7   -
8   -此模块为开发者提供游戏用到的一些数据信息,例如:config.js配置的GameId,ChannelId、从分享链接进入query携带的参数(share_id/share_key/user_invite_uid/channel_id)、setLogind设置的用户ID(userId)和用户注册时间(regTime)等等,详细请阅读下面的api。
9   -
10   -
11   -
12   -#### **API:**
13   -
14   -| **名称** | **功能说明** |
15   -| ------------------------------- | ------------------------------------------------------------ |
16   -| PCSDK.data.GameId | 获取游戏的GameId,来源于config.js配置的GameId |
17   -| PCSDK.data.ChannelId| 获取游戏渠道ID,来源于config.js配置的ChannelId |
18   -| PCSDK.data.UserId | 获取用户ID,setLoginInfo传递的openId的值|
19   -| PCSDK.data.RegTime | 获取用户注册时间,setLoginInfo传递的regTime的值 |
20   -| PCSDK.data.ShareId | 获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0 |
21   -| PCSDK.data.ShareKey | 接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key |
22   -| PCSDK.data.Platform | 获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) |
23   -| PCSDK.data.SystemId | 获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备) |
24   -| PCSDK.data.QueryUserInviteUid | 获取此次分享会话进入游戏,分享来源者用户ID |
25   -| PCSDK.data.IsCross | 获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏 |
26   -| PCSDK.data.IsDrawer | 获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏 |
27   -| PCSDK.data.IsGuessLike | 获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏 |
28   -
29   -
30   -
31   -1. ##### **GameId**
32   -
33   - ```javascript
34   - PCSDK.data.GameId: number
35   - ```
36   -
37   - 定义:获取游戏的GameId,该值来源于congfig.js中的【GameId】配置。详细[阅读config.js的GameId参数详解](install.md#config_env)
38   -
39   - 示例:
40   -
41   - ```javascript
42   - let gameId = PCSDK.data.GameId;
43   - ```
44   -2. ##### **ChannelId**
45   -
46   - ```javascript
47   - PCSDK.data.ChannelId: number
48   - ```
49   -
50   - 定义:获取游戏的渠道Id,该值来源于congfig.js中的【ChannelId】配置。详细[阅读config.js的ChannelId参数详解](install.md#config_env)
51   -
52   - 示例:
53   -
54   - ```javascript
55   - let channelId = PCSDK.data.ChannelId;
56   - ```
57   -3. ##### **UserId**
58   -
59   - ```javascript
60   - PCSDK.data.UserId: number | string
61   - ```
62   -
63   - 定义:获取用户ID,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的openId
64   -
65   - 示例:
66   -
67   - ```javascript
68   - let userId = PCSDK.data.UserId;
69   - ```
70   -4. ##### **RegTime**
71   -
72   - ```javascript
73   - PCSDK.data.RegTime: number
74   - ```
75   -
76   - 定义:获取用户第一次创角的时间戳,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的regTime
77   -
78   - 示例:
79   -
80   - ```javascript
81   - let regTime = PCSDK.data.RegTime;
82   - ```
83   -5. ##### **ShareId**
84   -
85   - ```javascript
86   - PCSDK.data.ShareId: number
87   - ```
88   -
89   - 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_id参数,从分享会话点入游戏,获取此次分享会话的shareId,不是从分享会话点入游戏ShareId为0
90   -
91   - 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入
92   - ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍")
93   -
94   - ```javascript
95   - // shareId的值为:680
96   - let shareId = PCSDK.data.ShareId;
97   - ```
98   -6. ##### **ShareKey**
99   -
100   - ```javascript
101   - PCSDK.data.ShareKey: string
102   - ```
103   -
104   - 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_key参数,从分享会话点入游戏,获取此次分享会话的shareKey,不是从分享会话点入游戏ShareKey为''
105   -
106   - 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入
107   - ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍")
108   -
109   - ```javascript
110   - // shareKey的值为:success_double
111   - let shareKey = PCSDK.data.ShareKey;
112   - ```
113   -7. ##### **Platform**
114   -
115   - ```javascript
116   - PCSDK.data.Platform: string
117   - ```
118   -
119   - 定义:获取游戏运行平台环境:devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备)
120   -
121   - 示例:
122   -
123   - ```javascript
124   - let platform = PCSDK.data.Platform;
125   - switch (platform) {
126   - case 'devtools': // 开发者工具
127   -
128   - break;
129   -
130   - case 'ios': // 苹果设备
131   -
132   - break;
133   -
134   - case 'android': // 安卓设备
135   -
136   - break;
137   - }
138   - ```
139   -8. ##### **SystemId**
140   -
141   - ```javascript
142   - PCSDK.data.SystemId: number
143   - ```
144   -
145   - 定义:获取游戏运行平台环境:0(开发者调试工具或ios)、1(安卓设备)
146   -
147   - 示例:
148   -
149   - ```javascript
150   - let systemId = PCSDK.data.SystemId;
151   - switch (systemId) {
152   - case 0: // 开发者工具 or 苹果设备
153   -
154   - break;
155   -
156   - case 1: // 安卓设备
157   -
158   - break;
159   - }
160   - ```
161   -9. ##### **QueryUserInviteUid**
162   -
163   - ```javascript
164   - PCSDK.data.QueryUserInviteUid: any
165   - ```
166   -
167   - 定义:获取此次分享会话进入游戏,分享来源者用户userId
168   -
169   - 接入SDK的分享视频模块,分享出去的链接query会携带invite_user_uid参数,从分享会话点入游戏,获取此次分享会话的邀请者id: invite_user_uid,不是从分享会话点入游戏QueryUserInviteUid为0。
170   - >>>开发者不接入SDK分享视频模块,游戏分享url的query参数必须要加入以下两个参数channel_id与user_invite_uid:channel_id的值通过ChannelId api获取,user_invite_uid的值可通过UserId api获取,也可以开发者从游戏中得到。
171   - >>>每次分享query请携带:
172   - ```javascript
173   - `channel_id=${ PCSDK.data.ChannelId }&user_invite_uid=${ PCSDK.data.UserId }`
174   - ```
175   -
176   - 示例:
177   -
178   - ```javascript
179   - // 从分享会话邀请链接进入,获得的值为邀请者用户id,不是分享会话邀请进入获取值为0
180   - let inviteUid = PCSDK.data.QueryUserInviteUid;
181   - ```
182   -10. ##### **IsCross**<div id="ad_cross"></div>
183   -
184   - ```javascript
185   - PCSDK.data.IsCross: boolean
186   - ```
187   -
188   - 定义:获取是否显示/隐藏交叉悬浮框推广位,true:显示,false:隐藏
189   -
190   - 示例:获取是否显示交叉悬浮框推广位
191   -
192   - ```javascript
193   - // 设置交叉悬浮框推广位ui的显示隐藏
194   - let isShow = PCSDK.data.IsCross;
195   - this.uiCross.visible = isShow;
196   - ```
197   -11. ##### **IsDrawer**
198   -
199   - ```javascript
200   - PCSDK.data.IsDrawer: boolean
201   - ```
202   -
203   - 定义:获取是否显示/隐藏交叉抽屉推广位,true:显示,false:隐藏
204   -
205   - 示例:
206   -
207   - ```javascript
208   - // 设置交叉抽屉推广位ui的显示隐藏
209   - let isShow = PCSDK.data.IsDrawer;
210   - this.uiDrawer.visible = isShow;
211   - ```
212   -12. ##### **IsGuessLike**
213   -
214   - ```javascript
215   - PCSDK.data.IsGuessLike: boolean
216   - ```
217   -
218   - 定义:获取是否显示/隐藏交叉猜你喜欢推广位,true:显示,false:隐藏
219   -
220   - 示例:
221   -
222   - ```javascript
223   - // 设置交叉猜你喜欢推广位ui的显示隐藏
224   - let isShow = PCSDK.data.IsGuessLike;
225   - this.uiGuessLike.visible = isShow;
226   - ```
227 0 \ No newline at end of file
download.md
... ... @@ -1,61 +0,0 @@
1   -# SDK下载
2   -
3   -------
4   -
5   -## [v1.0.0.3 下载](https://dep.miso-lab.com/sdkword/versions/sdk-in-v1.0.0.3.zip)
6   -
7   -> *发布时间*:2019.09.18
8   -
9   -**新增:**
10   -
11   -1. 移除掉stat模块的onlineTimeLen和logout api。
12   -2. 微信小游戏引入GameIcon、GameBanner、GamePortal组件。
13   -3. config.js添加积分投放IntegralChannelId参数,用于积分投放渠道统计。
14   -
15   -## [v1.0.0.2 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.2.zip)
16   -
17   -> *发布时间*:2019.09.11
18   -
19   -**修复:**
20   -
21   -1. 修复外部游戏设置openId导致userId为0的问题:外部游戏openId替换userId。
22   -
23   -**新增:**
24   -
25   -1. 外部游戏修改setLogind接口为setLoginInfo( { openId: strinng , retTime: number } )。
26   -2. loadingFinish传递isActive参数,isActive为true SDK在loadingFinish结束后自动调用active。
27   -
28   -## [v1.0.0.1 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.1.zip)
29   -
30   -> *发布时间*:2019.09.04
31   -
32   -**修复:**
33   -
34   -1. 修复外部游戏stat launch api调用时序问题导致参数传递异常
35   -
36   -**新增:**
37   -
38   -1. config.js配置ShareData新增share_wxad_id参数:视频广告uid,配置此参数,推送看视频,不配置或者配置的uid无效则推送分享。
39   -2. stat模块的addLogLevel拆分为多个接口:logLevelRelive、logLevelWin、logLevelFail、logLevelHide,addLogLevel继续保留。
40   -3. data模块新增了三个控制交叉推广位动态控制显示/隐藏的api:IsCross、IsDrawer、IsGuessLike。
41   -4. share模块重新命名为:shareVideo,shareDispatch修改为dispatch、shareWithType修改为dispatchType、getShareType修改为getShareVideoType,原来的share模块还是能用。
42   -
43   -
44   -## [v1.0.0.0 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.0.zip)
45   -
46   -> *发布时间*:2019.08.31
47   -
48   -**修复:**
49   -
50   -1. SDK外部版本不需要接入方调用stat 模块launch接口,SDK启动时候自动调用。
51   -2. QQ轻游戏分享不成功回调的问题。
52   -3. QQ轻游戏banner广告不贴底部的问题。
53   -
54   -**新增:**
55   -
56   -1. config.js配置新增IsOnlineAutoUse、IsOnlineDebug、ShareRightKey配置参数。
57   -
58   - 在线参数获取通过配置决定是否启动拉取,右上角分享配置进行读取shareKey。
59   -
60   -2. SDK分享模块不区分内部还是外部游戏,都引入分享/视频模块功能。
61   -
... ... @@ -1,275 +0,0 @@
1   -# 事件模块
2   -事件是一种观察者的设计模式,对象可以发布事件,然后其它对象可以观察该对象,等待这些时刻到来并通过运行代码来响应。
3   -
4   -事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。
5   -
6   -开发者游戏项目和PCSDK属于两个不同的模块,PCSDK会在SDK内部处理一些业务,想要把这些处理结果告知开发者,那么自定义事件就派上用场了,SDK封装了一个event模块:PCSDK.event,开发者可使用这个模块接收SDK内部派发的消息,也可以应用在游戏中不同模块中通信的情况。
7   -
8   -<font color="red">PCSDK内部派发了以下几个内部消息,开发者可根据实际功能需要使用PCSDK.event api监听这些消息:</font>
9   -
10   -> 1、app.show:多平台的onShow事件消息,例如微信小游戏、QQ轻游戏的onShow事件。使用方式:
11   ->
12   -> **PCSDK.event.add( 'app.show' , 处理此消息的事件函数, 事件函数上下文)**
13   -
14   -> 2、app.hide: 多平台的onHide事件消息,例如微信小游戏、QQ轻游戏的onHide事件。使用方式:
15   ->
16   -> **PCSDK.event.add( 'app.hide' , 处理此消息的事件函数, 事件函数上下文)**
17   -
18   -> 3、tactic.update:推送策略更新事件消息,接入[分享视频模块(shareVideo)](share.md)后,某个功能点当前分享/视频完成后,下一次推送策略类型会通过这个消息发送处理,开发者监听这个消息,可处理游戏页面上的ui展示(如:视频分享icon、视频分享文案等),[查看完整示例](share.md#detail)。使用方式:
19   ->
20   -> **PCSDK.event.add( 'tactic.update' , 处理此消息的事件函数, 事件函数上下文)**
21   -
22   -
23   -#### **接入API**:
24   -
25   -| **名称** | **功能说明** |
26   -| ---------------- | ------------------------------------------------------------ |
27   -| PCSDK.event.add | 添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文 |
28   -| PCSDK.event.once | 添加一个事件监听,执行一次后会自动移除此事件监听 |
29   -| PCSDK.event.emit | 触发事件监听:执行所绑定的事件类型对应的触发函数 |
30   -| PCSDK.event.remove | 移除事件监听:移除添加的事件类型的触发函数 |
31   -| PCSDK.event.removeAll | 移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 |
32   -
33   -1. **add**
34   - ```javascript
35   - PCSDK.event.add( evt_name: string, listener: Function, context: any ): PCSDK.event
36   - ```
37   -
38   - 定义:添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文。与之对应的是移除事件监听:PCSDK.event.remove:页面销毁或者关闭的时候移除监听
39   -
40   - 参数:
41   -
42   - ```javascript
43   - evt_name: string 必传 事件类型名称
44   -
45   - listener: Function 必传 触发函数func,事件处理监听函数
46   -
47   - context: any 必传 触发函数func执行上下文
48   - ```
49   - 返回值:
50   -
51   - ```javascript
52   - PCSDK.event
53   - 返回的是event对象,方便链式调用, 例如:
54   - PCSDK.event.add('update.money', () => { }, this )
55   - .add('update.exp', () => { }, this );
56   - ```
57   - <div id="event_add"></div>
58   - 示例:游戏中进入Home场景监听金币更新函数,更新金币ui界面的值,关闭Home场景时,移除金币更新函数。
59   -
60   - ```javascript
61   - export default class HomeScene extends BaseView{
62   - protected addEvent() {
63   - super.addEvent();
64   - // 添加注册金币更新事件监听
65   - PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
66   - }
67   -
68   - protected removeEvent() {
69   - super.removeEvent();
70   - // 移除注册金币更新事件监听
71   - PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
72   - }
73   -
74   - /**
75   - * 更新金币ui
76   - */
77   - private handleUpdateMoney( money: number ){
78   - this.txtCoin.text = `${money}`;
79   - }
80   - }
81   -
82   - /**
83   - * event事件枚举
84   - */
85   - export enum EventEnum{
86   - UPDATE_MONEY = 'update.money'
87   - }
88   - ```
89   -2. **once**
90   - ```javascript
91   - PCSDK.event.once( evt_name: string, listener: Function, context?: any ): PCSDK.event
92   - ```
93   -
94   - 定义:添加一个事件监听,执行一次后会自动移除此事件监听
95   -
96   - 参数:
97   -
98   - ```javascript
99   - evt_name: string 必传 事件类型名称
100   -
101   - listener: Function 必传 触发函数func,事件处理监听函数
102   -
103   - context: any 必传 触发函数func执行上下文
104   - ```
105   - 返回值:
106   -
107   - ```javascript
108   - PCSDK.event
109   - 返回的是event对象,方便链式调用, 例如:
110   - PCSDK.event.once('update.money', () => { }, this )
111   - .once('update.exp', () => { }, this );
112   - ```
113   -
114   - 示例:游戏中进入Home场景监听金币更新函数一次,该函数执行完一次后会自动移除该监听事件函数。
115   -
116   - ```javascript
117   - export default class HomeScene extends BaseView{
118   - protected open(){
119   - super.open();
120   - // 添加一次注册金币更新事件监听,该事件监听执行一次后,自动移除
121   - PCSDK.event.once(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
122   - }
123   -
124   - /**
125   - * 更新金币ui
126   - */
127   - private handleUpdateMoney( money: number ){
128   - this.txtCoin.text = `${money}`;
129   - }
130   - }
131   -
132   - /**
133   - * event事件枚举
134   - */
135   - export enum EventEnum{
136   - UPDATE_MONEY = 'update.money'
137   - }
138   - ```
139   -3. **emit**
140   - ```javascript
141   - PCSDK.event.emit( evt_name: string, ...args: any[] ): PCSDK.event
142   - ```
143   -
144   - 定义:派发事件监听消息:执行所绑定的事件类型对应的触发函数,可以传递一些触发函数需要的其他任意参数
145   -
146   - 参数:
147   -
148   - ```javascript
149   - evt_name: string 必传 事件类型名称
150   -
151   - args: any[] 选传 触发函数需要的其他任意参数
152   - ```
153   - 返回值:
154   -
155   - ```javascript
156   - PCSDK.event
157   - 返回的是event对象,方便链式调用, 例如:
158   - PCSDK.event.emit('update.money', 10000)
159   - .emit('update.exp', 2, 1000 );
160   - ```
161   -
162   - 示例:游戏中金币领取奖励弹出框,点击领奖后派发金币更新的消息
163   -
164   - ```javascript
165   - // RewardCoinPopwin弹出框领奖励后,派发update.money消息
166   - export default class RewardCoinPopwin extends BaseView{
167   - private rewardCoin: number;
168   -
169   - protected open(){
170   - super.open();
171   - this.rewardCoin = 10000000;
172   - }
173   -
174   - protected addEvent() {
175   - super.addEvent();
176   - this.btnReward.on(Laya.Event.CLICK, this, this.onReward);
177   - }
178   -
179   - protected removeEvent() {
180   - super.removeEvent();
181   - this.btnReward.off(Laya.Event.CLICK, this, this.onReward);
182   - }
183   -
184   - /**
185   - * 金币领取奖励
186   - */
187   - private onReward(ev: Laya.Event){
188   - // 派发金币更新的消息,并把添加的金币传递
189   - PCSDK.event.emit(EventEnum.UPDATE_MONEY, this.rewardCoin );
190   - }
191   - }
192   -
193   - // HomeScene监听update.money消息,处理加金币操作
194   - export default class HomeScene extends BaseView{
195   - protected addEvent() {
196   - super.addEvent();
197   - // 添加注册金币更新事件监听
198   - PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
199   - }
200   -
201   - protected removeEvent() {
202   - super.removeEvent();
203   - // 移除注册金币更新事件监听
204   - PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
205   - }
206   -
207   - /**
208   - * 更新金币ui
209   - */
210   - private handleUpdateMoney( addMoney: number ){
211   - this.txtAddCoin.text = `${addMoney}`;
212   - }
213   - }
214   -
215   - /**
216   - * event事件枚举
217   - */
218   - export enum EventEnum{
219   - UPDATE_MONEY = 'update.money'
220   - }
221   - ```
222   -
223   -4. **remove**
224   - ```javascript
225   - PCSDK.event.remove( evt_name: string, listener: Function, context?: any ): PCSDK.event
226   - ```
227   -
228   - 定义:移除事件监听:移除添加的事件类型的触发函数。
229   -
230   - 参数:
231   -
232   - ```javascript
233   - evt_name: string 必传 事件类型名称
234   -
235   - listener: Function 必传 触发函数func,事件处理监听函数
236   -
237   - context: any 必传 触发函数func执行上下文
238   - ```
239   - 返回值:
240   -
241   - ```javascript
242   - PCSDK.event
243   - 返回的是event对象,方便链式调用, 例如:
244   - PCSDK.event.remove('update.money', () => { }, this )
245   - .remove('update.exp', () => { }, this );
246   - ```
247   -
248   - 示例:[见上例](event.md#event_add)
249   -
250   -5. **removeAll**
251   - ```javascript
252   - PCSDK.event.removeAll( evt_name: string ): PCSDK.event
253   - ```
254   -
255   - 定义:移除所有事件监听:移除添加的事件类型下所有该类型的触发函数
256   -
257   - 参数:
258   -
259   - ```javascript
260   - evt_name: string 必传 事件类型名称
261   - ```
262   - 返回值:
263   -
264   - ```javascript
265   - PCSDK.event
266   - 返回的是event对象,方便链式调用, 例如:
267   - PCSDK.event.removeAll('update.money')
268   - .removeAll('update.exp');
269   - ```
270   -
271   - 示例:
272   -
273   - 移除游戏中所有update.money事件监听:PCSDK.event.removeAll('update.money');
274   -
275   - 移除游戏中所有update.exp事件监听:PCSDK.event.removeAll('update.exp');
... ... @@ -1,174 +0,0 @@
1   -# FAQ
2   -
3   -------
4   -
5   -#### **简介**
6   -
7   -启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。
8   -
9   -
10   -
11   -#### **后台使用**
12   -
13   -完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息:
14   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png "🔍点击查看大图")
15   -
16   -点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息:
17   -
18   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png "🔍点击查看大图")
19   -
20   -
21   -
22   -
23   -
24   -#### **接入API:**
25   -
26   -| **名称** | **功能说明** |
27   -| ------------------------ | ------------------------------------------------------------ |
28   -| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,不是微信代码包白屏加载完成,游戏loading自身cdn资源加载完成调用 |
29   -| PCSDK.stat.setLogind | 设置sdk必须要使用的用户id、第一次创建角色的注册时间,游戏接入方登录游戏服务器后调用 |
30   -| PCSDK.stat.active | 用户活跃/新增注册上报,切记在setLogind设置需要的信息过后使用(不限于使用位置),不然会导致新增注册数据统计异常 |
31   -
32   -
33   -
34   -
35   -
36   -
37   -
38   -1. **loadingFinish**
39   -
40   - ```javascript
41   - PCSDK.stat.loadingFinish(): void
42   - ```
43   -
44   - 定义:加载游戏加载资源完成时打点
45   -
46   - 参数:
47   -
48   - ```
49   - 无
50   - ```
51   -
52   - 示例:加载完成游戏主界面图片、json资源打点
53   -
54   - ```javascript
55   - private async initEnv() {
56   - await SDKTools.env(Const.VERSION);
57   - this.loadRes();
58   - this.loadLogin();
59   - }
60   -
61   - // 开始加载资源
62   - private loadRes() {
63   - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
64   - }
65   -
66   - // 资源加载完成
67   - private onLoadedMain() {
68   - PCSDK.stat.loadingFinish()
69   - }
70   -
71   - // 更新资源加载进度条
72   - private onProgressMain(ret) {
73   - let progress = ret.data;
74   - this.skin.txtProgress.text = Math.floor(progress * 100) + '%';
75   - }
76   - ```
77   -
78   -2. **setLogind**
79   -
80   - ```javascript
81   - PCSDK.stat.setLogind( data: object ): void
82   - ```
83   -
84   - 定义:游戏登录完成,得到登录用户的用户id和用户第一次注册时间,设置SDK必需的用户信息
85   -
86   - 参数:
87   -
88   - ```javascript
89   - data: object
90   -{
91   - userId: string | number 必传, 用户唯一标识id
92   - regTime: number 必传,用户第一次创建角色的注册时间戳
93   - }
94   - ```
95   -
96   - 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟使用环境)
97   -
98   - ```javascript
99   - // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息
100   - Api.login().then( data => {
101   - let { user_id, user_reg_time } = data;
102   - PCSDK.stat.setLogind({
103   - userId: data.user_id,
104   - regTime: data.user_reg_time
105   - });
106   - });
107   - ```
108   -
109   -3. **active**
110   -
111   - ```javascript
112   - PCSDK.stat.active(): void
113   - ```
114   -
115   - 定义:用户活跃/新增注册上报,切记在使用setLogind设置用户信息过后调用此接口,不然会导致新增注册数据统计异常
116   -
117   - 参数:
118   -
119   - ```javascript
120   - 无
121   - ```
122   -
123   - 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟该接口使用环境)
124   -
125   - ```javascript
126   - // 使用场景1:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息后立即调用active
127   - Api.login().then( data => {
128   - let { user_id, user_reg_time } = data;
129   - // 设置用户信息
130   - PCSDK.stat.setLogind({
131   - userId: data.user_id,
132   - regTime: data.user_reg_time
133   - });
134   - // 用户活跃注册打点
135   - PCSDK.stat.active();
136   - });
137   -
138   - // 使用场景2:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息。在其他界面调用active
139   - // 资源加载loading界面
140   - class LoadingScene(){
141   - constructor(){
142   - this.login();
143   - }
144   -
145   - private login(){
146   - // 登录
147   - Api.login().then( data => {
148   - let { user_id, user_reg_time } = data;
149   - // 设置用户信息
150   - PCSDK.stat.setLogind({
151   - userId: data.user_id,
152   - regTime: data.user_reg_time
153   - });
154   - // 进入home主页场景
155   - SceneManager.I.switchScene(HomeScene);
156   - });
157   - }
158   - }
159   -
160   - // Home页面
161   - class HomeScene(){
162   - constructor(){
163   - this.btnStarGame.on('click', this.onGame, this);
164   - }
165   -
166   - private onGame(){
167   - // 用户活跃注册打点
168   - PCSDK.stat.active();
169   - // 进入游戏页面
170   - SceneManager.I.switchScene(GameScene);
171   - }
172   - }
173   -
174   - ```
175 0 \ No newline at end of file
inner/.gitignore 0 → 100644
... ... @@ -0,0 +1,64 @@
  1 +# Node rules:
  2 +## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
  3 +.grunt
  4 +
  5 +## Dependency directory
  6 +## Commenting this out is preferred by some people, see
  7 +## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git
  8 +node_modules
  9 +node_modules/
  10 +node_modules/**/*
  11 +
  12 +# Book build output
  13 +_book
  14 +
  15 +# eBook build output
  16 +*.epub
  17 +*.mobi
  18 +*.pdf
  19 +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion
  20 +
  21 +*.iml
  22 +
  23 +## Directory-based project format:
  24 +.idea/
  25 +# if you remove the above rule, at least ignore the following:
  26 +
  27 +# User-specific stuff:
  28 +# .idea/workspace.xml
  29 +# .idea/tasks.xml
  30 +# .idea/dictionaries
  31 +
  32 +# Sensitive or high-churn files:
  33 +# .idea/dataSources.ids
  34 +# .idea/dataSources.xml
  35 +# .idea/sqlDataSources.xml
  36 +# .idea/dynamic.xml
  37 +# .idea/uiDesigner.xml
  38 +
  39 +# Gradle:
  40 +# .idea/gradle.xml
  41 +# .idea/libraries
  42 +
  43 +# Mongo Explorer plugin:
  44 +# .idea/mongoSettings.xml
  45 +
  46 +## File-based project format:
  47 +*.ipr
  48 +*.iws
  49 +
  50 +## Plugin-specific files:
  51 +
  52 +# IntelliJ
  53 +/out/
  54 +
  55 +# mpeltonen/sbt-idea plugin
  56 +.idea_modules/
  57 +
  58 +# JIRA plugin
  59 +atlassian-ide-plugin.xml
  60 +
  61 +# Crashlytics plugin (for Android Studio and IntelliJ)
  62 +com_crashlytics_export_strings.xml
  63 +crashlytics.properties
  64 +crashlytics-build.properties
... ...
inner/README.md
... ... @@ -16,17 +16,9 @@ PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,
16 16 # 噗嗤管理后台
17 17 噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。
18 18  
19   -方便开发者联调测试阶段不影响上线游戏运营相关数据或者配置信息,config.js的Env配置提供测试和正式环境切换。
20   -
21   -> 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login)
22   -
23   -> 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login)
24   -
25 19 噗嗤管理后台地址:
26 20  
27   -- 测试服后台,地址:http://pre-data.d3games.com/#/login
28   -
29   -- 正式服后台,地址:https://data.d3games.com/#/login
  21 +- https://data.d3games.com/#/login
30 22  
31 23 **友情提示:**
32 24  
... ... @@ -52,8 +44,8 @@ PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,
52 44  
53 45 **后台提供配置相关功能(不能跳转请联系管理员添加权限):**
54 46  
55   -- [分享/视频配置](http://pre-data.d3games.com/index.html#/share_list)
56   -- [配置参数](http://pre-data.d3games.com/index.html#/config_list)
  47 +- [分享/视频配置](https://data.d3games.com/index.html#/share_list)
  48 +- [配置参数](https://data.d3games.com/index.html#/config_list)
57 49  
58 50  
59 51 # 更多:
... ...
inner/SUMMARY.md 0 → 100644
... ... @@ -0,0 +1,28 @@
  1 +# Summary
  2 +## SDK入门
  3 +* [SDK简介](intro.md)
  4 +* [SDK下载](download.md)
  5 +* [安装步骤️️️️](install.md)
  6 +
  7 +## SDK手册
  8 +* [模块概览](modules.md)
  9 +
  10 +* [统计模块](stat.md)
  11 + * [启动注册打点️](stat_active.md)
  12 + * [关卡分析打点️️](stat_level.md)
  13 + * [支付结果打点](stat_pay.md)
  14 + * [自定义事件打点](stat_event.md)
  15 + * [交叉推广位](stat_ads.md)
  16 +* [分享视频模块](share.md)
  17 +* [配置参数模块️](online.md)
  18 +* [多平台接口模块](platform.md)
  19 + * [打开客服消息](platform.md#service)
  20 + * [检测自动更新](platform.md#checkUpdate)
  21 + * [复制文本内容](platform.md#copy)
  22 + * [震动接口](platform.md#vibrate)
  23 + * [小游戏推荐弹窗组件GamePortal](platform.md#gamePortal)
  24 + * [小游戏插屏广告组件InterstitialAd](platform.md#interstitialAd)
  25 + * [小游戏推荐icon组件GameIcon](platform.md#gameicon)
  26 +* [数据模块](data.md)
  27 +* [事件模块](event.md)
  28 +* [FAQ❎](faq.md)
0 29 \ No newline at end of file
... ...
inner/book.json 0 → 100644
... ... @@ -0,0 +1,69 @@
  1 +{
  2 + "title": "噗嗤游戏使用文档",
  3 + "description": "记录 GitBook 的配置和一些插件的使用",
  4 + "author": "zhangjikai",
  5 + "output.name": "site",
  6 + "language": "zh-hans",
  7 + "gitbook": "3.2.3",
  8 + "root": ".",
  9 + "plugins": [
  10 + "-lunr",
  11 + "-search",
  12 + "-sharing",
  13 + "-highlight",
  14 + "-livereload",
  15 + "emphasize",
  16 + "simple-page-toc@^0.1.1",
  17 + "prism",
  18 + "prism-themes",
  19 + "include-codeblock@^3.0.2",
  20 + "splitter@^0.0.8",
  21 + "tbfed-pagefooter@^0.0.1",
  22 + "expandable-chapters-small@^0.1.7",
  23 + "sectionx@^3.1.0",
  24 + "local-video@^1.0.1",
  25 + "anchor-navigation-ex",
  26 + "todo@^0.1.3",
  27 + "popup",
  28 + "lightbox",
  29 + "versions-select@^0.1.1",
  30 + "copy-code-button"
  31 + ],
  32 + "structure": {
  33 + "readme": "README.md"
  34 + },
  35 + "styles": {
  36 + "website": "styles/website.css"
  37 + },
  38 + "pluginsConfig": {
  39 + "versions": {
  40 + "options": [
  41 + {
  42 + "value": "http://dep.miso-lab.com/sdkword/web/v1.0/intro.html",
  43 + "text": "外部游戏-v1.0.0.3"
  44 + },
  45 + {
  46 + "value": "http://dep.miso-lab.com/sdkword/web/v2.0/intro.html",
  47 + "text": "内部游戏-v1.0.0.3"
  48 + }
  49 + ]
  50 + },
  51 + "prism": {
  52 + "css": [
  53 + "prism-themes/themes/prism-base16-ateliersulphurpool.light.css"
  54 + ]
  55 + },
  56 + "anchor-navigation-ex": {
  57 + "associatedWithSummary": false,
  58 + "showLevel": true,
  59 + "multipleH1": true,
  60 + "mode": "float",
  61 + "pageTop": {
  62 + "showLevelIcon": false,
  63 + "level1Icon": "fa fa-hand-o-right",
  64 + "level2Icon": "fa fa-hand-o-right",
  65 + "level3Icon": "fa fa-hand-o-right"
  66 + }
  67 + }
  68 + }
  69 +}
0 70 \ No newline at end of file
... ...
inner/data.md 0 → 100644
... ... @@ -0,0 +1,226 @@
  1 +
  2 +# 数据模块
  3 +
  4 +------
  5 +
  6 +#### **简介**
  7 +
  8 +此模块为开发者提供游戏用到的一些数据信息,例如:config.js配置的GameId,ChannelId、从分享链接进入query携带的参数(share_id/share_key/user_invite_uid/channel_id)、setLogind设置的用户ID(userId)和用户注册时间(regTime)等等,详细请阅读下面的api。
  9 +
  10 +
  11 +
  12 +#### **API:**
  13 +
  14 +| **名称** | **功能说明** |
  15 +| ------------------------------- | ------------------------------------------------------------ |
  16 +| PCSDK.data.GameId | 获取游戏的GameId,来源于config.js配置的GameId |
  17 +| PCSDK.data.ChannelId| 获取游戏渠道ID,来源于config.js配置的ChannelId |
  18 +| PCSDK.data.UserId | 获取用户ID,setLoginInfo传递的openId的值|
  19 +| PCSDK.data.RegTime | 获取用户注册时间,setLoginInfo传递的regTime的值 |
  20 +| PCSDK.data.ShareId | 获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0 |
  21 +| PCSDK.data.ShareKey | 接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key |
  22 +| PCSDK.data.Platform | 获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) |
  23 +| PCSDK.data.SystemId | 获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备) |
  24 +| PCSDK.data.QueryUserInviteUid | 获取此次分享会话进入游戏,分享来源者用户ID |
  25 +| PCSDK.data.IsCross | 获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏 |
  26 +| PCSDK.data.IsDrawer | 获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏 |
  27 +| PCSDK.data.IsGuessLike | 获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏 |
  28 +
  29 +
  30 +
  31 +1. ##### **GameId**
  32 +
  33 + ```javascript
  34 + PCSDK.data.GameId: number
  35 + ```
  36 +
  37 + 定义:获取游戏的GameId,该值来源于congfig.js中的【GameId】配置。详细[阅读config.js的GameId参数详解](install.md#config_env)
  38 +
  39 + 示例:
  40 +
  41 + ```javascript
  42 + let gameId = PCSDK.data.GameId;
  43 + ```
  44 +2. ##### **ChannelId**
  45 +
  46 + ```javascript
  47 + PCSDK.data.ChannelId: number
  48 + ```
  49 +
  50 + 定义:获取游戏的渠道Id,该值来源于congfig.js中的【ChannelId】配置。详细[阅读config.js的ChannelId参数详解](install.md#config_env)
  51 +
  52 + 示例:
  53 +
  54 + ```javascript
  55 + let channelId = PCSDK.data.ChannelId;
  56 + ```
  57 +3. ##### **UserId**
  58 +
  59 + ```javascript
  60 + PCSDK.data.UserId: number | string
  61 + ```
  62 +
  63 + 定义:获取用户ID,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的openId
  64 +
  65 + 示例:
  66 +
  67 + ```javascript
  68 + let userId = PCSDK.data.UserId;
  69 + ```
  70 +4. ##### **RegTime**
  71 +
  72 + ```javascript
  73 + PCSDK.data.RegTime: number
  74 + ```
  75 +
  76 + 定义:获取用户第一次创角的时间戳,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的regTime
  77 +
  78 + 示例:
  79 +
  80 + ```javascript
  81 + let regTime = PCSDK.data.RegTime;
  82 + ```
  83 +5. ##### **ShareId**
  84 +
  85 + ```javascript
  86 + PCSDK.data.ShareId: number
  87 + ```
  88 +
  89 + 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_id参数,从分享会话点入游戏,获取此次分享会话的shareId,不是从分享会话点入游戏ShareId为0
  90 +
  91 + 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入
  92 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍")
  93 +
  94 + ```javascript
  95 + // shareId的值为:680
  96 + let shareId = PCSDK.data.ShareId;
  97 + ```
  98 +6. ##### **ShareKey**
  99 +
  100 + ```javascript
  101 + PCSDK.data.ShareKey: string
  102 + ```
  103 +
  104 + 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_key参数,从分享会话点入游戏,获取此次分享会话的shareKey,不是从分享会话点入游戏ShareKey为''
  105 +
  106 + 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入
  107 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍")
  108 +
  109 + ```javascript
  110 + // shareKey的值为:success_double
  111 + let shareKey = PCSDK.data.ShareKey;
  112 + ```
  113 +7. ##### **Platform**
  114 +
  115 + ```javascript
  116 + PCSDK.data.Platform: string
  117 + ```
  118 +
  119 + 定义:获取游戏运行平台环境:devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备)
  120 +
  121 + 示例:
  122 +
  123 + ```javascript
  124 + let platform = PCSDK.data.Platform;
  125 + switch (platform) {
  126 + case 'devtools': // 开发者工具
  127 +
  128 + break;
  129 +
  130 + case 'ios': // 苹果设备
  131 +
  132 + break;
  133 +
  134 + case 'android': // 安卓设备
  135 +
  136 + break;
  137 + }
  138 + ```
  139 +8. ##### **SystemId**
  140 +
  141 + ```javascript
  142 + PCSDK.data.SystemId: number
  143 + ```
  144 +
  145 + 定义:获取游戏运行平台环境:0(开发者调试工具或ios)、1(安卓设备)
  146 +
  147 + 示例:
  148 +
  149 + ```javascript
  150 + let systemId = PCSDK.data.SystemId;
  151 + switch (systemId) {
  152 + case 0: // 开发者工具 or 苹果设备
  153 +
  154 + break;
  155 +
  156 + case 1: // 安卓设备
  157 +
  158 + break;
  159 + }
  160 + ```
  161 +9. ##### **QueryUserInviteUid**
  162 +
  163 + ```javascript
  164 + PCSDK.data.QueryUserInviteUid: any
  165 + ```
  166 +
  167 + 定义:获取此次分享会话进入游戏,分享来源者用户userId
  168 +
  169 + 接入SDK的分享视频模块,分享出去的链接query会携带invite_user_uid参数,从分享会话点入游戏,获取此次分享会话的邀请者id: invite_user_uid,不是从分享会话点入游戏QueryUserInviteUid为0。
  170 + >>>开发者不接入SDK分享视频模块,游戏分享url的query参数必须要加入以下两个参数channel_id与user_invite_uid:channel_id的值通过ChannelId api获取,user_invite_uid的值可通过UserId api获取,也可以开发者从游戏中得到。
  171 + >>>每次分享query请携带:
  172 + ```javascript
  173 + `channel_id=${ PCSDK.data.ChannelId }&user_invite_uid=${ PCSDK.data.UserId }`
  174 + ```
  175 +
  176 + 示例:
  177 +
  178 + ```javascript
  179 + // 从分享会话邀请链接进入,获得的值为邀请者用户id,不是分享会话邀请进入获取值为0
  180 + let inviteUid = PCSDK.data.QueryUserInviteUid;
  181 + ```
  182 +10. ##### **IsCross**<div id="ad_cross"></div>
  183 +
  184 + ```javascript
  185 + PCSDK.data.IsCross: boolean
  186 + ```
  187 +
  188 + 定义:获取是否显示/隐藏交叉悬浮框推广位,true:显示,false:隐藏
  189 +
  190 + 示例:获取是否显示交叉悬浮框推广位
  191 +
  192 + ```javascript
  193 + // 设置交叉悬浮框推广位ui的显示隐藏
  194 + let isShow = PCSDK.data.IsCross;
  195 + this.uiCross.visible = isShow;
  196 + ```
  197 +11. ##### **IsDrawer**
  198 +
  199 + ```javascript
  200 + PCSDK.data.IsDrawer: boolean
  201 + ```
  202 +
  203 + 定义:获取是否显示/隐藏交叉抽屉推广位,true:显示,false:隐藏
  204 +
  205 + 示例:
  206 +
  207 + ```javascript
  208 + // 设置交叉抽屉推广位ui的显示隐藏
  209 + let isShow = PCSDK.data.IsDrawer;
  210 + this.uiDrawer.visible = isShow;
  211 + ```
  212 +12. ##### **IsGuessLike**
  213 +
  214 + ```javascript
  215 + PCSDK.data.IsGuessLike: boolean
  216 + ```
  217 +
  218 + 定义:获取是否显示/隐藏交叉猜你喜欢推广位,true:显示,false:隐藏
  219 +
  220 + 示例:
  221 +
  222 + ```javascript
  223 + // 设置交叉猜你喜欢推广位ui的显示隐藏
  224 + let isShow = PCSDK.data.IsGuessLike;
  225 + this.uiGuessLike.visible = isShow;
  226 + ```
0 227 \ No newline at end of file
... ...
inner/download.md 0 → 100644
... ... @@ -0,0 +1,61 @@
  1 +# SDK下载
  2 +
  3 +------
  4 +
  5 +## [v1.0.0.3 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.3.zip)
  6 +
  7 +> *发布时间*:2019.09.18
  8 +
  9 +**新增:**
  10 +
  11 +1. 移除掉stat模块的onlineTimeLen和logout api。
  12 +2. 微信小游戏引入GameIcon、GameBanner、GamePortal组件。
  13 +3. config.js添加积分投放IntegralChannelId参数,用于积分投放渠道统计。
  14 +
  15 +## [v1.0.0.2 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.2.zip)
  16 +
  17 +> *发布时间*:2019.09.11
  18 +
  19 +**修复:**
  20 +
  21 +1. 修复外部游戏设置openId导致userId为0的问题:外部游戏openId替换userId。
  22 +
  23 +**新增:**
  24 +
  25 +1. 外部游戏修改setLogind接口为setLoginInfo( { openId: strinng , retTime: number } )。
  26 +2. loadingFinish传递isActive参数,isActive为true SDK在loadingFinish结束后自动调用active。
  27 +
  28 +## [v1.0.0.1 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.1.zip)
  29 +
  30 +> *发布时间*:2019.09.04
  31 +
  32 +**修复:**
  33 +
  34 +1. 修复外部游戏stat launch api调用时序问题导致参数传递异常
  35 +
  36 +**新增:**
  37 +
  38 +1. config.js配置ShareData新增share_wxad_id参数:视频广告uid,配置此参数,推送看视频,不配置或者配置的uid无效则推送分享。
  39 +2. stat模块的addLogLevel拆分为多个接口:logLevelRelive、logLevelWin、logLevelFail、logLevelHide,addLogLevel继续保留。
  40 +3. data模块新增了三个控制交叉推广位动态控制显示/隐藏的api:IsCross、IsDrawer、IsGuessLike。
  41 +4. share模块重新命名为:shareVideo,shareDispatch修改为dispatch、shareWithType修改为dispatchType、getShareType修改为getShareVideoType,原来的share模块还是能用。
  42 +
  43 +
  44 +## [v1.0.0.0 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.0.zip)
  45 +
  46 +> *发布时间*:2019.08.31
  47 +
  48 +**修复:**
  49 +
  50 +1. SDK外部版本不需要接入方调用stat 模块launch接口,SDK启动时候自动调用。
  51 +2. QQ轻游戏分享不成功回调的问题。
  52 +3. QQ轻游戏banner广告不贴底部的问题。
  53 +
  54 +**新增:**
  55 +
  56 +1. config.js配置新增IsOnlineAutoUse、IsOnlineDebug、ShareRightKey配置参数。
  57 +
  58 + 在线参数获取通过配置决定是否启动拉取,右上角分享配置进行读取shareKey。
  59 +
  60 +2. SDK分享模块不区分内部还是外部游戏,都引入分享/视频模块功能。
  61 +
... ...
inner/event.md 0 → 100644
... ... @@ -0,0 +1,275 @@
  1 +# 事件模块
  2 +事件是一种观察者的设计模式,对象可以发布事件,然后其它对象可以观察该对象,等待这些时刻到来并通过运行代码来响应。
  3 +
  4 +事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。
  5 +
  6 +开发者游戏项目和PCSDK属于两个不同的模块,PCSDK会在SDK内部处理一些业务,想要把这些处理结果告知开发者,那么自定义事件就派上用场了,SDK封装了一个event模块:PCSDK.event,开发者可使用这个模块接收SDK内部派发的消息,也可以应用在游戏中不同模块中通信的情况。
  7 +
  8 +<font color="red">PCSDK内部派发了以下几个内部消息,开发者可根据实际功能需要使用PCSDK.event api监听这些消息:</font>
  9 +
  10 +> 1、app.show:多平台的onShow事件消息,例如微信小游戏、QQ轻游戏的onShow事件。使用方式:
  11 +>
  12 +> **PCSDK.event.add( 'app.show' , 处理此消息的事件函数, 事件函数上下文)**
  13 +
  14 +> 2、app.hide: 多平台的onHide事件消息,例如微信小游戏、QQ轻游戏的onHide事件。使用方式:
  15 +>
  16 +> **PCSDK.event.add( 'app.hide' , 处理此消息的事件函数, 事件函数上下文)**
  17 +
  18 +> 3、tactic.update:推送策略更新事件消息,接入[分享视频模块(shareVideo)](share.md)后,某个功能点当前分享/视频完成后,下一次推送策略类型会通过这个消息发送处理,开发者监听这个消息,可处理游戏页面上的ui展示(如:视频分享icon、视频分享文案等),[查看完整示例](share.md#detail)。使用方式:
  19 +>
  20 +> **PCSDK.event.add( 'tactic.update' , 处理此消息的事件函数, 事件函数上下文)**
  21 +
  22 +
  23 +#### **接入API**:
  24 +
  25 +| **名称** | **功能说明** |
  26 +| ---------------- | ------------------------------------------------------------ |
  27 +| PCSDK.event.add | 添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文 |
  28 +| PCSDK.event.once | 添加一个事件监听,执行一次后会自动移除此事件监听 |
  29 +| PCSDK.event.emit | 触发事件监听:执行所绑定的事件类型对应的触发函数 |
  30 +| PCSDK.event.remove | 移除事件监听:移除添加的事件类型的触发函数 |
  31 +| PCSDK.event.removeAll | 移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 |
  32 +
  33 +1. **add**
  34 + ```javascript
  35 + PCSDK.event.add( evt_name: string, listener: Function, context: any ): PCSDK.event
  36 + ```
  37 +
  38 + 定义:添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文。与之对应的是移除事件监听:PCSDK.event.remove:页面销毁或者关闭的时候移除监听
  39 +
  40 + 参数:
  41 +
  42 + ```javascript
  43 + evt_name: string 必传 事件类型名称
  44 +
  45 + listener: Function 必传 触发函数func,事件处理监听函数
  46 +
  47 + context: any 必传 触发函数func执行上下文
  48 + ```
  49 + 返回值:
  50 +
  51 + ```javascript
  52 + PCSDK.event
  53 + 返回的是event对象,方便链式调用, 例如:
  54 + PCSDK.event.add('update.money', () => { }, this )
  55 + .add('update.exp', () => { }, this );
  56 + ```
  57 + <div id="event_add"></div>
  58 + 示例:游戏中进入Home场景监听金币更新函数,更新金币ui界面的值,关闭Home场景时,移除金币更新函数。
  59 +
  60 + ```javascript
  61 + export default class HomeScene extends BaseView{
  62 + protected addEvent() {
  63 + super.addEvent();
  64 + // 添加注册金币更新事件监听
  65 + PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  66 + }
  67 +
  68 + protected removeEvent() {
  69 + super.removeEvent();
  70 + // 移除注册金币更新事件监听
  71 + PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  72 + }
  73 +
  74 + /**
  75 + * 更新金币ui
  76 + */
  77 + private handleUpdateMoney( money: number ){
  78 + this.txtCoin.text = `${money}`;
  79 + }
  80 + }
  81 +
  82 + /**
  83 + * event事件枚举
  84 + */
  85 + export enum EventEnum{
  86 + UPDATE_MONEY = 'update.money'
  87 + }
  88 + ```
  89 +2. **once**
  90 + ```javascript
  91 + PCSDK.event.once( evt_name: string, listener: Function, context?: any ): PCSDK.event
  92 + ```
  93 +
  94 + 定义:添加一个事件监听,执行一次后会自动移除此事件监听
  95 +
  96 + 参数:
  97 +
  98 + ```javascript
  99 + evt_name: string 必传 事件类型名称
  100 +
  101 + listener: Function 必传 触发函数func,事件处理监听函数
  102 +
  103 + context: any 必传 触发函数func执行上下文
  104 + ```
  105 + 返回值:
  106 +
  107 + ```javascript
  108 + PCSDK.event
  109 + 返回的是event对象,方便链式调用, 例如:
  110 + PCSDK.event.once('update.money', () => { }, this )
  111 + .once('update.exp', () => { }, this );
  112 + ```
  113 +
  114 + 示例:游戏中进入Home场景监听金币更新函数一次,该函数执行完一次后会自动移除该监听事件函数。
  115 +
  116 + ```javascript
  117 + export default class HomeScene extends BaseView{
  118 + protected open(){
  119 + super.open();
  120 + // 添加一次注册金币更新事件监听,该事件监听执行一次后,自动移除
  121 + PCSDK.event.once(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  122 + }
  123 +
  124 + /**
  125 + * 更新金币ui
  126 + */
  127 + private handleUpdateMoney( money: number ){
  128 + this.txtCoin.text = `${money}`;
  129 + }
  130 + }
  131 +
  132 + /**
  133 + * event事件枚举
  134 + */
  135 + export enum EventEnum{
  136 + UPDATE_MONEY = 'update.money'
  137 + }
  138 + ```
  139 +3. **emit**
  140 + ```javascript
  141 + PCSDK.event.emit( evt_name: string, ...args: any[] ): PCSDK.event
  142 + ```
  143 +
  144 + 定义:派发事件监听消息:执行所绑定的事件类型对应的触发函数,可以传递一些触发函数需要的其他任意参数
  145 +
  146 + 参数:
  147 +
  148 + ```javascript
  149 + evt_name: string 必传 事件类型名称
  150 +
  151 + args: any[] 选传 触发函数需要的其他任意参数
  152 + ```
  153 + 返回值:
  154 +
  155 + ```javascript
  156 + PCSDK.event
  157 + 返回的是event对象,方便链式调用, 例如:
  158 + PCSDK.event.emit('update.money', 10000)
  159 + .emit('update.exp', 2, 1000 );
  160 + ```
  161 +
  162 + 示例:游戏中金币领取奖励弹出框,点击领奖后派发金币更新的消息
  163 +
  164 + ```javascript
  165 + // RewardCoinPopwin弹出框领奖励后,派发update.money消息
  166 + export default class RewardCoinPopwin extends BaseView{
  167 + private rewardCoin: number;
  168 +
  169 + protected open(){
  170 + super.open();
  171 + this.rewardCoin = 10000000;
  172 + }
  173 +
  174 + protected addEvent() {
  175 + super.addEvent();
  176 + this.btnReward.on(Laya.Event.CLICK, this, this.onReward);
  177 + }
  178 +
  179 + protected removeEvent() {
  180 + super.removeEvent();
  181 + this.btnReward.off(Laya.Event.CLICK, this, this.onReward);
  182 + }
  183 +
  184 + /**
  185 + * 金币领取奖励
  186 + */
  187 + private onReward(ev: Laya.Event){
  188 + // 派发金币更新的消息,并把添加的金币传递
  189 + PCSDK.event.emit(EventEnum.UPDATE_MONEY, this.rewardCoin );
  190 + }
  191 + }
  192 +
  193 + // HomeScene监听update.money消息,处理加金币操作
  194 + export default class HomeScene extends BaseView{
  195 + protected addEvent() {
  196 + super.addEvent();
  197 + // 添加注册金币更新事件监听
  198 + PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  199 + }
  200 +
  201 + protected removeEvent() {
  202 + super.removeEvent();
  203 + // 移除注册金币更新事件监听
  204 + PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  205 + }
  206 +
  207 + /**
  208 + * 更新金币ui
  209 + */
  210 + private handleUpdateMoney( addMoney: number ){
  211 + this.txtAddCoin.text = `${addMoney}`;
  212 + }
  213 + }
  214 +
  215 + /**
  216 + * event事件枚举
  217 + */
  218 + export enum EventEnum{
  219 + UPDATE_MONEY = 'update.money'
  220 + }
  221 + ```
  222 +
  223 +4. **remove**
  224 + ```javascript
  225 + PCSDK.event.remove( evt_name: string, listener: Function, context?: any ): PCSDK.event
  226 + ```
  227 +
  228 + 定义:移除事件监听:移除添加的事件类型的触发函数。
  229 +
  230 + 参数:
  231 +
  232 + ```javascript
  233 + evt_name: string 必传 事件类型名称
  234 +
  235 + listener: Function 必传 触发函数func,事件处理监听函数
  236 +
  237 + context: any 必传 触发函数func执行上下文
  238 + ```
  239 + 返回值:
  240 +
  241 + ```javascript
  242 + PCSDK.event
  243 + 返回的是event对象,方便链式调用, 例如:
  244 + PCSDK.event.remove('update.money', () => { }, this )
  245 + .remove('update.exp', () => { }, this );
  246 + ```
  247 +
  248 + 示例:[见上例](event.md#event_add)
  249 +
  250 +5. **removeAll**
  251 + ```javascript
  252 + PCSDK.event.removeAll( evt_name: string ): PCSDK.event
  253 + ```
  254 +
  255 + 定义:移除所有事件监听:移除添加的事件类型下所有该类型的触发函数
  256 +
  257 + 参数:
  258 +
  259 + ```javascript
  260 + evt_name: string 必传 事件类型名称
  261 + ```
  262 + 返回值:
  263 +
  264 + ```javascript
  265 + PCSDK.event
  266 + 返回的是event对象,方便链式调用, 例如:
  267 + PCSDK.event.removeAll('update.money')
  268 + .removeAll('update.exp');
  269 + ```
  270 +
  271 + 示例:
  272 +
  273 + 移除游戏中所有update.money事件监听:PCSDK.event.removeAll('update.money');
  274 +
  275 + 移除游戏中所有update.exp事件监听:PCSDK.event.removeAll('update.exp');
... ...
inner/faq.md 0 → 100644
... ... @@ -0,0 +1,174 @@
  1 +# FAQ
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。
  8 +
  9 +
  10 +
  11 +#### **后台使用**
  12 +
  13 +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息:
  14 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png "🔍点击查看大图")
  15 +
  16 +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息:
  17 +
  18 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png "🔍点击查看大图")
  19 +
  20 +
  21 +
  22 +
  23 +
  24 +#### **接入API:**
  25 +
  26 +| **名称** | **功能说明** |
  27 +| ------------------------ | ------------------------------------------------------------ |
  28 +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,不是微信代码包白屏加载完成,游戏loading自身cdn资源加载完成调用 |
  29 +| PCSDK.stat.setLogind | 设置sdk必须要使用的用户id、第一次创建角色的注册时间,游戏接入方登录游戏服务器后调用 |
  30 +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在setLogind设置需要的信息过后使用(不限于使用位置),不然会导致新增注册数据统计异常 |
  31 +
  32 +
  33 +
  34 +
  35 +
  36 +
  37 +
  38 +1. **loadingFinish**
  39 +
  40 + ```javascript
  41 + PCSDK.stat.loadingFinish(): void
  42 + ```
  43 +
  44 + 定义:加载游戏加载资源完成时打点
  45 +
  46 + 参数:
  47 +
  48 + ```
  49 + 无
  50 + ```
  51 +
  52 + 示例:加载完成游戏主界面图片、json资源打点
  53 +
  54 + ```javascript
  55 + private async initEnv() {
  56 + await SDKTools.env(Const.VERSION);
  57 + this.loadRes();
  58 + this.loadLogin();
  59 + }
  60 +
  61 + // 开始加载资源
  62 + private loadRes() {
  63 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  64 + }
  65 +
  66 + // 资源加载完成
  67 + private onLoadedMain() {
  68 + PCSDK.stat.loadingFinish()
  69 + }
  70 +
  71 + // 更新资源加载进度条
  72 + private onProgressMain(ret) {
  73 + let progress = ret.data;
  74 + this.skin.txtProgress.text = Math.floor(progress * 100) + '%';
  75 + }
  76 + ```
  77 +
  78 +2. **setLogind**
  79 +
  80 + ```javascript
  81 + PCSDK.stat.setLogind( data: object ): void
  82 + ```
  83 +
  84 + 定义:游戏登录完成,得到登录用户的用户id和用户第一次注册时间,设置SDK必需的用户信息
  85 +
  86 + 参数:
  87 +
  88 + ```javascript
  89 + data: object
  90 +{
  91 + userId: string | number 必传, 用户唯一标识id
  92 + regTime: number 必传,用户第一次创建角色的注册时间戳
  93 + }
  94 + ```
  95 +
  96 + 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟使用环境)
  97 +
  98 + ```javascript
  99 + // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息
  100 + Api.login().then( data => {
  101 + let { user_id, user_reg_time } = data;
  102 + PCSDK.stat.setLogind({
  103 + userId: data.user_id,
  104 + regTime: data.user_reg_time
  105 + });
  106 + });
  107 + ```
  108 +
  109 +3. **active**
  110 +
  111 + ```javascript
  112 + PCSDK.stat.active(): void
  113 + ```
  114 +
  115 + 定义:用户活跃/新增注册上报,切记在使用setLogind设置用户信息过后调用此接口,不然会导致新增注册数据统计异常
  116 +
  117 + 参数:
  118 +
  119 + ```javascript
  120 + 无
  121 + ```
  122 +
  123 + 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟该接口使用环境)
  124 +
  125 + ```javascript
  126 + // 使用场景1:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息后立即调用active
  127 + Api.login().then( data => {
  128 + let { user_id, user_reg_time } = data;
  129 + // 设置用户信息
  130 + PCSDK.stat.setLogind({
  131 + userId: data.user_id,
  132 + regTime: data.user_reg_time
  133 + });
  134 + // 用户活跃注册打点
  135 + PCSDK.stat.active();
  136 + });
  137 +
  138 + // 使用场景2:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息。在其他界面调用active
  139 + // 资源加载loading界面
  140 + class LoadingScene(){
  141 + constructor(){
  142 + this.login();
  143 + }
  144 +
  145 + private login(){
  146 + // 登录
  147 + Api.login().then( data => {
  148 + let { user_id, user_reg_time } = data;
  149 + // 设置用户信息
  150 + PCSDK.stat.setLogind({
  151 + userId: data.user_id,
  152 + regTime: data.user_reg_time
  153 + });
  154 + // 进入home主页场景
  155 + SceneManager.I.switchScene(HomeScene);
  156 + });
  157 + }
  158 + }
  159 +
  160 + // Home页面
  161 + class HomeScene(){
  162 + constructor(){
  163 + this.btnStarGame.on('click', this.onGame, this);
  164 + }
  165 +
  166 + private onGame(){
  167 + // 用户活跃注册打点
  168 + PCSDK.stat.active();
  169 + // 进入游戏页面
  170 + SceneManager.I.switchScene(GameScene);
  171 + }
  172 + }
  173 +
  174 + ```
0 175 \ No newline at end of file
... ...
inner/inner/README.md 0 → 100644
... ... @@ -0,0 +1,64 @@
  1 +# 噗嗤SDK
  2 +PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。
  3 +PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。
  4 +
  5 +**PCSDK提供的模块功能:**
  6 +
  7 +- [统计模块](stat.md)
  8 +- [分享视频模块](share.md)
  9 +- [配置参数模块️](online.md)
  10 +- [多平台接口模块](platform.md)
  11 +- [数据模块](data.md)
  12 +- [事件模块](event.md)
  13 +
  14 +
  15 +
  16 +# 噗嗤管理后台
  17 +噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。
  18 +
  19 +方便开发者联调测试阶段不影响上线游戏运营相关数据或者配置信息,config.js的Env配置提供测试和正式环境切换。
  20 +
  21 +> 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login)
  22 +
  23 +> 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login)
  24 +
  25 +噗嗤管理后台地址:
  26 +
  27 +- 测试服后台,地址:http://pre-data.d3games.com/#/login
  28 +
  29 +- 正式服后台,地址:https://data.d3games.com/#/login
  30 +
  31 +**友情提示:**
  32 +
  33 +- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。**
  34 +- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。**
  35 +- **登录后台即可使用后台提供的各项服务**
  36 +
  37 +
  38 +
  39 +**后台概览:**
  40 +## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图")
  41 +
  42 +
  43 +
  44 +**后台提供数据分析功能(不能跳转请联系管理员添加权限):**
  45 +
  46 +- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart)
  47 +- [分享数据分析](https://data.d3games.com/index.html#/share_exact)
  48 +- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list)
  49 +- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list)
  50 +
  51 +
  52 +
  53 +**后台提供配置相关功能(不能跳转请联系管理员添加权限):**
  54 +
  55 +- [分享/视频配置](http://pre-data.d3games.com/index.html#/share_list)
  56 +- [配置参数](http://pre-data.d3games.com/index.html#/config_list)
  57 +
  58 +
  59 +# 更多:
  60 +- 快速接入,请详读 [安装步骤](install.md)
  61 +
  62 +
  63 +
  64 +- 遇到问题可以查看 [FAQ](faq.md)
0 65 \ No newline at end of file
... ...
inner/inner/install.md 0 → 100644
... ... @@ -0,0 +1,233 @@
  1 +# 安装步骤
  2 +
  3 +------
  4 +
  5 +## SDK下载
  6 +
  7 +1. 下载最新版本的SDK [SDK下载](download.md) 。
  8 +2. 解压下载的sdk-out-v{版本号}.zip包,解压文件夹里面的的目录结构:
  9 +
  10 +```
  11 +├── sdk.d.ts
  12 +├── sdk/
  13 +| ├── config.js
  14 +| └── index.js
  15 +| └── libs/
  16 + | └── game.min.js
  17 +```
  18 +
  19 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_001.png "🔍点击查看大图")
  20 +
  21 +- **sdk.d.ts:sdk的ts声明文件,开发者项目采用Typescript开发,请复制该文件到项目中。**
  22 +- sdk/config.js:sdk配置文件,【[详细请阅读下方config.js参数说明](install.md#config)】
  23 +- sdk/index.js:sdk入口文件,引入了sdk所提供的模块功能
  24 +- sdk/libs/game.min.js:sdk类库核心代码文件
  25 +
  26 +
  27 +
  28 +## 配置合法域名
  29 +
  30 +* ##### 管理员或开发者身份在微信小程序后台→设置→开发者设置中添加 request、download合法域名
  31 + 测试环境 request 合法域名:
  32 +
  33 + https://pre-dataapi.d3games.com (统计平台测试服域名)
  34 +
  35 + 正式环境 request 合法域名:
  36 +
  37 + https://dataapi.d3games.com (统计平台正式服域名)
  38 +
  39 + cdn资源请求合法域名:
  40 +
  41 + https://dep.miso-lab.com (>>>request、download均要添加<<<)
  42 +
  43 +
  44 +
  45 +
  46 +
  47 +​
  48 +## SDK配置步骤
  49 +
  50 +* #### 将下载下来的sdk压缩包,解压后,拷贝sdk文件夹到微信开发者工具项目中。
  51 +
  52 + 示例:将sdk放入到小游戏开发者工具项目的src文件夹中
  53 +
  54 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_002.png "🔍点击查看大图")
  55 +
  56 +
  57 +
  58 +
  59 +
  60 +* #### 在game.js中将sdk.js文件使用require导入。
  61 +
  62 + 示例:将sdk放入到小游戏开发者工具项目的src文件夹中
  63 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_003.png "🔍点击查看大图")
  64 +
  65 +
  66 +
  67 +
  68 +* #### 根据运营提供的信息修改sdk文件夹下的**config**.js文件(可横向拖动查看查看更多====>)<div id="config"></div>
  69 +
  70 + ```javascript
  71 + export default {
  72 + IsDebug: false, // 是否debug模式,debug模式会打印log,可使用stat模块setDebug api进行修改
  73 + Env: 100, // 100表示正式环境,110表示测试环境,推荐测试联调阶段使用110,提审前切记改成100!!!
  74 + AdCacheDuration: 30, // 广告列表缓存持续时间间隔
  75 + IsUseShareModule: true, // 是否使用分享模块
  76 + IsOnlineAutoUse: true, // 是否开启sdk自动请求online模块(在线参数配置)的updateOnlineConfig,拉取在线参数配置
  77 + IsOnlineDebug: true, // 是否开启online模块(配置参数模块)debug模式
  78 + ShareRightKey: 'forward', // 右上角分享的shareKey,shareKey请阅读share模块说明,默认为forward,为空字符串则不使用右上角分享
  79 +
  80 + ShareData: { // 必填,默认分享数据(拉取不到分享配置后使用,默认分享,SDK自动分配share_id为99999)
  81 + share_desc: 'xxx',
  82 + share_wxad_id: '', // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享
  83 + share_icon: 'xxx'
  84 + },
  85 + GameId: 0, // 必填,游戏ID,运营提供;
  86 + ChannelId: 0, // 必填,游戏渠道ID,运营提供;
  87 + Secret: '***请配置你的Secret***', // 必填,游戏的secret key
  88 + MidasPay: { // 米大师虚拟支付配置
  89 + OfferId: "0", // 在米大师申请的应用id
  90 + ZoneId: "1", // 分区ID,默认:1
  91 + Mode: "game", // 支付的类型,不同的支付类型有各自额外要传的附加参数,默认:game
  92 + CurrencyType: "CNY", // 币种,默认:CNY
  93 + Platform: '' // 申请接入时的平台,platform与应用id有关。默认:android(ios暂时没有开放,这里需要配置Platform,开放后,删掉此配置,sdk已经判断平台)
  94 + }
  95 +};
  96 + ```
  97 +
  98 +
  99 + 参数详解:
  100 +
  101 +<div id="config_env"></div>
  102 +1. **Env ( number ):**SDK执行环境,建议开发者测试联调阶段设为110。
  103 +
  104 + > 提审阶段一定要设为100
  105 +
  106 + > 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login)
  107 +
  108 + > 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login)
  109 +
  110 + 100:正式环境,请求api域名地址为:https://dataapi.d3games.com
  111 +
  112 + 110:测试环境,请求api域名地址为:https://pre-dataapi.d3games.com
  113 +
  114 +2. **IsDebug ( boolean ):**是否debug模式,debug模式会打印sdk中的console.log/error/warn log。
  115 +
  116 + false:关闭log打印,提审前建议设置为false,不打印log信息
  117 +
  118 + true:开启log打印,如遇到联调问题,可设置为true,发体验版本或者查看log发给相关人员进行查看解决问题
  119 +
  120 + 也可在代码中动态设置:PCSDK.stat.setDebug( boolean )
  121 +
  122 +3. **AdCacheDuration(number):**表示获取广告位列表的缓存时间,例如:配置30,SDK中拉取交叉推广位列表后缓存30秒。此参数对接入交叉推广位模块后有效,没有接入可不修改,使用默认值。
  123 +
  124 +4. **IsUseShareModule( boolean ):**是否启用sdk分享/视频功能(sdk把分享和视频封装为share模块,登录后台->【游戏数据】->【配置相关】->【分享/视频配置】后可对分享视频进行动态配置)
  125 +
  126 + false:SDK启动时不拉取分享/视频列表,不接入分享/视频模块功能
  127 +
  128 + true:SDK启动时拉取后台配置的分享/视频列表,运营或者开发者登录后台后,配置分享/视频,开发者请详看分享视频模块接入。
  129 +
  130 +5. **IsOnlineAutoUse( boolean ):**是否启用在线配置参数模块功能
  131 +
  132 + false:两种处理 1)不启用在线配置参数模块功能; 2)启用在线配置参数功能,但是SDK启动时不自动调用updateOnlineConfig拉取后台配置参数列表,开发者在代码主动调用拉取在线配置参数:PCSDK.online.updateOnlineConfig();
  133 +
  134 + 示例:开发者代码中主动拉取在线配置参数。
  135 +
  136 + ```javascript
  137 + // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关
  138 + PCSDK.online.updateOnlineConfig().then(() => {
  139 + // 获取是否后台动态配置开启插屏广告,1为开启,0为关闭
  140 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
  141 + // isInterstitialAd && '显示插屏广告';
  142 + // 获取动态多个广告位开启的配置
  143 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
  144 + // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位';
  145 + // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位';
  146 + // pcGameOpenMap.Cross === 1 && '显示交叉推广位';
  147 + });
  148 + ```
  149 + true:sdk启动时自动调用updateOnlineConfig拉取后台在线配置参数列表,开发者可通过
  150 +
  151 + PCSDK.online.getParamsObj、PCSDK.online.getParamsInt、PCSDK.online.getParamsString、PCSDK.online.getParams api传递后台配置参数key获取在线配置参数。
  152 +
  153 + 示例:IsOnlineAutoUse: true,开发者可使用下面api获取在线配置参数配置的值
  154 +
  155 + ```javascript
  156 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
  157 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
  158 + ```
  159 +
  160 +6. **IsOnlineDebug( boolean ):**是否启用online模块(在线配置参数)debug模式,建议设置为true。
  161 +
  162 + false:不启动debug模式,开发者主动调用updateOnlineConfig或者SDK启动时调用updateOnlineConfig都会把在线配置参数列表设置10分钟缓存,不用每次都去服务器请求,参照了友盟在线参数功能的设计
  163 +
  164 + true: 开启debug模式,只要是请求updateOnlineConfig api都会立即发起请求,而不是去检测读取缓存
  165 +
  166 +7. **ShareRightKey( string ):**右上角分享的shareKey,shareKey请阅读分享视频模块,默认为forward,为空字符串则不使用右上角分享,此配置在配置【IsUseShareModule: true】情况下生效。
  167 +
  168 + 示例:
  169 +
  170 + 在后台的【分享/视频配置】栏目配置了一条分享key为:forward的分享配置
  171 +
  172 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_004.png "🔍点击查看大图")
  173 +
  174 +8. **ShareData( object ):**此配置在【IsUseShareModule: true】起效,开发者如果接入了分享视频模块,>>> 请务必配置一条 <<<。
  175 +
  176 + > IsUseShareModule设置true sdk启动拉取分享视频配置列表,如果分享视频列表拉取请求失败,或此shareKey不在分享视频配置列表中(登录后台 ->【游戏数据】->【分享/视频配置】栏没有配置分享key)就会使用此条设置的数据。
  177 +
  178 + 示例:可从后台【游戏数据】->【分享/视频配置】中选取一条:复制文案,点击分享素材icon -> 查看大图 -> 右键查看分享图片的html源码复制src图片地址:
  179 +
  180 + ```json
  181 + {
  182 + // 分享文案内容
  183 + share_desc: ' 半夜传来啪啪啪!竟是隔壁老王偷偷打气球',
  184 + // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享
  185 + share_wxad_id: 'adunit-6958dcfc3f0bed31',
  186 + // 分享图
  187 + share_icon: 'https://dep.miso-lab.com/data_analysis/games/res/5D57D4A3Yx.png'
  188 + }
  189 + ```
  190 +
  191 + 操作步骤:
  192 +
  193 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_005.png "🔍点击查看大图")
  194 +
  195 +9. **GameId:必填,游戏id,请联系运营人员提供**
  196 +
  197 +10. **ChannelId:必填,游戏渠道id,请联系运营人员提供**
  198 +
  199 +11. **Secret:必填,游戏 Secret Key,请联系运营人员提供**
  200 +
  201 +12. **MidasPay( object ):**米大水虚拟支付配置,没有接入微信的米大师支付,请注意下面规则
  202 +
  203 + OfferId:在米大师申请的应用id,没有接入米大师,默认为"0"
  204 +
  205 + ZoneId:分区ID,默认:"1"
  206 +
  207 + Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game"
  208 +
  209 + CurrencyType:币种,默认:"CNY"
  210 +
  211 + Platform:申请接入时的平台,platform与应用id有关。
  212 +
  213 + 1)接入了米大师,填写"android"(ios暂时没有开放)
  214 +
  215 + 2)未接入米大师,使用其他支付,如果只支持android,则填写"android";
  216 +
  217 + 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios";
  218 +
  219 + 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios
  220 +
  221 +
  222 +
  223 +* #### 如果项目使用Typescript语言开发,请引入解压文件夹下的sdk.d.ts文件到项目中。
  224 +
  225 + 示例:项目采用的是Laya Typescript版本进行开发,将该文件复制到libs目录下面
  226 +
  227 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_007.png "🔍点击查看大图")
  228 +
  229 +* #### 到此,SDK的准备工作已经配置完毕,运行起来:
  230 +
  231 + 运行中碰到问题,[[请查看FAQ](faq.md)],或者微信群联系相关人员。
  232 +
  233 + 正常运行,阅读SDK手册,开始[[SDK模块功能](modules.md)]接入。
0 234 \ No newline at end of file
... ...
inner/inner/intro.md 0 → 100644
... ... @@ -0,0 +1,64 @@
  1 +# 噗嗤SDK
  2 +PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。
  3 +PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。
  4 +
  5 +**PCSDK提供的模块功能:**
  6 +
  7 +- [统计模块](stat.md)
  8 +- [分享视频模块](share.md)
  9 +- [配置参数模块️](online.md)
  10 +- [多平台接口模块](platform.md)
  11 +- [数据模块](data.md)
  12 +- [事件模块](event.md)
  13 +
  14 +
  15 +
  16 +# 噗嗤管理后台
  17 +噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。
  18 +
  19 +方便开发者联调测试阶段不影响上线游戏运营相关数据或者配置信息,config.js的Env配置提供测试和正式环境切换。
  20 +
  21 +> 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login)
  22 +
  23 +> 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login)
  24 +
  25 +噗嗤管理后台地址:
  26 +
  27 +- 测试服后台,地址:http://pre-data.d3games.com/#/login
  28 +
  29 +- 正式服后台,地址:https://data.d3games.com/#/login
  30 +
  31 +**友情提示:**
  32 +
  33 +- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。**
  34 +- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。**
  35 +- **登录后台即可使用后台提供的各项服务**
  36 +
  37 +
  38 +
  39 +**后台概览:**
  40 +## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图")
  41 +
  42 +
  43 +
  44 +**后台提供数据分析功能(不能跳转请联系管理员添加权限):**
  45 +
  46 +- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart)
  47 +- [分享数据分析](https://data.d3games.com/index.html#/share_exact)
  48 +- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list)
  49 +- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list)
  50 +
  51 +
  52 +
  53 +**后台提供配置相关功能(不能跳转请联系管理员添加权限):**
  54 +
  55 +- [分享/视频配置](http://pre-data.d3games.com/index.html#/share_list)
  56 +- [配置参数](http://pre-data.d3games.com/index.html#/config_list)
  57 +
  58 +
  59 +# 更多:
  60 +- 快速接入,请详读 [安装步骤](install.md)
  61 +
  62 +
  63 +
  64 +- 遇到问题可以查看 [FAQ](faq.md)
0 65 \ No newline at end of file
... ...
inner/inner/stat_ads.md 0 → 100644
... ... @@ -0,0 +1,543 @@
  1 +# 交叉推广位
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +交叉推广位是在游戏中展示其他游戏,用户点击某个游戏跳转进入游戏,达到共享用户的目的。
  8 +
  9 +噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析阅览。
  10 +
  11 +**3种广告类型:交叉悬浮广告框、交叉抽屉式广告位、交叉猜你喜欢广告位**
  12 +
  13 +1. 交叉悬浮广告框,放置到首页、结算页
  14 +
  15 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_013.png "🔍点击查看大图")
  16 +
  17 +2. 交叉抽屉式广告位,放置到首页、结算页
  18 +
  19 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_014.png "🔍点击查看大图")
  20 +
  21 +3. 交叉猜你喜欢广告位,推荐放置到结算页
  22 +
  23 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_015.png "🔍点击查看大图")
  24 +
  25 +
  26 +
  27 +
  28 +
  29 +#### **后台使用**
  30 +
  31 +完成接入交叉推广位后,登录后台->头部tab切换到【游戏数据】->【流量分析】->【广告导出】即可查看推广位的各项数据信息(需要后台管理人员添加权限):
  32 +
  33 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_012.png "🔍点击查看大图")
  34 +
  35 +
  36 +
  37 +#### **接入必读**
  38 +
  39 +- 由于微信对每个游戏可跳转其他游戏有10个限制,可跳转的其它游戏需要在小游戏根目录下的全局配置文件game.json中进行添加配置:navigateToMiniProgramAppIdList,该参数定义请详读[小程序全局配置](https://developers.weixin.qq.com/minigame/dev/reference/configuration/app.html)。
  40 +
  41 +- 噗嗤游戏为了方便开发者接入调试交叉推广位,【后台测试服】已经配置测试使用的不同类型推广位,并提供以下10个测试服广告位appid:
  42 +
  43 + 水果爆破 :"wx26822126b4d99eda",
  44 +
  45 + 球球涂涂涂:"wxac0750884d5bed0c",
  46 +
  47 + 狂野漂移3D:"wx019a09df638e6683",
  48 +
  49 + 星星爱消消:"wx9ff47d13a88e5511",
  50 +
  51 + 土耳其方块消消乐:"wx89efb2282d65a2d0",
  52 +
  53 + 成语小才子:"wxd4d478c7d331ce80",
  54 +
  55 + 球球蹦蹦蹦:"wxabee9afe62d0b114",
  56 +
  57 + 俄罗斯方块连连消:"wx4cd087f19f4cb7c3",
  58 +
  59 + 球球爆爆爆:"wxae33d68413f40641",
  60 +
  61 + 疯狂水果一刀切:"wxdf26a04c53d6f1e9"
  62 +
  63 + ```javascript
  64 + "navigateToMiniProgramAppIdList": [
  65 + "wx26822126b4d99eda",
  66 + "wxac0750884d5bed0c",
  67 + "wx019a09df638e6683",
  68 + "wx9ff47d13a88e5511",
  69 + "wx89efb2282d65a2d0",
  70 + "wxd4d478c7d331ce80",
  71 + "wxabee9afe62d0b114",
  72 + "wx4cd087f19f4cb7c3",
  73 + "wxae33d68413f40641",
  74 + "wxdf26a04c53d6f1e9"
  75 + ]
  76 + ```
  77 +
  78 +
  79 +
  80 +- 完成下面的操作步骤,即可拉取交叉推广位:
  81 +
  82 + 1、开发者复制上面的10个其他游戏的appid,配置到game.json的navigateToMiniProgramAppIdList参数:
  83 +
  84 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_010.png "🔍点击查看大图")
  85 +
  86 + 2、修改[config.js的Env配置](install.md#config_env)为110,开发者测试联调阶段,走测试环境
  87 +
  88 + > 提示:广告位接入完毕测试通过,提交审核前,修改Env为100。
  89 +
  90 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_011.png "🔍点击查看大图")
  91 +
  92 +
  93 +
  94 +#### **接入API:**
  95 +
  96 +| **名称** | **功能说明** |
  97 +| --------------------------- | ------------------------------------------------------------ |
  98 +| PCSDK.stat.bannerList | 根据类型获取对应类型交叉广告列表,目前SDK支持3种类型:40(交叉悬浮广告框)、70(交叉抽屉式广告位)、50(交叉猜你喜欢广告位) |
  99 +| PCSDK.stat.bannerNavigateTo | 交叉推广位点击跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram) |
  100 +| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK在onHide时候上报数据到后台 |
  101 +
  102 +
  103 +
  104 +
  105 +
  106 +
  107 +
  108 +1. ##### **bannerList**
  109 +
  110 + ```javascript
  111 + PCSDK.stat.loadingFinish(banner_type): Promise<any>
  112 + ```
  113 +
  114 + 定义:根据类型获取对应类型交叉广告列表,目前SDK支持3种类型
  115 +
  116 + 参数:
  117 +
  118 + ```
  119 + banner_type: number 必填 目前支持三种广告类型:40、50、70
  120 + ```
  121 +
  122 + 返回值:Promise<any>
  123 +
  124 + 返回的是Promise类型,Promise resolve成功回调数据结构为:
  125 +
  126 + ```json
  127 + {
  128 + "banner_list": [
  129 + {
  130 + "banner_id": "3568",
  131 + "banner_name": "土耳其方块",
  132 + "banner_type": "40",
  133 + "banner_location": "100",
  134 + "banner_ad_id": "50",
  135 + "banner_launch_appid": "",
  136 + "banner_launch_path": "",
  137 + "banner_appid": "wx89efb2282d65a2d0",
  138 + "banner_path": "?channel_id=20361",
  139 + "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CB97RK.png",
  140 + "banner_user_num": "0",
  141 + "banner_exposure_num": "0",
  142 + "banner_sort": "1",
  143 + "banner_game_id": "1000053",
  144 + "banner_qqgame": "0",
  145 + "banner_qqgame_id": "0",
  146 + "banner_game_type": 0,
  147 + "banner_bone": "0",
  148 + "banner_system": "0",
  149 + "banner_online": "1",
  150 + "banner_reddot": "0",
  151 + "banner_gender": "0",
  152 + "banner_resident": "0",
  153 + "banner_qrcode": "0",
  154 + "banner_qrcode_img": "",
  155 + "banner_bone_info": false,
  156 + "banner_img_info": {
  157 + "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CB97RK.png"
  158 + }
  159 + },
  160 + {
  161 + "banner_id": "3571",
  162 + "banner_name": "水果一刀切",
  163 + "banner_type": "40",
  164 + "banner_location": "100",
  165 + "banner_ad_id": "99",
  166 + "banner_launch_appid": "",
  167 + "banner_launch_path": "",
  168 + "banner_appid": "wxdf26a04c53d6f1e9",
  169 + "banner_path": "?channel_id=20361",
  170 + "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CBACTt.png",
  171 + "banner_user_num": "0",
  172 + "banner_exposure_num": "0",
  173 + "banner_sort": "1",
  174 + "banner_game_id": "1000053",
  175 + "banner_qqgame": "0",
  176 + "banner_qqgame_id": "0",
  177 + "banner_game_type": 0,
  178 + "banner_bone": "0",
  179 + "banner_system": "0",
  180 + "banner_online": "1",
  181 + "banner_reddot": "0",
  182 + "banner_gender": "0",
  183 + "banner_resident": "0",
  184 + "banner_qrcode": "0",
  185 + "banner_qrcode_img": "",
  186 + "banner_bone_info": false,
  187 + "banner_img_info": {
  188 + "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CBACTt.png"
  189 + }
  190 + }
  191 + ]
  192 + }
  193 +
  194 + ```
  195 +
  196 + > **返回的数据banner_list列表解析为 Array< BannerData >,BannerData是banner_list每一项数据实体,下面的bannerNavigateTo与addExposure接口api参数banner_data属于此BannerData结构**。
  197 +
  198 + 示例:
  199 +
  200 + ```javascript
  201 + /**
  202 + * 演示交叉推广位使用示例
  203 + */
  204 + export default class TestBannerSample {
  205 + constructor() {
  206 + // 示例:加载交叉悬浮广告框
  207 + this.loadBannerList(BannerType.TYPE_CROSS)
  208 + .then((dataList: Array<BannerData>) => {
  209 + // 渲染广告位数据
  210 + this.renderAdCrossList(dataList);
  211 + }).catch(err => {
  212 + // bannerList不存在获取请求拉取失败
  213 + });
  214 + }
  215 +
  216 + /**
  217 + * 渲染广告位列表
  218 + * @param dataList 广告位列表
  219 + */
  220 + private renderAdCrossList(dataList: Array<BannerData>) {
  221 + // ...
  222 + }
  223 +
  224 + /**
  225 + * 根据类型获取交叉推广位列表
  226 + * @param banner_type 广告位类型
  227 + */
  228 + private loadBannerList(banner_type: BannerType): Promise<any> {
  229 + return new Promise((resolve, reject) => {
  230 + PCSDK.stat.bannerList(banner_type)
  231 + .then(data => {
  232 + let bannerList: Array<BannerData> = data.banner_list || [];
  233 + if (bannerList.length) {
  234 + // 处理bannerList数据列表
  235 + resolve(bannerList);
  236 + } else {
  237 + // 处理数据为空情况
  238 + reject(null);
  239 + }
  240 + }).catch(err => {
  241 + // 请求接口报错情况
  242 + reject(err);
  243 + });
  244 + });
  245 + }
  246 + }
  247 +
  248 + // 广告位类型的枚举
  249 + enum BannerType {
  250 + TYPE_CROSS = 40, // 交叉悬浮广告框
  251 + TYPE_LIKE = 50, // 交叉猜你喜欢广告位
  252 + TYPE_LIST = 70, // 交叉抽屉广告位
  253 + }
  254 +
  255 + /*
  256 + * banner数据实体结构
  257 + */
  258 + class BannerData {
  259 + public banner_id: string;
  260 + public banner_appid: string;
  261 + public banner_diamond: number;
  262 + public banner_type: string;
  263 + public banner_icon: string;
  264 + public banner_name: string;
  265 + public banner_resident: string; // 是否常驻
  266 + }
  267 + ```
  268 +
  269 +2. ##### **bannerNavigateTo**
  270 +
  271 + ```javascript
  272 + PCSDK.stat.bannerNavigateTo( location:number, banner_data: any, opts?: { extraData?: string; envVersion?: string }): Promise<any>
  273 + ```
  274 +
  275 + 定义:交叉推广位点击游戏跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram), 第三个参数配置可参考[wx.navigateToMiniProgram extraData、envVersion配置信息](https://developers.weixin.qq.com/minigame/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html)
  276 +
  277 + 参数:
  278 +
  279 + ```javascript
  280 + location: number 必传,统一传递为:100
  281 +
  282 + banner_data:any 必传,点击跳转项对应数据,该数据的结构为BannerData,为bannerList获取的Array<BannerData>的单元实体项
  283 +
  284 + opts: object 选传,调试阶段可参照[wx.navigateToMiniProgram(Object object) extraData配置信息]进行裴旭
  285 + {
  286 + extraData: string 选传, 需要传递给目标小程序的数据,目标小程序可在 App.onLaunch,App.onShow 中获取到这份数据
  287 + envVersion: string 选传,要打开的小程序版本,合法值:develop、trial、release
  288 + }
  289 + ```
  290 +
  291 + 示例:获取猜你喜欢推广位,以列表的形式显示在界面上,点击任意一项游戏跳转其他游戏
  292 +
  293 + ```javascript
  294 + // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息
  295 + /**
  296 + * 演示交叉推广位使用示例
  297 + */
  298 + export default class TestBannerSample extends ui.shop.ShopPopwinUI {
  299 + private list: Laya.List;
  300 +
  301 + constructor() {
  302 + super();
  303 +
  304 + // 创建List ui
  305 + this.list = new Laya.List();
  306 + this.list.itemRender = AdItem;
  307 + this.list.vScrollBarSkin = "";
  308 + this.list.scrollBar.elasticBackTime = 500;
  309 + this.list.scrollBar.elasticDistance = 350;
  310 + this.list.x = 0;
  311 + this.list.y = 0;
  312 + this.list.spaceY = 10;
  313 + this.list.height = 1000;
  314 + this.list.renderHandler = new Laya.Handler(this, this.renderAdItem);
  315 + this.boxList.addChild(this.list);
  316 +
  317 + // 示例:加载猜你喜欢广告位数据列表
  318 + this.loadBannerList(BannerType.TYPE_LIKE)
  319 + .then((dataList: Array<BannerData>) => {
  320 + this.renderAdLikeList(dataList);
  321 + }).catch(err => {
  322 + // bannerList不存在获取请求拉取失败
  323 + });
  324 + }
  325 +
  326 + /**
  327 + * 渲染单个广告位ui
  328 + * @param cell
  329 + */
  330 + private renderAdItem(cell: AdItem) {
  331 + cell.init();
  332 + }
  333 +
  334 + /**
  335 + * 渲染广告位列表
  336 + * @param dataList 广告位列表
  337 + */
  338 + private renderAdLikeList(dataList: Array<BannerData>) {
  339 + this.list.array = dataList;
  340 + }
  341 +
  342 + /**
  343 + * 根据类型获取交叉推广位列表
  344 + * @param banner_type 广告位类型
  345 + */
  346 + private loadBannerList(banner_type: BannerType): Promise<any> {
  347 + return new Promise((resolve, reject) => {
  348 + PCSDK.stat.bannerList(banner_type)
  349 + .then(data => {
  350 + let bannerList: Array<BannerData> = data.banner_list || [];
  351 + if (bannerList.length) {
  352 + // 处理bannerList数据列表
  353 + resolve(bannerList);
  354 + } else {
  355 + // 处理数据为空情况
  356 + reject(null);
  357 + }
  358 + }).catch(err => {
  359 + // 请求接口报错情况
  360 + reject(err);
  361 + });
  362 + });
  363 + }
  364 + }
  365 +
  366 + class AdItem extends ui.ads.GameIconUI {
  367 + constructor() {
  368 + super();
  369 + this.on(Laya.Event.CLICK, this, this.onJumpGame);
  370 + }
  371 +
  372 + init() {
  373 + let { banner_icon, banner_name, banner_reddot } = this.dataSource;
  374 + this.iconTex.skin = banner_icon;
  375 + this.nametxt.text = banner_name;
  376 + this.hot.visible = banner_reddot + '' === '1';
  377 + }
  378 +
  379 + private onJumpGame(ev: Laya.Event) {
  380 + PCSDK.stat.bannerNavigateTo(100, { ...this.dataSource }).catch(err => {
  381 + // 跳转游戏微信弹出二次确认框,点击取消执行此处
  382 + });
  383 + }
  384 + }
  385 +
  386 + // 广告位类型的枚举
  387 + enum BannerType {
  388 + TYPE_CROSS = 40, // 交叉悬浮广告框
  389 + TYPE_LIKE = 50, // 交叉猜你喜欢广告位
  390 + TYPE_LIST = 70, // 交叉抽屉广告位
  391 + }
  392 +
  393 + /*
  394 + * banner数据实体结构
  395 + */
  396 + class BannerData {
  397 + public banner_id: string;
  398 + public banner_appid: string;
  399 + public banner_diamond: number;
  400 + public banner_type: string;
  401 + public banner_icon: string;
  402 + public banner_name: string;
  403 + public banner_resident: string; // 是否常驻
  404 + }
  405 + ```
  406 +
  407 +
  408 +3. ##### **addExposure**
  409 +
  410 + ```javascript
  411 + PCSDK.stat.addExposure( location: number, banner_data: Array< any > | any ): void
  412 + ```
  413 +
  414 + 定义:对一个或者多个展示的推广位添加曝光,SDK在onHide时候上报曝光数据到后台,后台进行统计查阅
  415 +
  416 + 参数:
  417 +
  418 + ```javascript
  419 + location: number 必传,统一传递为:100
  420 +
  421 + banner_data:any 必传,添加展推广位曝光数据,可添加一个或者多个曝光数据,banner_data参数数据结构为上面bannerList api返回的列表数据的项BannerData实体结构:Array<BannerData> | BannerData
  422 +
  423 + ```
  424 +
  425 + > 提示:
  426 + >
  427 + > 展示猜你喜欢/抽屉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。
  428 + >
  429 + > 展示交叉悬浮框推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api
  430 +
  431 + 示例:根据交叉悬浮框类型调用PCSDK.stat.bannnerList接口获取交叉悬浮框推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。
  432 + ```javascript
  433 + /**
  434 + * 演示交叉推广位使用示例
  435 + */
  436 +export default class TestBannerSample extends ui.ads.ADbtnUI {
  437 + private data;
  438 + private count: number;
  439 + private adList: Array<BannerData>;
  440 +
  441 + constructor() {
  442 + super();
  443 + this.count = 0;
  444 + this.adList = [];
  445 + this.on(Laya.Event.CLICK, this, this.onJumpGame);
  446 + }
  447 +
  448 + // 初始化显示交叉悬浮框广告位
  449 + init(isFirst: boolean) {
  450 + isFirst && (this.count = 0);
  451 + this.anim_entice.play(0, true);
  452 + this.anim_entice.addLabel('refresh', 38);
  453 + // 交叉悬浮框动画执行到第38帧,自动更新下一个,开发者可根据实际使用定时器实现切换下一个
  454 + this.anim_entice.on(Laya.Event.LABEL, this, this.handleAutoRrefresh);
  455 + // 第一次
  456 + this.refresh();
  457 + }
  458 +
  459 + // 清理交叉悬浮框广告位
  460 + clear() {
  461 + this.anim_entice.gotoAndStop(0);
  462 + this.anim_entice.removeLabel('refresh');
  463 + this.anim_entice.off(Laya.Event.LABEL, this, this.handleAutoRrefresh);
  464 + }
  465 +
  466 + private refresh() {
  467 + let list = this.adList;
  468 + if (!list || !list.length) {
  469 + this.loadBannerList(BannerType.TYPE_CROSS).then(() => this.refresh());
  470 + return;
  471 + }
  472 + let data = list.pop();
  473 + this.renderAdui(data);
  474 + this.data = data;
  475 + // 添加曝光数据
  476 + PCSDK.stat.addExposure(100, data);
  477 + // 也可以采用传递多个方式
  478 + // PCSDK.stat.addExposure(100, [{...data}]);
  479 + }
  480 +
  481 + private renderAdui(data) {
  482 + let { banner_bone_info, banner_img_info } = data;
  483 + if (banner_bone_info) {
  484 + this.imgIcon.visible = false;
  485 + } else {
  486 + this.imgIcon.visible = true;
  487 + this.imgIcon.skin = banner_img_info.banner_icon;
  488 + }
  489 + this.imgHot.visible = data.banner_reddot + '' === '1';
  490 + }
  491 +
  492 + private onJumpGame(ev: Laya.Event) {
  493 + this.anim_entice.gotoAndStop(39);
  494 + this.anim_entice.play(39, true);
  495 + // 切换下一个
  496 + this.refresh();
  497 + PCSDK.stat.bannerNavigateTo(100, { ...this.data }).catch(err => {
  498 + // 跳转游戏微信弹出二次确认框,点击取消执行此处
  499 + });
  500 + }
  501 +
  502 + /**
  503 + * 处理自动切换下一个
  504 + * @param name
  505 + */
  506 + private handleAutoRrefresh(name) {
  507 + if (name === 'refresh' && this.count !== 0) {
  508 + this.refresh();
  509 + }
  510 + this.count++;
  511 + }
  512 +
  513 + /**
  514 + * 根据类型获取交叉推广位列表
  515 + * @param banner_type 广告位类型
  516 + */
  517 + private loadBannerList(banner_type: BannerType): Promise<any> {
  518 + return new Promise((resolve, reject) => {
  519 + PCSDK.stat.bannerList(banner_type)
  520 + .then(data => {
  521 + let bannerList: Array<BannerData> = data.banner_list || [];
  522 + if (bannerList.length) {
  523 + // 处理bannerList数据列表
  524 + resolve(bannerList);
  525 + } else {
  526 + // 处理数据为空情况
  527 + reject(null);
  528 + }
  529 + }).catch(err => {
  530 + // 请求接口报错情况
  531 + reject(err);
  532 + });
  533 + });
  534 + }
  535 + }
  536 +
  537 + // 广告位类型的枚举
  538 + enum BannerType {
  539 + TYPE_CROSS = 40, // 交叉悬浮广告框
  540 + TYPE_LIKE = 50, // 交叉猜你喜欢广告位
  541 + TYPE_LIST = 70, // 交叉抽屉广告位
  542 + }
  543 + ```
0 544 \ No newline at end of file
... ...
inner/install.md
... ... @@ -5,13 +5,13 @@
5 5 ## SDK下载
6 6  
7 7 1. 下载最新版本的SDK [SDK下载](download.md) 。
8   -2. 解压下载的sdk-out-v{版本号}.zip包,解压文件夹里面的的目录结构:
  8 +2. 解压下载的sdk-in-v{版本号}.zip包,解压文件夹里面的的目录结构:
9 9  
10 10 ```
11 11 ├── sdk.d.ts
12 12 ├── sdk/
13 13 | ├── config.js
14   -| └── index.js
  14 +| └── entry.js
15 15 | └── libs/
16 16 | └── game.min.js
17 17 ```
... ... @@ -20,7 +20,7 @@
20 20  
21 21 - **sdk.d.ts:sdk的ts声明文件,开发者项目采用Typescript开发,请复制该文件到项目中。**
22 22 - sdk/config.js:sdk配置文件,【[详细请阅读下方config.js参数说明](install.md#config)】
23   -- sdk/index.js:sdk入口文件,引入了sdk所提供的模块功能
  23 +- sdk/entry.js:sdk入口文件,引入了sdk所提供的模块功能
24 24 - sdk/libs/game.min.js:sdk类库核心代码文件
25 25  
26 26  
... ... @@ -28,10 +28,6 @@
28 28 ## 配置合法域名
29 29  
30 30 * ##### 管理员或开发者身份在微信小程序后台→设置→开发者设置中添加 request、download合法域名
31   - 测试环境 request 合法域名:
32   -
33   - https://pre-dataapi.d3games.com (统计平台测试服域名)
34   -
35 31 正式环境 request 合法域名:
36 32  
37 33 https://dataapi.d3games.com (统计平台正式服域名)
... ... @@ -39,7 +35,7 @@
39 35 cdn资源请求合法域名:
40 36  
41 37 https://dep.miso-lab.com (>>>request、download均要添加<<<)
42   -
  38 +
43 39  
44 40  
45 41  
... ... @@ -64,13 +60,11 @@
64 60  
65 61  
66 62  
67   -
68 63 * #### 根据运营提供的信息修改sdk文件夹下的**config**.js文件(可横向拖动查看查看更多====>)<div id="config"></div>
69   -
  64 +<div id="configJs"></div>
70 65 ```javascript
71 66 export default {
72 67 IsDebug: false, // 是否debug模式,debug模式会打印log,可使用stat模块setDebug api进行修改
73   - Env: 100, // 100表示正式环境,110表示测试环境,推荐测试联调阶段使用110,提审前切记改成100!!!
74 68 AdCacheDuration: 30, // 广告列表缓存持续时间间隔
75 69 IsUseShareModule: true, // 是否使用分享模块
76 70 IsOnlineAutoUse: true, // 是否开启sdk自动请求online模块(在线参数配置)的updateOnlineConfig,拉取在线参数配置
... ... @@ -84,33 +78,22 @@
84 78 },
85 79 GameId: 0, // 必填,游戏ID,运营提供;
86 80 ChannelId: 0, // 必填,游戏渠道ID,运营提供;
  81 + IntegralChannelId: 0, // 必填,积分投放渠道ID,运营提供;
87 82 Secret: '***请配置你的Secret***', // 必填,游戏的secret key
88 83 MidasPay: { // 米大师虚拟支付配置
89 84 OfferId: "0", // 在米大师申请的应用id
90 85 ZoneId: "1", // 分区ID,默认:1
91 86 Mode: "game", // 支付的类型,不同的支付类型有各自额外要传的附加参数,默认:game
92 87 CurrencyType: "CNY", // 币种,默认:CNY
93   - Platform: '' // 申请接入时的平台,platform与应用id有关。默认:android(ios暂时没有开放,这里需要配置Platform,开放后,删掉此配置,sdk已经判断平台)
  88 + Platform: '' // 申请接入时的平台,platform与OfferId(米大师申请的应用id)有关,详情请阅读文档config.js参数MidasPay下的Platform配置
94 89 }
95   -};
96   - ```
  90 + };
  91 +```
97 92  
98   -
99   - 参数详解:
100   -
101   -<div id="config_env"></div>
102   -1. **Env ( number ):**SDK执行环境,建议开发者测试联调阶段设为110。
103 93  
104   - > 提审阶段一定要设为100
105   -
106   - > 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login)
  94 +参数详解:
107 95  
108   - > 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login)
109   -
110   - 100:正式环境,请求api域名地址为:https://dataapi.d3games.com
111   -
112   - 110:测试环境,请求api域名地址为:https://pre-dataapi.d3games.com
113   -
  96 +<div id="config_env"></div>
114 97 2. **IsDebug ( boolean ):**是否debug模式,debug模式会打印sdk中的console.log/error/warn log。
115 98  
116 99 false:关闭log打印,提审前建议设置为false,不打印log信息
... ... @@ -196,11 +179,13 @@
196 179  
197 180 10. **ChannelId:必填,游戏渠道id,请联系运营人员提供**
198 181  
199   -11. **Secret:必填,游戏 Secret Key,请联系运营人员提供**
  182 +11. **IntegralChannelId:必填,积分投放渠道ID,运营提供**
  183 +
  184 +12. **Secret:必填,游戏 Secret Key,请联系运营人员提供**
200 185  
201   -12. **MidasPay( object ):**米大水虚拟支付配置,没有接入微信的米大师支付,请注意下面规则
  186 +13. **MidasPay( object ):**米大师虚拟支付配置,请注意下面规则
202 187  
203   - OfferId:在米大师申请的应用id,没有接入米大师,默认为"0"
  188 + OfferId:在米大师申请的应用id,没有接入米大师(比如第三方支付),默认为"0"
204 189  
205 190 ZoneId:分区ID,默认:"1"
206 191  
... ... @@ -208,7 +193,7 @@
208 193  
209 194 CurrencyType:币种,默认:"CNY"
210 195  
211   - Platform:申请接入时的平台,platform与应用id有关。
  196 + Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。
212 197  
213 198 1)接入了米大师,填写"android"(ios暂时没有开放)
214 199  
... ...
inner/intro.md
... ... @@ -14,19 +14,11 @@ PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,
14 14  
15 15  
16 16 # 噗嗤管理后台
17   -噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。
18   -
19   -方便开发者联调测试阶段不影响上线游戏运营相关数据或者配置信息,config.js的Env配置提供测试和正式环境切换。
20   -
21   -> 测试环境各种配置管理、数据分析查看,请[前往测试服后台](http://pre-data.d3games.com/#/login)
22   -
23   -> 正式环境各种配置管理、数据分析查看,请[前往正式服后台](https://data.d3games.com/#/login)
  17 +噗嗤管理后台对sdk中上报的各项数据进行分析,管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。
24 18  
25 19 噗嗤管理后台地址:
26 20  
27   -- 测试服后台,地址:http://pre-data.d3games.com/#/login
28   -
29   -- 正式服后台,地址:https://data.d3games.com/#/login
  21 +- https://data.d3games.com/#/login
30 22  
31 23 **友情提示:**
32 24  
... ... @@ -52,8 +44,8 @@ PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,
52 44  
53 45 **后台提供配置相关功能(不能跳转请联系管理员添加权限):**
54 46  
55   -- [分享/视频配置](http://pre-data.d3games.com/index.html#/share_list)
56   -- [配置参数](http://pre-data.d3games.com/index.html#/config_list)
  47 +- [分享/视频配置](https://data.d3games.com/index.html#/share_list)
  48 +- [配置参数](https://data.d3games.com/index.html#/config_list)
57 49  
58 50  
59 51 # 更多:
... ...
inner/modules.md 0 → 100644
... ... @@ -0,0 +1,87 @@
  1 +# 模块概览
  2 +下图是PCSDK的概要思维导图,SDK所提供的所有功能都在下图列出<font color="red">(点击查看大图)</font>:
  3 +
  4 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_000.png "🔍点击查看大图")
  5 +
  6 +
  7 +[统计模块:stat](stat.md)
  8 +
  9 + 启动注册打点
  10 +
  11 + setLoginInfo:设置登录信息
  12 +
  13 + loadingFinish:资源加载完成
  14 +
  15 + active:添加注册活跃用户
  16 +
  17 + 关卡分析打点
  18 +
  19 + logLevelRelive:游戏关卡复活上报
  20 +
  21 + logLevelHide:游戏关卡页onHide上报
  22 +
  23 + logLevelFail:游戏关卡失败上报
  24 +
  25 + logLevelWin:游戏关卡成功上报
  26 +
  27 + logMerge:游戏2合1合成最高等级上报
  28 +
  29 + 交叉推广位:悬浮框、抽屉式、猜你喜欢
  30 +
  31 + bannerList:获取对应类型交叉推广位列表
  32 +
  33 + bannerNavigateTo:点击跳转到对应appid的游戏
  34 +
  35 + addExposure:交叉推广位一条或者多条广告展示,添加曝光数据
  36 +
  37 + 自定义事件
  38 +
  39 + event:自定义打点事件
  40 +
  41 +[数据模块:data](data.md)
  42 +
  43 + GameId:获取游戏的GameId,来源于config.js配置的GameId
  44 +
  45 + ChannelId:获取游戏渠道ID,来源于config.js配置的ChannelId
  46 +
  47 + UserId:获取用户ID,来源于setLoginInfo传递的openId的值
  48 +
  49 + RegTime:获取用户注册时间,来源于setLoginInfo传递的regTime的值
  50 +
  51 + ShareId:获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0。需接shareVideo模块
  52 +
  53 + ShareKey:接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key
  54 +
  55 + Platform:获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备)
  56 +
  57 + SystemId:获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备)
  58 +
  59 + QueryUserInviteUid:获取此次分享会话进入游戏,分享来源者用户ID,来源query的参数invite_user_uid
  60 +
  61 + IsCross:获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏
  62 +
  63 + IsDrawer:获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏
  64 +
  65 + IsGuessLike:获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏
  66 +
  67 +[配置参数模块:online](online.md)
  68 +
  69 + updateOnlineConfig:拉取后台配置的配置参数数据,可代码中手动调用,也可SDK自动拉取
  70 +
  71 + getParamsInt:根据在线参数key获取number类型参数值
  72 +
  73 + getParamsObj:根据在线参数key获取object类型参数值
  74 +
  75 + getParamsString:根据在线参数key获取string类型参数值
  76 +
  77 +事件模块:event
  78 +
  79 +多平台接口模块:platform
  80 +
  81 +[分享视频模块:shareVideo](share.md)
  82 +
  83 + share:普通分享,不需要处理回调的场景
  84 +
  85 + dispatch:分享视频分发入口,传入功能点英文命名的分享/视频key
  86 +
  87 + getShareVideoType:根据功能点在后台配置的分享/视频key,得到此功能点分享开关
... ...
inner/online.md 0 → 100644
... ... @@ -0,0 +1,165 @@
  1 +
  2 +# 配置参数模块
  3 +
  4 +------
  5 +
  6 +#### **简介**
  7 +
  8 +在线配置参数是噗嗤游戏开放的一个新模块功能,可以让开发者在后台【配置参数】栏中动态修改游戏使用的参数值。例如:动态修改游戏的数值,小到一个简单开关0/1切换、一个简单的数字配置;大到一个游戏json配置等。
  9 +
  10 +该模块借鉴了[友盟在线配置参数](http://www.it610.com/article/4896789.htm)的设计思路。
  11 +
  12 +
  13 +
  14 +#### **后台使用**
  15 +
  16 +设置在线配置参数,登录后台->头部tab切换到【游戏数据】->【配置相关】->【配置参数】可新增、编辑修改参数值,配置完毕后,通过online模块相关的api使用:
  17 +
  18 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_021.png "🔍点击查看大图")
  19 +
  20 +
  21 +
  22 +#### **接入API:**
  23 +
  24 +| **名称** | **功能说明** |
  25 +| ------------------------------- | ------------------------------------------------------------ |
  26 +| PCSDK.online.updateOnlineConfig | 拉取后台配置的配置参数数据,可代码中手动调用,也可以通过config.js中配置SDK主动拉取,注意:使用前请详细[阅读config.js的IsOnlineAutoUse和IsOnlineDebug参数详解](install.md#config_env) |
  27 +| PCSDK.online.getParamsInt | 根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数 |
  28 +| PCSDK.online.getParamsObj | 根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象 |
  29 +| PCSDK.online.getParamsString | 根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串 |
  30 +
  31 +
  32 +
  33 +1. ##### **updateOnlineConfig**
  34 +
  35 + ```javascript
  36 + PCSDK.online.updateOnlineConfig(): Promise<any>
  37 + ```
  38 +
  39 + 定义:拉取后台配置的配置参数数据,
  40 +
  41 + 提示:
  42 +
  43 + > [config.js中配置IsOnlineAutoUse](install.md#config_env)为true:SDK启动时会自动去拉取在线配置参数,开发者不需要调用此接口,不然会导致重复拉取
  44 + >
  45 + > [config.js中配置IsOnlineAutoUse](install.md#config_env)为false:有两种理解方式:1)不接入使用在线配置参数模块;2)接入使用在线配置参数模块,开发者自己手动调用updateOnlineConfig api处理逻辑。
  46 + >
  47 + > 下面示例会演示两种不同配置的使用范例:
  48 +
  49 + 参数:
  50 +
  51 + ```
  52 + 无
  53 + ```
  54 +
  55 + 返回值:
  56 +
  57 + ```
  58 + Promise<any>
  59 + ```
  60 +
  61 + <div id="sample"></div>
  62 +
  63 + 示例1:config.js配置IsOnlineAutoUse为false,开发者调用updateOnlineConfig api手动拉取在线配置参数数据
  64 +
  65 + ```javascript
  66 + // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关
  67 + PCSDK.online.updateOnlineConfig().then(() => {
  68 + // 使用1:获取是否后台动态配置开启插屏广告,1为开启,0为关闭
  69 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
  70 + // isInterstitialAd && '显示插屏广告';
  71 +
  72 + // 使用2:获取动态多个广告位开启的配置
  73 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
  74 + // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位';
  75 + // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位';
  76 + // pcGameOpenMap.Cross === 1 && '显示交叉推广位';
  77 +
  78 + // 使用3:获取签到配置
  79 + let signRewardCfg = PCSDK.online.getParamsObj('sign_reward_cfg', [100, 300, 500, 700, 900, 2000, 3000]);
  80 +
  81 + // 使用4:获取动态bannerUid
  82 + let bannerUid = PCSDK.online.getParamsString('banner_common_uid', 'adunit-fe38438f074c717f');
  83 + // bannerUid && '显示banner';
  84 + });
  85 + ```
  86 +
  87 + 示例2:config.js配置IsOnlineAutoUse为true,SDK启动时会自动调用 updateOnlineConfig api拉取在线配置参数数据
  88 +
  89 + ```javascript
  90 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
  91 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
  92 + ```
  93 +
  94 +
  95 +
  96 +2. ##### **getParamsInt**
  97 +
  98 + ```javascript
  99 + PCSDK.online.getParamsInt( key: string, defaultVal?: number ): number
  100 + ```
  101 +
  102 + 定义:根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数
  103 +
  104 + 参数:
  105 +
  106 + ```javascript
  107 + key: string 必传 后台 ->【配置参数】配置的key
  108 + defaultVal: number 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值
  109 + ```
  110 +
  111 + 返回值:
  112 +
  113 + ```
  114 + number
  115 + ```
  116 +
  117 + 示例:[查看上面的示例代码](online.md#sample)
  118 +
  119 +3. **getParamsObj**
  120 +
  121 + ```javascript
  122 + PCSDK.online.getParamsObj( key: string, defaultVal?: any ): any
  123 + ```
  124 +
  125 + 定义:根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象
  126 +
  127 + 参数:
  128 +
  129 + ```javascript
  130 + key: string 必传 后台 ->【配置参数】配置的key
  131 + defaultVal: any 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值
  132 + ```
  133 +
  134 + 返回值:
  135 +
  136 + ```
  137 + object | array | null
  138 + ```
  139 +
  140 + 示例:[查看上面的示例代码](online.md#sample)
  141 +
  142 +1. **getParamsString**
  143 +
  144 + ```javascript
  145 + PCSDK.online.getParamsString( key: string, defaultVal?: string ): string
  146 + ```
  147 +
  148 + 定义:根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串
  149 +
  150 + 参数:
  151 +
  152 + ```javascript
  153 + key: string 必传 后台 ->【配置参数】配置的key
  154 + defaultVal: string 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值
  155 + ```
  156 +
  157 + 返回值:
  158 +
  159 + ```
  160 + string
  161 + ```
  162 +
  163 + 示例:[查看上面的示例代码](online.md#sample)
  164 +
  165 +
0 166 \ No newline at end of file
... ...
inner/platform.md 0 → 100644
... ... @@ -0,0 +1,577 @@
  1 +# 多平台接口模块:PCSDK.platform
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +所谓多平台指的是微信小游戏、QQ轻游戏、今日头条、oppo等游戏发布的平台。微信和QQ接口文档api相似度99%,微信、QQ、今日头条平台的接口api相似度80%以上,虽然相似度很高,但是仍需要针对差异性做一些处理。多平台接口模块就是想要在SDK内部去抹平了各个平台差异性的处理,达到同一个api调用,应用多个平台的作用。
  8 +
  9 +#### **此模块是参照微信小游戏提供的api进行封装的公用方法,提供了以下游戏中常用到的功能:**
  10 +
  11 +2. **打开客服消息:openCustomerServiceConversation** 整理来自[wx.openCustomerServiceConversation](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html)
  12 +
  13 +3. **检测版本更新:checkUpdate** 整理来自:[wx.getUpdateManager](https://developers.weixin.qq.com/minigame/dev/api/base/update/UpdateManager.html)
  14 +4. **显示模态弹出框:showModal** 整理来自:[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html)
  15 +5. **复制文本:copy** 整理来自:[wx.setClipboardData](https://developers.weixin.qq.com/minigame/dev/api/device/clipboard/wx.setClipboardData.html)
  16 +6. **长震动:vibrateLong** 整理来自:[wx.vibrateLong](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateLong.html)
  17 +7. **短震动:vibrateShort** 整理来自:[wx.vibrateShort](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateShort.html)
  18 +9. **微信小游戏推荐弹窗组件GamePortal:isGamePortalPlaying 与 gamePortalShow** 整理来自:[wx.createGamePortal](https://developers.weixin.qq.com/minigame/dev/api/game-portal/GameBanner.html)
  19 +10. **微信小游戏插屏广告组件InterstitialAd:isInterstitialPlaying 与 interstitialShow** 整理来自:[wx.createInterstitialAd](https://developers.weixin.qq.com/minigame/dev/api/ad/InterstitialAd.html)
  20 +11. **微信小游戏推荐icon组件GameIcon:gameIconShow 与 gameIconDestroy** 整理来自:[wx.createGameIcon](https://developers.weixin.qq.com/minigame/dev/api/game-portal/wx.createGameIcon.html)
  21 +
  22 +
  23 +
  24 +#### **接入API:**
  25 +
  26 +| **名称** | **功能说明** |
  27 +| ------------------------ | ------------------------------------------------------------ |
  28 +| PCSDK.platform.openCustomerServiceConversation | 进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力、钻石和进入跳转充值等,[具体用法请看](platform.md#service)|
  29 +| PCSDK.platform.checkUpdate | 检测版本是否有更新,如果版本更新会弹出确认框 |
  30 +| PCSDK.platform.copy | 设置系统剪贴板的内容。微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s |
  31 +| PCSDK.platform.vibrateShort | 使手机发生较短时间的振动(15 ms) |
  32 +| PCSDK.platform.vibrateLong | 使手机发生较长时间的振动(400 ms) |
  33 +| PCSDK.platform.gamePortalShow | 传入adUnitId创建并展示小游戏推荐弹窗组件 |
  34 +| PCSDK.platform.isGamePortalPlaying | 是否正在加载小游戏推荐弹窗组件 |
  35 +| PCSDK.platform.interstitialShow | 传入adUnitId创建并展示小游戏插屏广告组件 |
  36 +| PCSDK.platform.isInterstitialPlaying | 是否正在加载小游戏插屏广告组件 |
  37 +| PCSDK.platform.gameIconShow | 创建并显示小游戏推荐icon组件 |
  38 +| PCSDK.platform.gameIconDestroy | 销毁正在展示的小游戏推荐icon组件 |
  39 +
  40 +
  41 +
  42 +
  43 +
  44 +<div id="service"></div>
  45 +
  46 +2. **openCustomerServiceConversation**
  47 +
  48 + ```javascript
  49 + PCSDK.platform.openCustomerServiceConversation( params?: _CustomerServiceConversationObject ): void
  50 + ```
  51 +
  52 + 定义:进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力和进入跳转充值
  53 +
  54 + 参数:
  55 +
  56 + ```javascript
  57 + params _CustomerServiceConversationObject 选传,不传递打开一个普通的客户会话。[参数说明参照](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html)
  58 + {
  59 + sessionFrom string 选传 会话来源
  60 + showMessageCard boolean 选传 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息
  61 + sendMessageTitle string 选传 会话内消息卡片标题
  62 + sendMessagePath string 选传 会话内消息卡片路径
  63 + sendMessageImg string 选传 会话内消息卡片图片路径
  64 + success function 选传 接口调用成功的回调函数
  65 + fail function 选传 接口调用失败的回调函数
  66 + complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行)
  67 + }
  68 + ```
  69 + 返回值:
  70 +
  71 + ```
  72 + void
  73 + 无
  74 + ```
  75 +
  76 + 示例1:进入普通的客服会话
  77 +
  78 + ```javascript
  79 + PCSDK.platform.openCustomerServiceConversation();
  80 + ```
  81 + 示例2:应用场景如进入客服会话跳转领取体力、钻石等等: 示例为跳转客服领取18888钻石奖励,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断)。
  82 + <iframe height=498 width=740 src="https://dep.miso-lab.com/sdkword/sdk_video_001.mp4" frameborder=0 allowfullscreen></iframe>
  83 + ```javascript
  84 + // 跳转客服领取18888钻石奖励,开发者可根据示例修改
  85 + PCSDK.platform.openCustomerServiceConversation({
  86 + showMessageCard: true,
  87 + sendMessageTitle: '钻石已发送,点击领取钻石!',
  88 + sendMessagePath: '',
  89 + sendMessageImg: 'http://dep.miso-lab.com/mergeguns/bin/res/image/service_reward.png', // 图片icon对应的域名记得加入到request和download白名单中
  90 + success: () => {
  91 + // 打开跳转客服成功,记录成功状态,在游戏全局注册的onShow监听通过判断这个状态去请求接口领取奖励
  92 + // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改
  93 + AppDataManager.I.set('service.reward.data', {
  94 + status: 1, // 可以领奖
  95 + reward: 18888 // 获得18888钻石
  96 + });
  97 + },
  98 + fail: (err) => {
  99 + console.log("openCustomerServiceConversation fail: ", err);
  100 + }
  101 + });
  102 + // 在游戏中全局注册的onShow事件监听中检测是
  103 + // 游戏入口:Main.cs
  104 + class Main {
  105 + constructor() {
  106 + this.init();
  107 + }
  108 +
  109 + private init() {
  110 + PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this));
  111 + PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this));
  112 + }
  113 +
  114 + private onShow(opts) {
  115 + // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断
  116 + let serviceRewardData = AppDataManager.I.get('service.reward.data');
  117 + if (serviceRewardData && serviceRewardData.status === 1) {
  118 + AppDataManager.I.set('service.reward.data', null);
  119 + // 奖励发放,处理发放后的逻辑,比如每天只能领取一次的记录,防止重复刷奖励
  120 + }
  121 + }
  122 +
  123 + private onHide(){
  124 + // 监听平台的onHide事件
  125 + }
  126 + }
  127 + ```
  128 + 示例3:应用场景例如进入客服会话,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断),点击右下角的充值按钮后,跳转充值,充值完成后在onShow中处理:需要后台提供api接口,验证充值合理性并发放奖励,**此接口需要后端支持**。
  129 + <iframe height=498 width=740 src="https://dep.miso-lab.com/sdkword/sdk_video_002.mp4" frameborder=0 allowfullscreen></iframe>
  130 + ```javascript
  131 + // 跳转客服充值,开发者可根据示例修改,sendMessagePath请严格按照示例中提供的参数
  132 + /**
  133 + * 充值跳转客服
  134 + * @param itemId 购买道具商品id
  135 + * @param money 购买商品花费,单位元
  136 + */
  137 + private openServiceWithItem(itemId: number, money: number) {
  138 + PCSDK.platform.openCustomerServiceConversation({
  139 + showMessageCard: true,
  140 + sendMessageTitle: `充值${money}元`,
  141 + sendMessagePath: `channel=${PCSDK.data.ChannelId}&item=${itemId}&uid=${PCSDK.data.UserId}&pf=${PCSDK.data.SystemId}`,
  142 + sendMessageImg: 'http://dep.miso-lab.com/idiom/bin/share/pay.png', // 图片icon对应的域名记得加入到request和download白名单中
  143 + success: () => {
  144 + // 打开跳转客服成功,记录成功状态,onShow通过判断这个状态去请求接口领取奖励
  145 + // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改
  146 + AppDataManager.I.set('service.pay.data', {
  147 + status: 1, // 可以领奖
  148 + itemId: itemId, // 购买道具商品id
  149 + money: money // 购买商品花费,单位元
  150 + });
  151 + },
  152 + fail: (err) => {
  153 + console.log("openCustomerServiceConversation fail: ", err);
  154 + }
  155 + });
  156 + }
  157 +
  158 + // 在游戏中全局注册的onShow事件监听中检测是
  159 + // 游戏入口:Main.cs
  160 + class Main {
  161 + constructor() {
  162 + this.init();
  163 + }
  164 +
  165 + private init() {
  166 + PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this));
  167 + PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this));
  168 + }
  169 +
  170 + private onShow(opts) {
  171 + // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断
  172 + let serviceRewardData = AppDataManager.I.get('service.pay.data');
  173 + if (serviceRewardData && serviceRewardData.status === 1) {
  174 + AppDataManager.I.set('service.pay.data', null);
  175 + // 领取奖励的逻辑,比如每天只能领取一次的记录,防止重复刷奖励
  176 + // 请求后端接口验证奖励合理性
  177 + }
  178 + }
  179 +
  180 + private onHide(){
  181 + // 监听平台的onHide事件
  182 + }
  183 + }
  184 + ```
  185 +<div id="checkUpdate"></div>
  186 +3. **checkUpdate**
  187 +
  188 + ```javascript
  189 + PCSDK.platform.checkUpdate( params?: _ShowModalObject ): void
  190 + ```
  191 + 定义:检测版本是否有更新,如果版本有更新会弹出确认框,参数可不传递,不传递有版本更新会弹出下图的默认确认框;开发者可自定义弹出框的显示样式,参数与[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html)一模一样。
  192 + 建议此api在游戏的入口调用。
  193 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_029.png "🔍点击查看大图")
  194 +
  195 + 参数:
  196 +
  197 + ```javascript
  198 + params _ShowModalObject 选传 不传递有版本更新会弹出上图样式默认确认框;开发者可自定义弹出框的显示样式,参数参照wx.showModal的参数
  199 + {
  200 + title string 选传 提示的标题,默认为:更新提示
  201 + content string 选传 提示的内容,默认为:新版本已经准备好,是否重启应用?
  202 + showCancel boolean 选传 是否显示取消按钮,默认为:false不显示
  203 + cancelText string 选传 取消按钮的文字,最多4个字符
  204 + cancelColor string 选传 取消按钮的文字颜色,必须是16进制格式的颜色字符串
  205 + confirmText string 选传 确认按钮的文字,最多4个字符
  206 + confirmColor string 选传 确认按钮的文字颜色,必须是16进制格式的颜色字符串
  207 + success function 选传 接口调用成功的回调函数
  208 + fail function 选传 接口调用失败的回调函数
  209 + complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行)
  210 + }
  211 + ```
  212 + 返回值:
  213 +
  214 + ```
  215 + void
  216 + 无
  217 + ```
  218 +
  219 + 示例:在游戏入口类中检测是否有版本更新
  220 +
  221 + 1)、依照下面的示例接入checkUpdate api
  222 +
  223 + ```javascript
  224 + class Main {
  225 + constructor() {
  226 + this.init();
  227 + }
  228 +
  229 + private init() {
  230 + this.checkUpdate();
  231 + }
  232 +
  233 + private checkUpdate() {
  234 + // 调用SDK的checkUpdate,微信版本有更新,会自动弹出更新确认框
  235 + PCSDK.platform.checkUpdate();
  236 +
  237 + // 自定义更新弹出框
  238 + /*
  239 + PCSDK.platform.checkUpdate({
  240 + showCancel: true,
  241 + content: '客官,xxx游戏有更新了!',
  242 + cancelText: '放弃'
  243 + });
  244 + */
  245 + }
  246 + }
  247 +
  248 + ```
  249 + 2)、接入代码完毕后,按照下图的操作本地开发工具调试是否接入成功。
  250 +
  251 + I、选择:添加编译模式。
  252 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_030.png "🔍点击查看大图")
  253 + II、选择:自定义模式名称、勾选下次编译时模拟更新、选择模拟成功还是失败状态,点击确定。
  254 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_031.png "🔍点击查看大图")
  255 + III、开发工具会自动重新启动游戏,弹出更新框,看到弹出框接入成功。
  256 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_032.png "🔍点击查看大图")
  257 +<div id="copy"></div>
  258 +4. **copy**
  259 +
  260 + ```javascript
  261 + PCSDK.platform.copy( str: string ): Promise<any>
  262 + ```
  263 + 定义:设置系统剪贴板的内容。提示:微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s
  264 +
  265 + 参数:
  266 +
  267 + ```javascript
  268 + str string 必传 剪贴板的内容
  269 +
  270 + ```
  271 + 返回值:
  272 +
  273 + ```
  274 + Promise<any>
  275 + Promise resolve复制系统剪贴板内容成功回调,reject失败回调
  276 + ```
  277 +
  278 + 示例:
  279 +
  280 + ```javascript
  281 + PCSDK.platform.copy('这是我想要复制的内容')
  282 + .then( ret => {
  283 + // 打印复制的内容
  284 + console.log(ret.data);
  285 + })
  286 + .catch(err => {
  287 + console.warn('复制失败', err);
  288 + });
  289 + ```
  290 +<div id="vibrate"></div>
  291 +4. **vibrateShort**
  292 +```javascript
  293 + PCSDK.platform.vibrateShort(): Promise<any>
  294 +```
  295 +定义:使手机发生较短时间的振动(15 ms)。仅在 iPhone 7 / 7 Plus 以上及 Android 机型生效
  296 +参数:
  297 +
  298 + ```javascript
  299 + 无
  300 + ```
  301 +示例:
  302 +
  303 + ```javascript
  304 + PCSDK.platform.vibrateShort();
  305 +
  306 + ```
  307 +5. **vibrateLong**
  308 +
  309 + ```javascript
  310 + PCSDK.platform.vibrateLong(): Promise<any>
  311 + ```
  312 + 定义:使手机发生较长时间的振动(400 ms)
  313 + 参数:
  314 + ```javascript
  315 + 无
  316 + ```
  317 + 示例:
  318 + ```javascript
  319 + PCSDK.platform.vibrateLong();
  320 + ```
  321 +<div id="gamePortal"></div>
  322 +6. **gamePortalShow**
  323 + ```javascript
  324 + PCSDK.platform.gamePortalShow(adUnitId: string): Promise<any>
  325 + ```
  326 + 定义:传入adUnitId创建并展示小游戏推荐弹窗组件,Promise resolve创建展示成功回调,reject创建失败回调。
  327 +
  328 + 参数:
  329 + ```javascript
  330 + adUnitId string 必传 小游戏推荐弹窗组件推荐单元id
  331 + ```
  332 + 返回值:
  333 + ```javascript
  334 + Promise<any>
  335 + Promise resolve创建展示成功回调,reject创建失败回调
  336 + ```
  337 + 示例:
  338 + ```javascript
  339 + // 例子1:显示弹窗组件
  340 + let adUnitId: string = 'PBgAAgPWNXGtCwcA';
  341 + PCSDK.platform.gamePortalShow(adUnitId);
  342 +
  343 + // 例子2:显示推荐弹窗组件,如果显示不成功,则显示小游戏插屏广告,插屏广告api使用请继续往下看。
  344 + let adUnitId: string = 'PBgAAgPWNXGtCwcA';
  345 + PCSDK.platform.gamePortalShow(adUnitId).catch(err => {
  346 + // 推荐弹窗组件显示不成功显示插屏广告
  347 + adUnitId = 'adunit-4da0ec77513f8eea';
  348 + PCSDK.platform.interstitialShow(adUnitId);
  349 + });
  350 +
  351 + ```
  352 +7. **isGamePortalPlaying**
  353 +
  354 + ```javascript
  355 + PCSDK.platform.isGamePortalPlaying(): boolean
  356 + ```
  357 +
  358 + 定义:是否正在加载小游戏推荐弹窗组件;在PCSDK.platform.gamePortalShow api内部,如果正在创建弹窗组件会在Promise reject返回错误提示信息。
  359 +
  360 + 参数:
  361 +
  362 + ```javascript
  363 + 无
  364 + ```
  365 + 返回值:
  366 +
  367 + ```javascript
  368 + boolean
  369 + ```
  370 +
  371 + 示例:
  372 +
  373 + ```javascript
  374 + let isPlaying = PCSDK.platform.isGamePortalPlaying();
  375 +
  376 + ```
  377 +<div id="interstitialAd"></div>
  378 +8. **interstitialShow**
  379 +
  380 + ```javascript
  381 + PCSDK.platform.interstitialShow(adUnitId: string): Promise<any>
  382 + ```
  383 +
  384 + 定义:传入adUnitId创建并展示小游戏插屏广告组件,Promise resolve创建展示成功回调,reject创建失败回调
  385 +
  386 + 参数:
  387 +
  388 + ```javascript
  389 + adUnitId string 必传 小游戏插屏广告组件广告单元id
  390 + ```
  391 + 返回值:
  392 +
  393 + ```javascript
  394 + Promise<any>
  395 + Promise resolve创建展示成功回调,reject创建失败回调
  396 + ```
  397 +
  398 + 示例:
  399 +
  400 + ```javascript
  401 + // 例子1:显示插屏广告组件
  402 + let adUnitId: string = 'adunit-4da0ec77513f8eea';
  403 + PCSDK.platform.interstitialShow(adUnitId);
  404 +
  405 + // 例子2:显示插屏广告组件,如果显示不成功,则显示小游戏推荐弹窗组件。
  406 + let adUnitId: string = 'adunit-4da0ec77513f8eea';
  407 + PCSDK.platform.interstitialShow(adUnitId).catch( err => {
  408 + // 加载不成功显示小游戏推荐弹窗组件
  409 + adUnitId = 'PBgAAgPWNXGtCwcA';
  410 + PCSDK.platform.gamePortalShow(adUnitId);
  411 + });
  412 + ```
  413 +9. **isInterstitialPlaying**
  414 +
  415 + ```javascript
  416 + PCSDK.platform.isInterstitialPlaying(): boolean
  417 + ```
  418 +
  419 + 定义:是否正在加载小游戏插屏广告组件;在PCSDK.platform.interstitialShow如果正在创建插屏广告会在Promise reject返回错误提示信息。
  420 +
  421 + 参数:
  422 +
  423 + ```javascript
  424 + 无
  425 + ```
  426 + 返回值:
  427 +
  428 + ```javascript
  429 + boolean
  430 + ```
  431 +
  432 + 示例:
  433 +
  434 + ```javascript
  435 + let isPlaying = PCSDK.platform.isInterstitialPlaying();
  436 +
  437 + ```
  438 +<div id="gameicon"></div>
  439 +10. **gameIconShow**
  440 + ```javascript
  441 + PCSDK.platform.gameIconShow(adUnitId: string, opts: { count: number, style: Array<_GameIconStyleItem> }): Promise<any>
  442 + ```
  443 +
  444 + 定义:创建并显示小游戏推荐icon组件。
  445 +
  446 + 参数:
  447 +
  448 + ```javascript
  449 + adUnitId string 必传 小游戏推荐icon组件广告单元id
  450 + opts object 必传 扩展参数,目前支持count和style两个属性值
  451 + {
  452 + count number 必传 游戏icon的数量,请注意,正式版下面渲染出来的icon数量会小于等于count,请注册做好样式兼容
  453 + style Array<_GameIconStyleItem> 必传 数组的每一项可以针对对应的icon设置位置和样式等信息,style的每一项称为_GameIconStyleItem
  454 + }
  455 +
  456 + Object _GameIconStyleItem:单个游戏icon的位置和样式信息
  457 + {
  458 + appNameHidden boolean 必传 游戏名称是否隐藏
  459 + color string 必传 游戏名称的颜色色值
  460 + size number 必传 游戏icon的宽高值
  461 + borderWidth number 必传 游戏icon的border尺寸
  462 + borderColor string 必传 游戏icon的border颜色色值
  463 + left number 必传 游戏icon的X轴坐标
  464 + top number 必传 游戏icon的Y轴坐标
  465 + }
  466 + ```
  467 + 返回值:
  468 +
  469 + ```javascript
  470 + Promise<any>
  471 + Promise resolve创建展示成功回调,reject创建失败回调
  472 + ```
  473 +
  474 + 示例:
  475 +
  476 + ```javascript
  477 + // 显示1个推荐icon组件
  478 + private showGameIcon(){
  479 + let adUnitId: string = 'PBgAAgPWNXGkQ4p0';
  480 + let {windowWidth} = PCSDK.platform.getSystemData();
  481 + PCSDK.platform.gameIconShow(adUnitId, {
  482 + count: 1,
  483 + style: [
  484 + {
  485 + appNameHidden: false,
  486 + color: "#FF0000",
  487 + size: 50,
  488 + borderWidth: 0,
  489 + borderColor: "#FF0000",
  490 + left: (windowWidth / 750) * 550,
  491 + top: (windowWidth / 750) * 150
  492 + }
  493 + ]
  494 + })
  495 + .then(() => {
  496 + // console.warn('显示GameIcon成功');
  497 + })
  498 + .catch((err) => {
  499 + // console.warn('显示GameIcon失败');
  500 + });
  501 + }
  502 +
  503 + ```
  504 +11. **gameIconDestroy**
  505 +
  506 + ```javascript
  507 + PCSDK.platform.gameIconDestroy(): void
  508 + ```
  509 +
  510 + 定义:销毁正在展示的小游戏推荐icon组件。展示推荐icon组件广告后,请记得在页面关闭时候调用此api销毁GameIcon。
  511 +
  512 + 参数:
  513 +
  514 + ```javascript
  515 + 无
  516 + ```
  517 + 返回值:
  518 +
  519 + ```javascript
  520 + void
  521 + ```
  522 +
  523 + 示例:
  524 +
  525 + ```javascript
  526 +
  527 + private open(){
  528 + super.open();
  529 + this.showGameIcon();
  530 + }
  531 +
  532 + private close(){
  533 + super.close();
  534 + this.destoryGameIcon();
  535 + }
  536 +
  537 + // 显示2个推荐icon组件
  538 + private showGameIcon(){
  539 + let adUnitId: string = 'PBgAAgPWNXGkQ4p0';
  540 + let {windowWidth} = PCSDK.platform.getSystemData();
  541 + PCSDK.platform.gameIconShow(adUnitId, {
  542 + count: 2,
  543 + style: [
  544 + {
  545 + appNameHidden: false,
  546 + color: "#FF0000",
  547 + size: 50,
  548 + borderWidth: 0,
  549 + borderColor: "#FF0000",
  550 + left: (windowWidth / 750) * 450,
  551 + top: (windowWidth / 750) * 150
  552 + },
  553 + {
  554 + appNameHidden: false,
  555 + color: "#FF0000",
  556 + size: 50,
  557 + borderWidth: 0,
  558 + borderColor: "#FF0000",
  559 + left: (windowWidth / 750) * 550,
  560 + top: (windowWidth / 750) * 150
  561 + }
  562 + ]
  563 + })
  564 + .then(() => {
  565 + // console.warn('显示GameIcon成功');
  566 + })
  567 + .catch((err) => {
  568 + // console.warn('显示GameIcon失败');
  569 + });
  570 + }
  571 +
  572 + // 销毁展示创建的GameIcon组件
  573 + private destoryGameIcon(){
  574 + PCSDK.platform.gameIconDestroy();
  575 + }
  576 +
  577 + ```
0 578 \ No newline at end of file
... ...
inner/share.md 0 → 100644
... ... @@ -0,0 +1,539 @@
  1 +
  2 +# 分享视频模块
  3 +
  4 +------
  5 +
  6 +#### **简介**
  7 +小游戏生态中,普遍把平台提供的分享/视频接口更多用于某个奖励领取、获取n倍奖励、游戏死亡复活、转盘额外次数获得等等一种有效途径(分享:拉取新用户,视频:赚钱广告费);噗嗤游戏在分享or视频推送不断的探索迭代中,总结了一套分享/视频积分策略,集成在SDK中开放给开发者,开发者只需对游戏中分享视频功能点命名一个英文名称key(分享视频key),这个key关联分享文案、分享图、分享开关(推送类型)、视频uid等等在后台配置好,使用SDK提供的一个dispatch api传入英文名称key即可完成接入工作。
  8 +
  9 +- 分享/视频配置可以让开发者在后台中动态修改相关功能点的分享/视频配置内容。
  10 +
  11 +- 新增某个功能的分享点配置、在线修改相关功能点的分享图或文案、在线切换某个功能点按钮的分享/视频推送类型。
  12 +
  13 +- 调用SDK的dispatch api,dispatch会根据后台配置的分享开关(推送类型)自动进行分发:推送分享还是视频全权交由SDK去处理,开发者只需要传入成功/失败回调函数,成功回调函数处理发放领取奖励、n倍奖励、成功复活等操作,失败回调函数处理参数传递的msg信息。
  14 +
  15 +#### **疑惑解答**
  16 +1. 为什么要引入这个模块?
  17 +
  18 + > 游戏中很多n倍奖励、复活、额外奖励等功能点通常需要分享或者视频才能额外获得,游戏上线后,运营很有可能会对某些功能点有额外的需求修改:a功能点获取由分享改成视频方式获取、b功能点由视频改成分享方式获取、c功能点需要在前面n次看视频获得后全是分享获得、为某某功能的分享图想换一个、拉取视频不成功自动切换分享等等;为了应对这些不同情形,我们把分享和视频点包装成一个模块,a功能点也不在局限于只是简单的分享、b功能只是视频,而是通过后台分享开关去灵活切换。所有功能点入口调用都是使用dispatch,每个功能点都是转化为一个分享视频key在后台管理。
  19 +
  20 +2. 什么是分享视频key?
  21 +
  22 + > 分享视频key是一个功能点的英文名称,这个key配置在后台中,关联分享文案、分享图、分享开关(推送类型)、视频uid等等信息。某个功能点(不论是分享还是视频方式)调用dispatch传入这个key,SDK会读取这个key关联的信息,根据分享开关(推送类型)来推送分享(需要分享文案、分享图)还是推送视频(需要视频uid)。
  23 +
  24 +3. 什么是分享视频分发?
  25 +
  26 + > 调用dispatch api传入分享视频key,SDK会查找这个key在后台配置的数据,SDK读取数据中分享开关(推送类型)的字段信息,通过这个开关类型来判断推给用户是分享还是视频,这个根据类型来推送的操作就是分发操作。
  27 +
  28 +4. 游戏中之前是玩家分享n次后变成看视频或者是看视频n次后全是分享,dispatch能满足吗?
  29 +
  30 + > 上面的问题dispatch也同样支持,还是同样的调用方式,不需要做其他额外处理,dispatch是怎么做到的了:分享开关(推送类型)有一个分享积分选择项,这个选项就是通过积分策略实现了上面问题。
  31 + >
  32 +
  33 +
  34 +#### **后台使用**
  35 +
  36 +配置分享视频配置,登录后台->头部tab切换到【游戏数据】->【配置相关】->【分享/视频配置】可新增、编辑修改分享/视频内容:
  37 +
  38 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_023.png "🔍点击查看大图")
  39 +
  40 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_024.png "🔍点击查看大图")
  41 +
  42 +接入分享视频模块后,后台已经对分享和视频数据分别进行整理统计了,游戏接入方可实时查看分享/视频的各项数据:
  43 +
  44 +查看分享分析,登录后台->头部tab切换到【游戏数据】->【产品分析】->【分享分析】可阅览游戏分享数据的各项统计:
  45 +
  46 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_025.png "🔍点击查看大图")
  47 +
  48 +查看视频广告详情,登录后台->头部tab切换到【游戏数据】->【配置相关】->【视频广告详情】可阅览游戏各个功能点视频数据统计:
  49 +
  50 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_026.png "🔍点击查看大图")
  51 +
  52 +
  53 +
  54 +#### **接入必读**
  55 +
  56 +- 接入此模块前,请[**前往sdk/config.js文件中配置【IsUseShareModule: true 】开启分享视频模块功能**](install.md#config_env),此参数配置为true,才能正常使用此模块的功能,SDK启动时会自动拉取后台配置所有功能点的分享/视频配置列表。
  57 +
  58 +- <font color="#FF0000">微信小游戏开发者接入此模块,如果游戏有很多分享点,提审时避免触犯微信平台的[滥用分享行为](https://developers.weixin.qq.com/minigame/product/#_5-1-滥用分享行为),在后台【配置参数】中配置了一个SDK内部使用的[配置参数](online.md)share_unlock,进行分享开关切换:1(开启)0(关闭),提审时设置为0,审核通过后设为1。share_unlock设置为0,所有的功能点不会分享完成、拉起看完视频后发放奖励,而是直接发放奖励,这样就能避免审核时,如果是推送分享拉起分享,被微信认为是诱导分享,被拒的可能性。
  59 +
  60 +- sdk/config.js的配置参数ShareRightKey,表示右上角分享的分享视频key,请配置到后台【分享/视频配置】中。如果ShareRightKey配置不为空,SDK会自动调用微信的右上角分享接口(wx.onShareAppMessage),实现右上角分享功能,注意的是开发者在游戏中已经有注册wx.onShareAppMessage需要删除掉,不然游戏中onShareAppMessage的注册事件会把SDK中的注册事件处理函数覆盖掉,导致还是使用的是开发者注册的右上角分享功能。
  61 +
  62 +- sdk/config.js的配置参数ShareData表示默认分享视频配置,此条配置应用在两种情况下:
  63 +
  64 + > 1、请求功能点的分享/视频配置列表出错,使用key去查找对应的分享配置肯定是查找不到的,会读取此条默认数据。
  65 + >
  66 + >
  67 + >
  68 + > 2、请求功能点的分享/视频配置列表成功了,但是这个key没有配置到后台,也会读取此条默认数据
  69 +
  70 +#### **接入**API:
  71 +
  72 +| **名称** | **功能说明** |
  73 +| ------------------------------- | ------------------------------------------------------------ |
  74 +| PCSDK.shareVideo.share | 普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 |
  75 +| PCSDK.shareVideo.dispatch | 分享视频分发入口,传入功能点英文命名的分享/视频key |
  76 +| PCSDK.shareVideo.getShareVideoType | 根据功能点在后台配置的分享/视频key,得到此功能点分享开关(推送类型)SDK计算得到最终推送类型:-1(无视频无分享)、0(分享)、1(异步分享)、5(分享积分)、2(视频)、3(无视频则分享)、4(视频和分享)(控制分享和视频两个按钮的显示) |
  77 +
  78 +
  79 +
  80 +1. ##### **share**
  81 +
  82 + ```javascript
  83 + PCSDK.shareVideo.share(key:sring, params?: any, opts?: any): void
  84 + ```
  85 +
  86 + 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。
  87 +
  88 + 参数:
  89 +
  90 + ```javascript
  91 + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key)
  92 +
  93 + params: object 选传 扩展参数:分享链接query携带自定义参数,{ key: value }对象形式,该对象传递的参数会与SDK内部query参数一起组成query(查询参数, key1=val1&key2=val2的格式)的值,SDK内部参数key有:channel_id、user_invite_uid、share_id、share_key。
  94 +
  95 + 提示:params传递的对象中如果含有传递SDK内部query参数key,会被SDK内部参数值覆盖,所以开发者避免传递这些key。
  96 +
  97 + opts: object 选传 可不传递
  98 +
  99 + ```
  100 +
  101 + 返回值:
  102 +
  103 + ```javascript
  104 + void
  105 + ```
  106 +
  107 + 示例:游戏首页分享到群的功能,假如config.js配置的ChannelId: 20024;后台配置的分享视频key: home_share2group、此分享key的id:512;用户id:100000。
  108 +
  109 + ```javascript
  110 + // 示例1:
  111 + // 分享后生成的query:share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000
  112 + PCSDK.shareVideo.share( 'home_share2group' );
  113 +
  114 + // 示例2:第二个参数是分享生成的query携带的参数
  115 + // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000
  116 + PCSDK.shareVideo.share( 'home_share2group', {
  117 + type:99
  118 + });
  119 +
  120 + // 示例3:第二个参数是分享生成的query携带的参数,传递SDK内部query参数:channel_id
  121 + // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000
  122 + PCSDK.shareVideo.share( 'home_share2group', {
  123 + type:99,
  124 + channel_id:10000
  125 + });
  126 + ```
  127 +
  128 +2. ##### **dispatch**
  129 +
  130 + ```javascript
  131 + PCSDK.shareVideo.dispatch( key: string, params?: { success: Function, fail: Function, context?: any} ): void
  132 + ```
  133 +
  134 + 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。
  135 +
  136 + 参数:
  137 +
  138 + ```javascript
  139 + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key)
  140 +
  141 + params: object 选传 扩展参数:success分享视频成功回调处理函数,fail分享视频失败回调处理函数,contex函数执行上下文
  142 + {
  143 + success: ( from:number, ret: any | null ) => void,
  144 + error: ( from:number, error: object | null ) => void,
  145 + context: any
  146 + }
  147 +
  148 + from:此次分发成功推送类型
  149 + from返回枚举值为:
  150 + 0:无视频无分享(后台配置分享开关(推送类型)or 应对审核分享关闭:配置参数share_unlock设置为0)
  151 + 1:推送同步分享
  152 + 2:推送异步分享
  153 + 3:推送视频
  154 +
  155 + error:此次分发失败的错误消息
  156 + error返回枚举值为:
  157 + { code: 1000, msg: '要看完视频哦!' },
  158 + { code: 1001, msg: '视频加载失败!' },
  159 + { code: 999, msg: '视频UID不存在!' },
  160 + { code: 1002, msg: '视频组件未开放!' },
  161 + { code: 1003, msg: '正在观看视频中...' },
  162 + { code: 1004, msg: '分享失败,请尝试发送至不同群!' },
  163 + { code: 1005, msg: '别总骚扰这个群,换个群分享吧!' },
  164 + { code: 1006, msg: '请分享到群哦!' },
  165 + { code: 1007, msg: '分享到群才能领取更多~' },
  166 + { code: 1008, msg: '分享失败,请尝试发送至不同群!' },
  167 + { code: 1009, msg: '今日已达分享上限次数,请明日再来' }
  168 + ```
  169 +
  170 + 返回值:
  171 +
  172 + ```javascript
  173 + void
  174 + ```
  175 +
  176 + 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。
  177 +
  178 + 演示
  179 +
  180 + ```javascript
  181 + // DiamondDoublePopwin.ts文件
  182 + export default class DiamondDoublePopwin extends BaseView{
  183 + protected addEvent() {
  184 + super.addEvent();
  185 + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用)
  186 + this.btnFree.on(Laya.Event.CLICK, this, this.onReward);
  187 + // 分享双倍
  188 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward);
  189 + // 视频双倍
  190 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward);
  191 + }
  192 +
  193 + protected removeEvent() {
  194 + super.removeEvent();
  195 + this.btnFree.off(Laya.Event.CLICK, this, this.onReward);
  196 + this.btnShare.off(Laya.Event.CLICK, this, this.onReward);
  197 + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward);
  198 + }
  199 +
  200 + // 领取奖励操作
  201 + private onReward(){
  202 + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), {
  203 + success: this.handleReward,
  204 + fail: this.handleError,
  205 + context: this
  206 + } );
  207 + }
  208 +
  209 + // 分享/视频成功后回调处理函数:发奖励
  210 + private handleReward(from: ShareVideoFrom, ret: any | null){
  211 + // 分享成功、视频成功、无视频无分享
  212 + }
  213 +
  214 + // 分享/视频失败后回调处理函数:弹出提示
  215 + private handleError(from: ShareVideoFrom, error: any | null){
  216 + // 返回错误,处理错误msg信息,自定义处理
  217 + if( error ){
  218 + wx.showToast({
  219 + title: error.msg
  220 + });
  221 + }
  222 + }
  223 + }
  224 +
  225 + // Enums.ts文件
  226 + // 分享视频key枚举,每个key表示一个功能点
  227 + enum ShareVideoKeys {
  228 + // 钻石双倍获取
  229 + DiamondDouble = 'diamond_double',
  230 + // 失败获得双倍奖励
  231 + FailRewardDouble = 'fail_reward_double'
  232 + }
  233 +
  234 + // 分享视频功能点最终处理方式
  235 + enum ShareVideoFrom{
  236 + None = 0, // 无视频无分享
  237 + Share = 1, // 分享
  238 + ShareAsync = 2, // 异步分享
  239 + Video = 3, // 看视频
  240 + }
  241 + ```
  242 +
  243 +3. ##### **getShareVideoType**
  244 +
  245 + ```javascript
  246 + PCSDK.shareVideo.getShareVideoType( key: string ): number
  247 + ```
  248 +
  249 + 定义:根据分享视频key获取此次shareVideo模块推送的分享视频类型值:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分);此api用于通过得到的类型值处理页面的ui状态(微信和QQ平台对按钮的icon有强制限制):显示视频icon、显示分享icon、既没有分享icon,也没有视频icon。
  250 +
  251 + 参数:
  252 + ```javascript
  253 + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key)
  254 + ```
  255 +
  256 + 返回值:
  257 +
  258 + ```javascript
  259 + number
  260 + 返回值此次点击功能按钮触发的推送类型:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分)
  261 + 分享视频类型枚举值如下:
  262 + // 推送类型:分享视频类型枚举
  263 + enum ShareVideoType {
  264 + None = -1, // -1无分享无视频
  265 + Share = 0, // 0分享
  266 + ShareAysnc = 1, // 1异步分享
  267 + ShareIntegral = 5, // 5分享积分
  268 + Video = 2, // 2看视频
  269 + VideoToShare = 3, // 3无视频则分享
  270 + VideoAndShare = 4 // 4视频和分享(控制分享和视频两个按钮的显示) ,
  271 + }
  272 + ```
  273 +
  274 + 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。
  275 +
  276 + ```javascript
  277 + // DiamondDoublePopwin.ts文件
  278 + export default class DiamondDoublePopwin extends BaseView{
  279 + protected addEvent() {
  280 + super.addEvent();
  281 + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用)
  282 + this.btnFree.on(Laya.Event.CLICK, this, this.onReward);
  283 + // 分享双倍
  284 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward);
  285 + // 视频双倍
  286 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward);
  287 + }
  288 +
  289 + protected removeEvent() {
  290 + super.removeEvent();
  291 + this.btnFree.off(Laya.Event.CLICK, this, this.onReward);
  292 + this.btnShare.off(Laya.Event.CLICK, this, this.onReward);
  293 + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward);
  294 + }
  295 +
  296 + // 每次打开此popwin执行onOpen
  297 + protected onOpen(){
  298 + super.onOpen();
  299 + this.iniitRewardUI();
  300 + }
  301 +
  302 + // 初始化/更新获得奖励按钮ui
  303 + private initRewardUI() {
  304 + let shareVideoType: ShareVideoType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString());
  305 + switch (shareVideoType) {
  306 + case ShareVideoType.Share: // 同步分享
  307 + case ShareVideoType.ShareAysnc: // 异步分享
  308 + case ShareVideoType.ShareIntegral: // 分享积分
  309 + this.btnFree.visible = false;
  310 + this.btnShare.visible = true;
  311 + this.btnVideo.visible = false;
  312 + break;
  313 +
  314 + case ShareVideoType.Video: // 推送视频
  315 + case ShareVideoType.VideoToShare: // 无视频则分享
  316 + // 视频ui状态
  317 + this.btnFree.visible = false;
  318 + this.btnShare.visible = false;
  319 + this.btnVideo.visible = true;
  320 + break;
  321 +
  322 + default: // 无视频和无分享
  323 + // 既不显示分享ui又不显示视频ui,直接领奖ui状态
  324 + this.btnFree.visible = true;
  325 + this.btnShare.visible = false;
  326 + this.btnVideo.visible = false;
  327 + break;
  328 + }
  329 + }
  330 +
  331 + // 领取奖励操作
  332 + private onReward(){
  333 + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), {
  334 + success: this.handleReward,
  335 + fail: this.handleError,
  336 + context: this
  337 + } );
  338 + }
  339 +
  340 + // 分享/视频成功后回调处理函数:发奖励
  341 + private handleReward(from: ShareVideoFrom, ret: any | null){
  342 + // 分享成功、视频成功、无视频无分享
  343 + }
  344 +
  345 + // 分享/视频失败后回调处理函数:弹出提示
  346 + private handleError(from: ShareVideoFrom, error: any | null){
  347 + // 返回错误,处理错误msg信息,自定义处理
  348 + if( error ){
  349 + wx.showToast({
  350 + title: error.msg
  351 + });
  352 + }
  353 + }
  354 + }
  355 +
  356 + // Enums.ts文件
  357 + // 分享视频类型(与后台一一对应)
  358 + export enum ShareVideoType {
  359 + None = -1, // -1无分享无视频
  360 + Share = 0, // 0同步分享
  361 + ShareAysnc = 1, // 1异步分享
  362 + ShareIntegral = 5, // 5分享积分
  363 + Video = 2, // 2看视频
  364 + VideoToShare = 3, // 3无视频则分享
  365 + VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示)
  366 + }
  367 +
  368 + // 分享视频key枚举,每个key表示一个功能点
  369 + enum ShareVideoKeys {
  370 + // 钻石双倍获取
  371 + DiamondDouble = 'diamond_double',
  372 + // 失败获得双倍奖励
  373 + FailRewardDouble = 'fail_reward_double'
  374 + }
  375 +
  376 + // 分享视频功能点最终推送类型
  377 + enum ShareVideoFrom{
  378 + None = 0, // 无视频无分享
  379 + Share = 1, // 分享
  380 + ShareAsync = 2, // 异步分享
  381 + Video = 3, // 看视频
  382 + }
  383 +
  384 + ```
  385 + <div id="detail"></div>
  386 + 下面演示dispatch和getShareVideoType两个api的完整使用,Laya引擎开发:
  387 +
  388 + 页面功能点按钮做三个状态:
  389 +
  390 + 1、看视频状态(显示视频icon)
  391 +
  392 + 2、分享状态(显示分享icon)
  393 +
  394 + 3、直接领奖(没有icon,审核状态)
  395 +
  396 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_1.png "🔍点击查看大图")
  397 +
  398 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_2.png "🔍点击查看大图")
  399 +
  400 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_3.png "🔍点击查看大图")
  401 +
  402 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_4.png "🔍点击查看大图")
  403 +
  404 + 例如,一个领取钻石双倍,页面的按钮ui通过下面的方式进行切换
  405 +
  406 + 1、页面做三个按钮:视频icon按钮、分享icon按钮、直接领取按钮
  407 +
  408 + 2、进入页面根据配置的key获取类型,显示对应类型ui:调用下面的initRewardUI(可随意命名)
  409 +
  410 + 3、<font color="#FF0000">分享或者视频后,SDK会发送一个tactic.update的消息过来,使用PCSDK.event.add注册监听,PCSDK.event.remove移除监听(PCSDK.event详细了解请查看[事件模块](event.md)),监听事件处理下一次推送显示ui状态:执行一下initRewardUI。</font>
  411 +
  412 + 4、给三个按钮都注册事件:onReward
  413 + ```javascript
  414 + // DiamondDoublePopwin.ts文件
  415 + export default class DiamondDoublePopwin extends BaseView {
  416 + protected addEvent() {
  417 + super.addEvent();
  418 + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用)
  419 + this.btnFree.on(Laya.Event.CLICK, this, this.onReward);
  420 + // 分享双倍
  421 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward);
  422 + // 视频双倍
  423 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward);
  424 + // PCSDK.event.add注册监听SDK发送的消息:tactic.update,更新获得奖励按钮ui
  425 + PCSDK.event.add('tactic.update', this.initRewardUI, this);
  426 + }
  427 +
  428 + protected removeEvent() {
  429 + super.removeEvent();
  430 + this.btnFree.off(Laya.Event.CLICK, this, this.onReward);
  431 + this.btnShare.off(Laya.Event.CLICK, this, this.onReward);
  432 + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward);
  433 + // PCSDK.event.remove移除监听SDK发送的消息:tactic.update
  434 + PCSDK.event.remove('tactic.update', this.initRewardUI, this);
  435 + }
  436 +
  437 + // 每次打开此popwin执行onOpen
  438 + protected onOpen(){
  439 + super.onOpen();
  440 + // 界面打开
  441 + this.initRewardUI();
  442 + }
  443 +
  444 + // 领取奖励操作
  445 + private onReward(){
  446 + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), {
  447 + success: this.handleReward,
  448 + context: this
  449 + } );
  450 + }
  451 +
  452 + // 分享/视频成功后回调处理函数:发奖励
  453 + private handleReward(from: ShareVideoFrom, ret: any | null){
  454 + // 分享成功、视频成功、无视频无分享
  455 + }
  456 +
  457 + // 分享/视频失败后回调处理函数:弹出提示
  458 + private handleError(from: ShareVideoFrom, error: any | null){
  459 + // 返回错误,处理错误msg信息,自定义处理
  460 + if( error ){
  461 + wx.showToast({
  462 + title: error.msg
  463 + });
  464 + }
  465 + }
  466 +
  467 + // 初始化/更新获得奖励按钮ui
  468 + private initRewardUI() {
  469 + let shareVideoType: ShareType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString());
  470 + switch (shareVideoType) {
  471 + case ShareVideoType.Share: // 同步分享
  472 + case ShareVideoType.ShareAysnc: // 异步分享
  473 + case ShareVideoType.ShareIntegral: // 分享积分
  474 + // 分享ui状态
  475 + this.stat_share.play(0,false);
  476 + // 等同于
  477 + // this.btnFree.visible = false;
  478 + // this.btnShare.visible = true;
  479 + // this.btnVideo.visible = false;
  480 + break;
  481 +
  482 + case ShareVideoType.Video: // 视频
  483 + case ShareVideoType.VideoToShare: // 无视频则分享
  484 + // 视频ui状态
  485 + this.stat_video.play(0,false);
  486 + // 等同于
  487 + // this.btnFree.visible = false;
  488 + // this.btnShare.visible = false;
  489 + // this.btnVideo.visible = true;
  490 + break;
  491 +
  492 + default: // 无视频和无分享
  493 + // 既不显示分享ui又不显示视频ui,直接领奖ui状态
  494 + this.stat_free.play(0,false);
  495 + // 等同于
  496 + // this.btnFree.visible = true;
  497 + // this.btnShare.visible = false;
  498 + // this.btnVideo.visible = false;
  499 + break;
  500 + }
  501 + }
  502 + }
  503 +
  504 + // Enums.ts文件
  505 + // 分享视频类型(与后台一一对应)
  506 + export enum ShareVideoType {
  507 + None = -1, // -1无分享无视频
  508 + Share = 0, // 0同步分享
  509 + ShareAysnc = 1, // 1异步分享
  510 + ShareIntegral = 5, // 5分享积分
  511 + Video = 2, // 2看视频
  512 + VideoToShare = 3, // 3无视频则分享
  513 + VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示)
  514 + }
  515 +
  516 + // 分享视频key枚举,每个key表示一个功能点
  517 + enum ShareVideoKeys {
  518 + // 钻石双倍获取
  519 + DiamondDouble = 'diamond_double',
  520 + // 失败获得双倍奖励
  521 + FailRewardDouble = 'fail_reward_double'
  522 + }
  523 +
  524 + // 分享视频功能点最终推送类型
  525 + enum ShareVideoFrom{
  526 + None = 0, // 无视频无分享
  527 + Share = 1, // 分享
  528 + ShareAsync = 2, // 异步分享
  529 + Video = 3, // 看视频
  530 + }
  531 + ```
  532 +
  533 +
  534 +
  535 +#### **终章:**
  536 +
  537 +这个模块的内容点比较多,接入的注意事项也比较多,望接入者细度使用说明和理解示例意图。
  538 +
  539 +<font color="#FF0000">噗嗤游戏的小伙伴在开发公司内部游戏中使用此模块,简单封装了SDK分享视频模块的几个通用方法,提供开发者参考,</font>**[点击下载](https://dep.miso-lab.com/sdkword/tools/sdk-share-tools-1.0.0.zip)**。
... ...
inner/stat.md 0 → 100644
... ... @@ -0,0 +1,255 @@
  1 +# 启动注册打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。
  8 +
  9 +
  10 +
  11 +#### **后台使用**
  12 +
  13 +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息:
  14 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png)
  15 +
  16 +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息:
  17 +
  18 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png)
  19 +
  20 +
  21 +
  22 +
  23 +
  24 +#### **接入API:**
  25 +
  26 +| **名称** | **功能说明** |
  27 +| ------------------------ | ------------------------------------------------------------ |
  28 +| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 |
  29 +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) |
  30 +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 |
  31 +
  32 +
  33 +
  34 +接入流程图:
  35 +
  36 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png)
  37 +
  38 +1. **setLoginInfo**
  39 + <div id="stat_login"></div>
  40 + ```javascript
  41 + PCSDK.stat.setLoginInfo( data: object ): void
  42 + ```
  43 +
  44 + 定义:游戏成功登录到服务器,获取到openId和用户信息:<font color="#FF0000">openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息</font>
  45 +
  46 + 参数:
  47 +
  48 + ```javascript
  49 + data: object
  50 +{
  51 + openId: string 必传,openId
  52 + regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒)
  53 + }
  54 + ```
  55 + 返回值:
  56 +
  57 + ```javascript
  58 + 无
  59 + ```
  60 +
  61 + 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。
  62 + 该示例,只是模拟使用环境。
  63 +
  64 + ```javascript
  65 + // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。
  66 + Api.login().then( data => {
  67 + let { user_openid, user_reg_time } = data;
  68 + PCSDK.stat.setLogind({
  69 + openId: user_openid, // openId
  70 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  71 + });
  72 + });
  73 + ```
  74 +
  75 +2. **loadingFinish**
  76 +
  77 + ```javascript
  78 + PCSDK.stat.loadingFinish(): Promise<any>
  79 + ```
  80 +
  81 + 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成)
  82 +
  83 + 参数:
  84 +
  85 + ```
  86 + 无
  87 + ```
  88 + 返回值:
  89 +
  90 + ```javascript
  91 + Promise<any>
  92 + Promise resolve 加载打点成功完成回调
  93 + ```
  94 +
  95 + 示例:
  96 +
  97 + ```javascript
  98 + private async initEnv() {
  99 + await SDKTools.env(Const.VERSION);
  100 + this.loadRes();
  101 + this.loadLogin();
  102 + }
  103 +
  104 + // 开始加载资源
  105 + private loadRes() {
  106 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  107 + }
  108 +
  109 + // 资源加载完成
  110 + private onLoadedMain() {
  111 + // 打点:loadingFinish
  112 + PCSDK.stat.loadingFinish();
  113 + }
  114 +
  115 + // 更新资源加载进度条
  116 + private onProgressMain(ret) {
  117 + let progress = ret.data;
  118 + this.skin.txtProgress.text = Math.floor(progress * 100) + '%';
  119 + }
  120 + ```
  121 +
  122 +3. **active**
  123 +
  124 + ```javascript
  125 + PCSDK.stat.active(): void
  126 + ```
  127 +
  128 + 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式:
  129 + 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。
  130 +
  131 + 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。
  132 +
  133 + 参数:
  134 +
  135 + ```javascript
  136 + 无
  137 + ```
  138 + 返回值:
  139 +
  140 + ```javascript
  141 + void
  142 + 无
  143 + ```
  144 +
  145 + 示例:
  146 +
  147 + ```javascript
  148 + // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active
  149 + // 资源加载loading界面
  150 + class LoadingScene(){
  151 + constructor(){
  152 + // 登录
  153 + this.login();
  154 + // 加载资源
  155 + this.loadResouce();
  156 + }
  157 +
  158 + /**
  159 + * 登录
  160 + */
  161 + private login(){
  162 + Api.login().then( data => {
  163 + let { user_openid, user_reg_time } = data;
  164 + // 打点:设置用户信息
  165 + PCSDK.stat.setLoginInfo({
  166 + openId: user_openid, // openId
  167 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  168 + });
  169 + });
  170 + }
  171 +
  172 + /**
  173 + * 加载资源
  174 + */
  175 + private loadResouce(){
  176 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  177 + }
  178 +
  179 + /**
  180 + * 加载资源完成回调监听
  181 + */
  182 + private onLoadedMain(){
  183 + // 打点:加载资源完成
  184 + PCSDK.stat.loadingFinish().then( () => {
  185 + // 打点:用户活跃注册打点
  186 + PCSDK.stat.active();
  187 +
  188 + // 进入home主页场景
  189 + SceneManager.I.switchScene(HomeScene);
  190 + });
  191 + }
  192 + }
  193 +
  194 + // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。
  195 + // 资源加载loading界面
  196 + class LoadingScene(){
  197 + constructor(){
  198 + // 登录
  199 + this.login();
  200 + // 加载资源
  201 + this.loadResouce();
  202 + }
  203 +
  204 + /**
  205 + * 登录
  206 + */
  207 + private login(){
  208 + Api.login().then( data => {
  209 + let { user_openid, user_reg_time } = data;
  210 + // 打点:设置用户信息
  211 + PCSDK.stat.setLoginInfo({
  212 + openId: user_openid, // openId
  213 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  214 + });
  215 + });
  216 + }
  217 +
  218 + /**
  219 + * 加载资源
  220 + */
  221 + private loadResouce(){
  222 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  223 + }
  224 +
  225 + /**
  226 + * 加载资源完成回调监听
  227 + */
  228 + private onLoadedMain(){
  229 + // 打点:加载资源完成
  230 + PCSDK.stat.loadingFinish().then( () => {
  231 + // 进入home主页场景
  232 + SceneManager.I.switchScene(HomeScene);
  233 + });
  234 + }
  235 + }
  236 +
  237 + // Home页面
  238 + class HomeScene(){
  239 + constructor(){
  240 + this.btnStarGame.on('click', this.onGame, this);
  241 + }
  242 +
  243 + /**
  244 + * 按钮点击开始游戏
  245 + */
  246 + private onGame(){
  247 + // 打点:用户活跃注册打点
  248 + PCSDK.stat.active();
  249 +
  250 + // 进入游戏页面
  251 + SceneManager.I.switchScene(GameScene);
  252 + }
  253 + }
  254 +
  255 + ```
0 256 \ No newline at end of file
... ...
inner/stat_active.md 0 → 100644
... ... @@ -0,0 +1,255 @@
  1 +# 启动注册打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。
  8 +
  9 +
  10 +
  11 +#### **后台使用**
  12 +
  13 +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息:
  14 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png)
  15 +
  16 +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息:
  17 +
  18 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png)
  19 +
  20 +
  21 +
  22 +
  23 +
  24 +#### **接入API:**
  25 +
  26 +| **名称** | **功能说明** |
  27 +| ------------------------ | ------------------------------------------------------------ |
  28 +| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 |
  29 +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) |
  30 +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 |
  31 +
  32 +
  33 +
  34 +接入流程图:
  35 +
  36 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png)
  37 +
  38 +1. **setLoginInfo**
  39 + <div id="stat_login"></div>
  40 + ```javascript
  41 + PCSDK.stat.setLoginInfo( data: object ): void
  42 + ```
  43 +
  44 + 定义:游戏成功登录到服务器,获取到openId和用户信息:<font color="#FF0000">openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息</font>
  45 +
  46 + 参数:
  47 +
  48 + ```javascript
  49 + data: object
  50 +{
  51 + openId: string 必传,openId
  52 + regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒)
  53 + }
  54 + ```
  55 + 返回值:
  56 +
  57 + ```javascript
  58 + 无
  59 + ```
  60 +
  61 + 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。
  62 + 该示例,只是模拟使用环境。
  63 +
  64 + ```javascript
  65 + // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。
  66 + Api.login().then( data => {
  67 + let { user_openid, user_reg_time } = data;
  68 + PCSDK.stat.setLogind({
  69 + openId: user_openid, // openId
  70 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  71 + });
  72 + });
  73 + ```
  74 +
  75 +2. **loadingFinish**
  76 +
  77 + ```javascript
  78 + PCSDK.stat.loadingFinish(): Promise<any>
  79 + ```
  80 +
  81 + 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成)
  82 +
  83 + 参数:
  84 +
  85 + ```
  86 + 无
  87 + ```
  88 + 返回值:
  89 +
  90 + ```javascript
  91 + Promise<any>
  92 + Promise resolve 加载打点成功完成回调
  93 + ```
  94 +
  95 + 示例:
  96 +
  97 + ```javascript
  98 + private async initEnv() {
  99 + await SDKTools.env(Const.VERSION);
  100 + this.loadRes();
  101 + this.loadLogin();
  102 + }
  103 +
  104 + // 开始加载资源
  105 + private loadRes() {
  106 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  107 + }
  108 +
  109 + // 资源加载完成
  110 + private onLoadedMain() {
  111 + // 打点:loadingFinish
  112 + PCSDK.stat.loadingFinish();
  113 + }
  114 +
  115 + // 更新资源加载进度条
  116 + private onProgressMain(ret) {
  117 + let progress = ret.data;
  118 + this.skin.txtProgress.text = Math.floor(progress * 100) + '%';
  119 + }
  120 + ```
  121 +
  122 +3. **active**
  123 +
  124 + ```javascript
  125 + PCSDK.stat.active(): void
  126 + ```
  127 +
  128 + 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式:
  129 + 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。
  130 +
  131 + 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。
  132 +
  133 + 参数:
  134 +
  135 + ```javascript
  136 + 无
  137 + ```
  138 + 返回值:
  139 +
  140 + ```javascript
  141 + void
  142 + 无
  143 + ```
  144 +
  145 + 示例:
  146 +
  147 + ```javascript
  148 + // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active
  149 + // 资源加载loading界面
  150 + class LoadingScene(){
  151 + constructor(){
  152 + // 登录
  153 + this.login();
  154 + // 加载资源
  155 + this.loadResouce();
  156 + }
  157 +
  158 + /**
  159 + * 登录
  160 + */
  161 + private login(){
  162 + Api.login().then( data => {
  163 + let { user_openid, user_reg_time } = data;
  164 + // 打点:设置用户信息
  165 + PCSDK.stat.setLoginInfo({
  166 + openId: user_openid, // openId
  167 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  168 + });
  169 + });
  170 + }
  171 +
  172 + /**
  173 + * 加载资源
  174 + */
  175 + private loadResouce(){
  176 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  177 + }
  178 +
  179 + /**
  180 + * 加载资源完成回调监听
  181 + */
  182 + private onLoadedMain(){
  183 + // 打点:加载资源完成
  184 + PCSDK.stat.loadingFinish().then( () => {
  185 + // 打点:用户活跃注册打点
  186 + PCSDK.stat.active();
  187 +
  188 + // 进入home主页场景
  189 + SceneManager.I.switchScene(HomeScene);
  190 + });
  191 + }
  192 + }
  193 +
  194 + // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。
  195 + // 资源加载loading界面
  196 + class LoadingScene(){
  197 + constructor(){
  198 + // 登录
  199 + this.login();
  200 + // 加载资源
  201 + this.loadResouce();
  202 + }
  203 +
  204 + /**
  205 + * 登录
  206 + */
  207 + private login(){
  208 + Api.login().then( data => {
  209 + let { user_openid, user_reg_time } = data;
  210 + // 打点:设置用户信息
  211 + PCSDK.stat.setLoginInfo({
  212 + openId: user_openid, // openId
  213 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  214 + });
  215 + });
  216 + }
  217 +
  218 + /**
  219 + * 加载资源
  220 + */
  221 + private loadResouce(){
  222 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  223 + }
  224 +
  225 + /**
  226 + * 加载资源完成回调监听
  227 + */
  228 + private onLoadedMain(){
  229 + // 打点:加载资源完成
  230 + PCSDK.stat.loadingFinish().then( () => {
  231 + // 进入home主页场景
  232 + SceneManager.I.switchScene(HomeScene);
  233 + });
  234 + }
  235 + }
  236 +
  237 + // Home页面
  238 + class HomeScene(){
  239 + constructor(){
  240 + this.btnStarGame.on('click', this.onGame, this);
  241 + }
  242 +
  243 + /**
  244 + * 按钮点击开始游戏
  245 + */
  246 + private onGame(){
  247 + // 打点:用户活跃注册打点
  248 + PCSDK.stat.active();
  249 +
  250 + // 进入游戏页面
  251 + SceneManager.I.switchScene(GameScene);
  252 + }
  253 + }
  254 +
  255 + ```
0 256 \ No newline at end of file
... ...
inner/stat_ads.md
... ... @@ -6,19 +6,19 @@
6 6  
7 7 交叉推广位是在游戏中展示其他游戏,用户点击某个游戏跳转进入游戏,达到共享用户的目的。
8 8  
9   -噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析阅览
  9 +噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析查看
10 10  
11   -**3种广告类型:交叉悬浮广告框、交叉抽屉式广告位、交叉猜你喜欢广告位**
  11 +**3种广告类型:悬浮框交叉推广位、抽屉式交叉推广位、猜你喜欢交叉推广位,对应类型值为:40、70、50**
12 12  
13   -1. 交叉悬浮广告框,放置到首页、结算页
  13 +1. 悬浮框交叉推广位,推荐位置:首页、结算页
14 14  
15 15 ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_013.png "🔍点击查看大图")
16 16  
17   -2. 交叉抽屉式广告位,放置到首页、结算页
  17 +2. 抽屉式交叉推广位,推荐位置:首页、结算页
18 18  
19 19 ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_014.png "🔍点击查看大图")
20 20  
21   -3. 交叉猜你喜欢广告位,推荐放置到结算页
  21 +3. 猜你喜欢交叉推广位,推荐位置:结算页
22 22  
23 23 ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_015.png "🔍点击查看大图")
24 24  
... ... @@ -38,7 +38,9 @@
38 38  
39 39 - 由于微信对每个游戏可跳转其他游戏有10个限制,可跳转的其它游戏需要在小游戏根目录下的全局配置文件game.json中进行添加配置:navigateToMiniProgramAppIdList,该参数定义请详读[小程序全局配置](https://developers.weixin.qq.com/minigame/dev/reference/configuration/app.html)。
40 40  
41   -- 噗嗤游戏为了方便开发者接入调试交叉推广位,【后台测试服】已经配置测试使用的不同类型推广位,并提供以下10个测试服广告位appid:
  41 +- **接入3种交叉推广位后,为了防止微信审核被拒(被拒理由:微信认定游戏跳转到其他游戏太多,判断游戏是一个游戏盒子,拒绝审核通过),为了防范被拒,在[数据模块](data.md)提供了三个数据获取api:PCSDK.data.IsCross、PCSDK.data.IsDrawer、PCSDK.data.IsGuessLike,控制3种推广位广告的显示隐藏,开发者在游戏中对三种广告控制显示隐藏状态。[详请请阅读数据api](data.md#ad_cross)。**
  42 +
  43 +- 噗嗤游戏为了方便开发者接入调试交叉推广位,后台已经配置测试使用的3种类型推广位,提供以下10个推广位appid,开发者复制下面的navigateToMiniProgramAppIdList json数据,配置到game.json的navigateToMiniProgramAppIdList参数:
42 44  
43 45 水果爆破 :"wx26822126b4d99eda",
44 46  
... ... @@ -75,33 +77,18 @@
75 77 ]
76 78 ```
77 79  
78   -
79   -
80   -- 完成下面的操作步骤,即可拉取交叉推广位:
81   -
82   - 1、开发者复制上面的10个其他游戏的appid,配置到game.json的navigateToMiniProgramAppIdList参数:
83   -
84 80 ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_010.png "🔍点击查看大图")
85 81  
86   - 2、修改[config.js的Env配置](install.md#config_env)为110,开发者测试联调阶段,走测试环境
87   -
88   - > 提示:广告位接入完毕测试通过,提交审核前,修改Env为100。
89 82  
90   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_011.png "🔍点击查看大图")
91   -
92 83  
93 84  
94 85 #### **接入API:**
95 86  
96 87 | **名称** | **功能说明** |
97 88 | --------------------------- | ------------------------------------------------------------ |
98   -| PCSDK.stat.bannerList | 根据类型获取对应类型交叉广告列表,目前SDK支持3种类型:40(交叉悬浮广告框)、70(交叉抽屉式广告位)、50(交叉猜你喜欢广告位) |
  89 +| PCSDK.stat.bannerList | 根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型:40(悬浮框交叉推广位)、70(抽屉式交叉推广位)、50(猜你喜欢交叉推广位) |
99 90 | PCSDK.stat.bannerNavigateTo | 交叉推广位点击跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram) |
100   -| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK在onHide时候上报数据到后台 |
101   -
102   -
103   -
104   -
  91 +| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK内部会在onHide时候上报数据到后台 |
105 92  
106 93  
107 94  
... ... @@ -111,7 +98,7 @@
111 98 PCSDK.stat.loadingFinish(banner_type): Promise<any>
112 99 ```
113 100  
114   - 定义:根据类型获取对应类型交叉广告列表,目前SDK支持3种类型
  101 + 定义:根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型
115 102  
116 103 参数:
117 104  
... ... @@ -203,7 +190,7 @@
203 190 */
204 191 export default class TestBannerSample {
205 192 constructor() {
206   - // 示例:加载交叉悬浮广告框
  193 + // 示例:加载悬浮框交叉推广位
207 194 this.loadBannerList(BannerType.TYPE_CROSS)
208 195 .then((dataList: Array<BannerData>) => {
209 196 // 渲染广告位数据
... ... @@ -247,9 +234,9 @@
247 234  
248 235 // 广告位类型的枚举
249 236 enum BannerType {
250   - TYPE_CROSS = 40, // 交叉悬浮广告框
251   - TYPE_LIKE = 50, // 交叉猜你喜欢广告位
252   - TYPE_LIST = 70, // 交叉抽屉广告位
  237 + TYPE_CROSS = 40, // 悬浮框交叉推广位
  238 + TYPE_LIKE = 50, // 猜你喜欢交叉推广位
  239 + TYPE_LIST = 70, // 抽屉式交叉推广位
253 240 }
254 241  
255 242 /*
... ... @@ -288,7 +275,7 @@
288 275 }
289 276 ```
290 277  
291   - 示例:获取猜你喜欢推广位,以列表的形式显示在界面上,点击任意一项游戏跳转其他游戏
  278 + 示例:获取猜你喜欢交叉推广位,以列表的形式显示在界面上,点击任意一项游戏跳转其他游戏
292 279  
293 280 ```javascript
294 281 // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息
... ... @@ -314,7 +301,7 @@
314 301 this.list.renderHandler = new Laya.Handler(this, this.renderAdItem);
315 302 this.boxList.addChild(this.list);
316 303  
317   - // 示例:加载猜你喜欢广告位数据列表
  304 + // 示例:加载猜你喜欢交叉推广位数据列表
318 305 this.loadBannerList(BannerType.TYPE_LIKE)
319 306 .then((dataList: Array<BannerData>) => {
320 307 this.renderAdLikeList(dataList);
... ... @@ -385,9 +372,9 @@
385 372  
386 373 // 广告位类型的枚举
387 374 enum BannerType {
388   - TYPE_CROSS = 40, // 交叉悬浮广告框
389   - TYPE_LIKE = 50, // 交叉猜你喜欢广告位
390   - TYPE_LIST = 70, // 交叉抽屉广告位
  375 + TYPE_CROSS = 40, // 悬浮框交叉推广位
  376 + TYPE_LIKE = 50, // 猜你喜欢交叉推广位
  377 + TYPE_LIST = 70, // 抽屉式交叉推广位
391 378 }
392 379  
393 380 /*
... ... @@ -424,11 +411,11 @@
424 411  
425 412 > 提示:
426 413 >
427   - > 展示猜你喜欢/抽屉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。
  414 + > 展示猜你喜欢/抽屉式交叉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。
428 415 >
429   - > 展示交叉悬浮框推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api
  416 + > 展示悬浮框交叉推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api
430 417  
431   - 示例:根据交叉悬浮框类型调用PCSDK.stat.bannnerList接口获取交叉悬浮框推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。
  418 + 示例:根据悬浮框交叉推广位类型调用PCSDK.stat.bannnerList接口获取悬浮框交叉推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。
432 419 ```javascript
433 420 /**
434 421 * 演示交叉推广位使用示例
... ... @@ -445,7 +432,7 @@ export default class TestBannerSample extends ui.ads.ADbtnUI {
445 432 this.on(Laya.Event.CLICK, this, this.onJumpGame);
446 433 }
447 434  
448   - // 初始化显示交叉悬浮框广告
  435 + // 初始化显示悬浮框交叉推广
449 436 init(isFirst: boolean) {
450 437 isFirst && (this.count = 0);
451 438 this.anim_entice.play(0, true);
... ... @@ -456,7 +443,7 @@ export default class TestBannerSample extends ui.ads.ADbtnUI {
456 443 this.refresh();
457 444 }
458 445  
459   - // 清理交叉悬浮框广告
  446 + // 清理悬浮框交叉推广
460 447 clear() {
461 448 this.anim_entice.gotoAndStop(0);
462 449 this.anim_entice.removeLabel('refresh');
... ... @@ -536,8 +523,8 @@ export default class TestBannerSample extends ui.ads.ADbtnUI {
536 523  
537 524 // 广告位类型的枚举
538 525 enum BannerType {
539   - TYPE_CROSS = 40, // 交叉悬浮广告框
540   - TYPE_LIKE = 50, // 交叉猜你喜欢广告位
541   - TYPE_LIST = 70, // 交叉抽屉广告位
  526 + TYPE_CROSS = 40, // 悬浮框交叉推广位
  527 + TYPE_LIKE = 50, // 猜你喜欢交叉推广位
  528 + TYPE_LIST = 70, // 抽屉式交叉推广位
542 529 }
543 530 ```
544 531 \ No newline at end of file
... ...
inner/stat_event.md 0 → 100644
... ... @@ -0,0 +1,153 @@
  1 +# 自定义事件打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +自定义事件是噗嗤游戏为开发者提供的自助分析功能:事件触发去重人数、次数等信息。游戏的任意位置需要统计触达人数、次数等都可以使用事件来实现,后台提供分析数据可查看,并不局限于用户的行为事件。
  8 +
  9 +#### **后台使用**
  10 +
  11 +接入自定义事件打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】可查看自定义事件次数、去重人数等详细信息(此功能需要管理员添加权限):
  12 +
  13 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_018.png "🔍点击查看大图")
  14 +
  15 +
  16 +
  17 +#### **接入必读**
  18 +
  19 +接入自定义事件打点前,请[前往后台](https://data.d3games.com/index.html#/login)进行添加自定义事件的key:登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】->点击【新增】添加自定义事件(事件key可语义化的自定义,推荐_连接)。
  20 +
  21 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_016.png "🔍点击查看大图")
  22 +
  23 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_017.png "🔍点击查看大图")
  24 +
  25 +> 提示:游戏新增自定义事件如果很多,一个个复制可能比较繁琐,进入噗嗤后台【事件列表】后,chrome浏览器打开【开发者工具】,在console栏下方输入下面的命令后,可自动生成自定义事件key的枚举(如果事件很多出现翻页,则每一页都执行后,手动合并为一个枚举),复制到项目中使用,枚举key生成规则为事件key转换为大驼峰式,枚举value为事件key:
  26 +
  27 +```javascript
  28 +// 第1个参数表示生成枚举的名字:EventKeys
  29 +// 第2个参数表示事件key所在列索引(第2列):1
  30 +// 第3个参数表示事件key注释所在列索引(第3列):2
  31 +// 最后一个参数选填,any传递false表示枚举字符串不带any转换
  32 +PCPlugins.transform('EventKeys', 1 , 2 , { any: false});
  33 +```
  34 +
  35 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_019.png "🔍点击查看大图")
  36 +
  37 +
  38 +
  39 +示例:使用PCPlugins.transform('EventKeys', 1 , 2 , { any: false}); 生成的自定义事件key枚举
  40 +
  41 +```javascript
  42 +enum EventKeys {
  43 + // 关卡7进入,
  44 + Level7Enter = 'level7_enter',
  45 + // 关卡6进入,
  46 + Level6Enter = 'level6_enter',
  47 + // 关卡5进入,
  48 + Level5Enter = 'level5_enter',
  49 + // 关卡4进入,
  50 + Level4Enter = 'level4_enter',
  51 + // 关卡3进入,
  52 + Level3Enter = 'level3_enter',
  53 + // 关卡2进入,
  54 + Level2Enter = 'level2_enter',
  55 + // 关卡1进入,
  56 + Level1Enter = 'level1_enter',
  57 + // 关卡失败双倍奖励,
  58 + MapFailDouble = 'map_fail_double',
  59 + // 引导10-主界面再次进入游戏,
  60 + Guide109 = 'guide_109',
  61 + // 引导9-合成确认,
  62 + Guide108 = 'guide_108',
  63 + // 引导8-合成成功后,
  64 + Guide107 = 'guide_107',
  65 + // 引导7-合成,
  66 + Guide106 = 'guide_106',
  67 + // 引导6-第二次购买,
  68 + Guide105 = 'guide_105',
  69 + // 引导5-第一次购买,
  70 + Guide104 = 'guide_104',
  71 + // 引导4-结算引导,
  72 + Guide103 = 'guide_103',
  73 + // 引导3-开始射击,
  74 + Guide102 = 'guide_102',
  75 + // 引导2-开始游戏,
  76 + Guide101 = 'guide_101',
  77 + // 引导1-欢迎,
  78 + Guide100 = 'guide_100',
  79 + // 金币加速,关闭,
  80 + SpeedUpClose = 'speed_up_close',
  81 + // 金币加速,免费领取,
  82 + SpeedUpFree = 'speed_up_free'
  83 +}
  84 +```
  85 +
  86 +
  87 +
  88 +
  89 +
  90 +#### **接入API**:
  91 +
  92 +| **名称** | **功能说明** |
  93 +| ---------------- | ------------------------------------------------------------ |
  94 +| PCSDK.stat.event | 自定义事件打点,使用前请[前往后台](https://data.d3games.com/index.html#/login)进行添加自定义事件key |
  95 +
  96 +
  97 +
  98 +1. **event**
  99 +
  100 + ```javascript
  101 + PCSDK.stat.event(event_key: string , event_source: string , opts?: { ext_val?: string | number} ): Promise<any>
  102 + ```
  103 +
  104 + 定义:自定义事件打点,可在游戏任何位置定义事件打点
  105 +
  106 + 参数:
  107 +
  108 + ```
  109 + event_key: string 必传,后台配置的事件key
  110 +
  111 + event_source: string 必传,触发该事件所在页面位置,例如:结算页面、排行榜界面、签到页面。。。
  112 +
  113 + opts?: object 选传,自定义扩展参数,一些特定的事件想传递更多信息,此参数使用请咨询相关对接人员目前只支持对象一个key(evt_val),多个扩展参数使用'|'连接
  114 + {
  115 + ext_val: '100|1000'
  116 + }
  117 + ```
  118 + 示例:
  119 +
  120 + ```javascript
  121 + // 签到功能
  122 + private onSign() {
  123 + // 事件上报:签到页面打开
  124 + PCSDK.stat.event(EventKeys.FunctionSign, '主界面');
  125 + PopwinMananger.I.openWin(SignPopwin);
  126 + }
  127 +
  128 + // 开始加载资源
  129 + private loadRes() {
  130 + // 事件上报:开始加载资源
  131 + PCSDK.stat.event(EventKeys.LoadingExhibition, '加载界面');
  132 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  133 + }
  134 +
  135 + // 升级领奖
  136 + private onReward(e: Laya.Event) {
  137 + // 事件上报:发起升级领奖
  138 + PCSDK.stat.event(EventKeys.LvUpRewards, '升级界面');
  139 + SDKTools.shareDispatch(ShareKey.LevelUpDiamond, {
  140 + success: this.handleDoubleReward,
  141 + context: this
  142 + });
  143 + }
  144 +
  145 + export enum EventKeys {
  146 + // 升级奖励,
  147 + LvUpRewards = 'lv_up_rewards',
  148 + // 点击主界面-签到,
  149 + FunctionSign = 'function_sign',
  150 + // 加载,
  151 + LoadingExhibition = 'loading_exhibition'
  152 + }
  153 + ```
... ...
inner/stat_level.md 0 → 100644
... ... @@ -0,0 +1,297 @@
  1 +# 关卡分析打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +关卡分析,为开发者提供小游戏详细的关卡数据,分析各关卡玩家的通关状况,帮助开发者从数据角度衡量游戏设计的合理性,调节难易度,观察各关卡道具使用情况和奖励获取状况,对比分析各个指标,通过量化玩家数据,提高游戏体验。
  8 +
  9 +#### **后台使用**
  10 +
  11 +接入关卡分析接口后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【关卡分析】可查看关卡进入用户数据、失败次数、失败率、平均完成时间等):
  12 +
  13 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_020.png "🔍点击查看大图")
  14 +
  15 +
  16 +
  17 +#### **接入API**:
  18 +
  19 +| **名称** | **功能说明** |
  20 +| ---------------- | ------------------------------------------------------------ |
  21 +| PCSDK.stat.logLevelRelive | 游戏关卡复活上报 |
  22 +| PCSDK.stat.logLevelHide | 游戏关卡onHide上报,在游戏界面注册wx.onHide事件,判断不属于复活、失败、成功状态下上报此数据 |
  23 +| PCSDK.stat.logLevelFail | 游戏关卡失败上报 |
  24 +| PCSDK.stat.logLevelWin | 游戏关卡成功上报 |
  25 +| PCSDK.stat.logMerge | 游戏二合一合成最高等级上报 |
  26 +
  27 +
  28 +
  29 +1. #### **logLevelRelive**
  30 +
  31 + ```javascript
  32 + PCSDK.stat.logLevelRelive(levelId: string | number , params?: { attr?: number, ext?: any } ): void
  33 + ```
  34 +
  35 + 定义:关卡复活成功数据上报
  36 +
  37 + 参数:
  38 +
  39 + ```
  40 + levelId: string | number 必传,游戏关卡id
  41 +
  42 + params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext
  43 + {
  44 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
  45 + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
  46 + }
  47 + ```
  48 +
  49 + [点此查看完整示例](stat_level.md#sample)如何添加关卡复活成功打点代码
  50 +
  51 +2. #### **logLevelHide**
  52 +
  53 + ```javascript
  54 + PCSDK.stat.logLevelHide(levelId: string | number , params?: { attr?: number, ext?: any } ): void
  55 + ```
  56 + 定义:监听游戏战斗界面onHide时上报关卡的数据。什么是界面onHide?[请详读微信小游戏wx.onHide](https://developers.weixin.qq.com/minigame/dev/api/base/app/life-cycle/wx.onHide.html)
  57 + 注意事项:
  58 +
  59 + > <font color="red">1)游戏战斗界面监听平台的onHide事件,使用此api上报关卡onHide打点。</font>
  60 + >
  61 + >
  62 +
  63 + > <font color="red">2)游戏战斗界面退出后,要移除onHide事件监听,避免在其他界面下,onHide时候执行此次上报。</font>
  64 + >
  65 + >
  66 +
  67 + > <font color="red">3)一定要屏蔽游戏复活中、游戏失败、游戏通过成功状态,这三种状态下避免上报此打点,详看下面示例。</font>
  68 +
  69 + 参数:
  70 +
  71 + ```
  72 + levelId: string | number 必传,游戏关卡id
  73 +
  74 + params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext
  75 + {
  76 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
  77 + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
  78 + }
  79 + ```
  80 + [点此查看完整示例](stat_level.md#sample)如何添加关卡onHide打点代码
  81 +
  82 +3. #### **logLevelFail**
  83 +
  84 + ```javascript
  85 + PCSDK.stat.logLevelFail(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void
  86 + ```
  87 +
  88 + 定义:关卡失败数据上报
  89 +
  90 + 参数:
  91 +
  92 + ```
  93 + levelId: string | number 必传,游戏关卡id
  94 +
  95 + params: object 必传,关卡需要的其他参数
  96 + {
  97 + ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒
  98 + first: number 必传 是否第一次体验关卡,1是,0否
  99 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
  100 + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
  101 + }
  102 + ```
  103 + [点此查看完整示例](stat_level.md#sample)如何添加关卡失败打点代码
  104 +
  105 +4. #### **logLevelWin**
  106 +
  107 + ```javascript
  108 + PCSDK.stat.logLevelWin(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void
  109 + ```
  110 +
  111 + 定义:关卡成功通关数据上报
  112 +
  113 + 参数:
  114 +
  115 + ```
  116 + levelId: string | number 必传,游戏关卡id
  117 +
  118 + params: object 必传,关卡需要的其他参数
  119 + {
  120 + ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒
  121 + first: number 必传 是否第一次体验关卡,1是,0否
  122 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
  123 + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
  124 + }
  125 + ```
  126 + <div id="sample"></div> 完整示例,以上四个接口使用场景:
  127 +> SDK中监听了onHide事件,当游戏onHide时,SDK会发送事件名为'app.hide'的自定义事件,开发者可在代码中使用PCSDK.event.bindEvent监听该事件,使用PCSDK.event.removeEvent移除对应监听事件,[详细文档event模块文档请阅读event事件模块](evennt.md)。
  128 +
  129 + ```javascript
  130 + /**
  131 + * 游戏界面
  132 + **/
  133 + exports class GameScene extends BaseView{
  134 + // 关卡id
  135 + private missionId: number;
  136 + // 当前选中使用的枪支等级
  137 + private currSelectGun: number;
  138 + // 游戏状态机
  139 + private gameState: GameState;
  140 + // 关卡开始时间
  141 + private enterTime: number;
  142 +
  143 + constructor(){
  144 + this.gameState = GameState.Idle;
  145 + }
  146 +
  147 + // 游戏界面打开
  148 + open(){
  149 + super.open();
  150 + this.gameState = GameState.Idle;
  151 + this.enterTime = new Date().getTime();
  152 + this.addEvent();
  153 + }
  154 +
  155 + // 游戏界面关闭
  156 + close(){
  157 + super.close();
  158 + this.removeEvent();
  159 + }
  160 +
  161 + // 添加游戏事件监听
  162 + private addEvent(){
  163 + // 监听SDK中app.hide事件事件消息
  164 + PCSDK.event.bindEvent( 'app.hide', this.handleHide, this);
  165 + // 监听游戏中level.relive事件消息
  166 + EventCenter.I.add('level.relive', this, this.handleLevelRelive);
  167 + }
  168 +
  169 + // 移除游戏事件监听
  170 + private removeEvent(){
  171 + PCSDK.event.removeEvent( 'app.hide', this.handleHide, this);
  172 + EventCenter.I.remove('level.relive', this, this.handleLevelRelive);
  173 + }
  174 +
  175 + // 游戏复活中
  176 + private doGameRelive(){
  177 + this.setState(GameState.Relive);
  178 + }
  179 +
  180 + // 游戏通关失败
  181 + private doGameFail(){
  182 + this.setState(GameState.Fail);
  183 + }
  184 +
  185 + // 游戏通关成功
  186 + private doGameWin(){
  187 + this.setState(GameState.Win);
  188 + }
  189 +
  190 + // SDK发出的app.hide事件监听
  191 + private handleHide() {
  192 + // 战斗界面onHide上报logLevelHide(游戏通关成功、游戏通关失败、游戏复活中不进行上报logLevelHide打点)
  193 + if(!(this.isState(GameState.Win) || this.isState(GameState.Fail) || this.isState(GameState.Relive)))
  194 + PCSDK.stat.logLevelHide(this.missionId, {
  195 + attr: this.currSelectGun
  196 + });
  197 + }
  198 +
  199 + // 监听关卡复活成功消息
  200 + private handleLevelRelive(){
  201 + // 关卡复活成功上报
  202 + PCSDK.stat.logLevelRelive(this.missionId, {
  203 + attr: this.currSelectGun
  204 + });
  205 + }
  206 +
  207 + private isState(state: GameState) {
  208 + return this.state === state;
  209 + }
  210 +
  211 + // 设置状态机
  212 + private setState(state: GameState) {
  213 + if (this.isState(state)) return;
  214 +
  215 + this.state = state;
  216 + let costTime: number; // 关卡消耗时间
  217 + let failNum: number; // 关卡失败次数
  218 + switch (state) {
  219 + case GameState.Win: // 处理成功
  220 + // 关卡成功上报
  221 + costTime = new Date().getTime() - this.enterTime;
  222 + failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId);
  223 + PCSDK.stat.logLevelWin(this.missionId, {
  224 + ctime: costTime,
  225 + first: failNum ? 0 : 1,
  226 + attr: this.currSelectGun,
  227 + ext: {
  228 + currHp: 100000
  229 + }
  230 + });
  231 + break;
  232 +
  233 + case GameState.Fail: // 处理失败
  234 + // 关卡失败上报
  235 + costTime = new Date().getTime() - this.enterTime;
  236 + failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId);
  237 + PCSDK.stat.logLevelFail(this.missionId, {
  238 + ctime: costTime,
  239 + first: failNum ? 0 : 1,
  240 + attr: this.currSelectGun
  241 + });
  242 + break;
  243 +
  244 + case GameState.Relive:// 处理复活中
  245 + // 弹出复活操作界面
  246 + PopWinManager.I.openPopwin(RelivePopwinn);
  247 + break;
  248 + }
  249 + }
  250 + }
  251 +
  252 + /**
  253 + * 复活界面
  254 + **/
  255 + exports class RelivePopwinn extends BaseView{
  256 + // 复活界面关闭
  257 + close(){
  258 + super.close();
  259 + // 关闭模拟:复活成功,发送复活成功消息
  260 + EventCenter.I.emit('level.relive');
  261 + }
  262 + }
  263 +
  264 + // 游戏状态状态机
  265 + enum GameState{
  266 + Idle, // 初始状态
  267 + Fail, // 失败状态
  268 + Win, // 成功通关状态
  269 + Relive // 正在复活状态
  270 + }
  271 + ```
  272 +
  273 +5. #### **logMerge**
  274 +
  275 + ```javascript
  276 + PCSDK.stat.logMerge(mergeLv: number): void
  277 + ```
  278 +
  279 + 定义:游戏二合一合成最高等级上报
  280 +
  281 + 参数:
  282 +
  283 + ```
  284 + mergeLv: number 必传,二合一合成最高等级
  285 + ```
  286 +
  287 + 示例:二合一部分,合成最高等级时候上报
  288 +
  289 + ```javascript
  290 + // 合成最新等级合成
  291 + private handleMergeLastestLv(lastestLv: number){
  292 + // 合成最新等级上报
  293 + PCSDK.stat.logMerge( lastestLv );
  294 + }
  295 + ```
  296 +
  297 +
0 298 \ No newline at end of file
... ...
inner/stat_pay.md 0 → 100644
... ... @@ -0,0 +1,112 @@
  1 +# 支付结果打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +支付上报,是开发者使用米大师或者第三方其他支付(比如H5支付),支付回调后把支付结果(失败支付、成功支付、取消支付)上报到后台。
  8 +
  9 +#### **注意事项**
  10 +
  11 +{% em %} 使用api,需在[config.js中配置MidasPay](install.md#configJs)信息。 {% endem %}
  12 +
  13 +**MidasPay( object )配置:**米大师虚拟支付配置,请注意下面规则
  14 +
  15 + OfferId:在米大师申请的应用id,没有接入米大师,默认为"0"
  16 +
  17 + ZoneId:分区ID,默认:"1"
  18 +
  19 + Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game"
  20 +
  21 + CurrencyType:币种,默认:"CNY"
  22 +
  23 + Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。
  24 +
  25 + 1)接入了米大师,填写"android"(ios暂时没有开放)
  26 +
  27 + 2)未接入米大师,使用其他支付,如果只支持android,则填写"android";
  28 +
  29 + 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios";
  30 +
  31 + 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios
  32 +
  33 +
  34 +
  35 +#### **接入API:**
  36 +
  37 +| **名称** | **功能说明** |
  38 +| ------------------------ | ------------------------------------------------------------ |
  39 +| PCSDK.stat.logPay | 开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付) |
  40 +
  41 +
  42 +1. **logPay**
  43 +
  44 + ```javascript
  45 + PCSDK.stat.logPay( params: object ): void
  46 + ```
  47 +
  48 + 定义:开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付)。该api需在[config.js中配置MidasPay](install.md#configJs)信息。
  49 +
  50 + 参数:
  51 +
  52 + ```
  53 + params object 必传 打点参数
  54 + {
  55 + type: number 必传 支付类型:0(支付失败),1(支付成功),-1(取消支付);
  56 + source: string 必传 游戏服务商生成的订单号,没有则为空字符串
  57 + amount: number 必传 实际支付金额,单位分
  58 + buy_id: string | number; 必传 商品ID
  59 + buy_name: string; 必传 商品名称
  60 + item_info: string 必传 获得的道具内容:道具id及数量,逗号分隔,多项使用分号分隔 => 1,1;2,10;3,100
  61 + }
  62 + ```
  63 + 返回值:
  64 +
  65 + ```
  66 + void
  67 + 无
  68 + ```
  69 +
  70 + 示例:客户端游戏支付完成后上报支付打点,下例只是演示logPay用法
  71 +
  72 + ```javascript
  73 + private reqPay() {
  74 + // 模拟的支付,开发者需更加实际接入支付
  75 + Api.I.pay().then( ret => {
  76 + switch(ret.code){
  77 + case 1: // 支付成功回调处理
  78 + PCSDK.stat.logPay({
  79 + type: 1, // 成功支付
  80 + source: "10000400", // 订单号,没有则为空字符串
  81 + amount: 10 * 100, // 10元
  82 + buy_id: 58, // 支付的商品id
  83 + buy_name: "钻石*152,金币*188888888",
  84 + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90
  85 + });
  86 + break;
  87 +
  88 + case 0: // 支付失败回调处理
  89 + PCSDK.stat.logPay({
  90 + type: 0, // 失败支付
  91 + source: "10000400", // 订单号,没有则为空字符串
  92 + amount: 10 * 100, // 10元
  93 + buy_id: 58, // 支付的商品id
  94 + buy_name: "钻石*152,金币*188888888",
  95 + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90
  96 + });
  97 + break;
  98 +
  99 + case -1: // 支付取消回调处理
  100 + PCSDK.stat.logPay({
  101 + type: -1, // 取消支付
  102 + source: "10000400", // 订单号,没有则为空字符串
  103 + amount: 10 * 100, // 10元
  104 + buy_id: 58, // 支付的商品id
  105 + buy_name: "钻石*152,金币*188888888",
  106 + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90
  107 + });
  108 + break;
  109 + }
  110 + });
  111 + }
  112 + ```
0 113 \ No newline at end of file
... ...
inner/styles/website.css 0 → 100644
... ... @@ -0,0 +1,68 @@
  1 +/* CSS for website */
  2 +h1 , h2{
  3 + border-bottom: 1px solid #EFEAEA;
  4 + padding-bottom: 3px;
  5 +}
  6 +.markdown-section>:first-child {
  7 + margin-top: 0!important;
  8 +}
  9 +.page-wrapper {
  10 + margin-top: -1.275em;
  11 +}
  12 +.book .book-body .page-wrapper .page-inner section.normal {
  13 + min-height:350px;
  14 + margin-bottom: 30px;
  15 +}
  16 +
  17 +.book .book-body .page-wrapper .page-inner section.normal hr {
  18 + height: 0px;
  19 + padding: 0;
  20 + margin: 1.7em 0;
  21 + overflow: hidden;
  22 + background-color: #e7e7e7;
  23 + border-bottom: 1px dotted #e7e7e7;
  24 +}
  25 +
  26 +.video-js {
  27 + width:100%;
  28 + height: 100%;
  29 +}
  30 +
  31 +pre[class*="language-"] {
  32 + border: none;
  33 + background-color: #f7f7f7;
  34 + /* font-size: 1em; */
  35 + line-height: 1.2em;
  36 +}
  37 +
  38 +.book .book-body .page-wrapper .page-inner section.normal {
  39 + font-size: 16px;
  40 + font-family: "ubuntu", "Tahoma", "Microsoft YaHei", arial, sans-serif;
  41 +}
  42 +
  43 +.aceCode {
  44 + font-size: 14px !important;
  45 +}
  46 +
  47 +input[type=checkbox]{
  48 + margin-left: -2em;
  49 +}
  50 +
  51 +.page-footer span{
  52 + font-size: 12px;
  53 +}
  54 +
  55 +.page-footer .copyright {
  56 + float: left;
  57 +}
  58 +
  59 +.body, html {
  60 + overflow-y: hidden;
  61 +}
  62 +
  63 +.versions-select select {
  64 + height: 2em;
  65 + line-height: 2em;
  66 + border-radius: 4px;
  67 + background: #efefef;
  68 +}
... ...
install.md
... ... @@ -1,218 +0,0 @@
1   -# 安装步骤
2   -
3   -------
4   -
5   -## SDK下载
6   -
7   -1. 下载最新版本的SDK [SDK下载](download.md) 。
8   -2. 解压下载的sdk-in-v{版本号}.zip包,解压文件夹里面的的目录结构:
9   -
10   -```
11   -├── sdk.d.ts
12   -├── sdk/
13   -| ├── config.js
14   -| └── entry.js
15   -| └── libs/
16   - | └── game.min.js
17   -```
18   -
19   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_001.png "🔍点击查看大图")
20   -
21   -- **sdk.d.ts:sdk的ts声明文件,开发者项目采用Typescript开发,请复制该文件到项目中。**
22   -- sdk/config.js:sdk配置文件,【[详细请阅读下方config.js参数说明](install.md#config)】
23   -- sdk/entry.js:sdk入口文件,引入了sdk所提供的模块功能
24   -- sdk/libs/game.min.js:sdk类库核心代码文件
25   -
26   -
27   -
28   -## 配置合法域名
29   -
30   -* ##### 管理员或开发者身份在微信小程序后台→设置→开发者设置中添加 request、download合法域名
31   - 正式环境 request 合法域名:
32   -
33   - https://dataapi.d3games.com (统计平台正式服域名)
34   -
35   - cdn资源请求合法域名:
36   -
37   - https://dep.miso-lab.com (>>>request、download均要添加<<<)
38   -
39   -
40   -
41   -
42   -
43   -​
44   -## SDK配置步骤
45   -
46   -* #### 将下载下来的sdk压缩包,解压后,拷贝sdk文件夹到微信开发者工具项目中。
47   -
48   - 示例:将sdk放入到小游戏开发者工具项目的src文件夹中
49   -
50   - ![引入目录](https://dep.miso-lab.com/sdkword/sdk_002.png "🔍点击查看大图")
51   -
52   -
53   -
54   -
55   -
56   -* #### 在game.js中将sdk.js文件使用require导入。
57   -
58   - 示例:将sdk放入到小游戏开发者工具项目的src文件夹中
59   - ![引入目录](https://dep.miso-lab.com/sdkword/sdk_003.png "🔍点击查看大图")
60   -
61   -
62   -
63   -* #### 根据运营提供的信息修改sdk文件夹下的**config**.js文件(可横向拖动查看查看更多====>)<div id="config"></div>
64   -<div id="configJs"></div>
65   - ```javascript
66   - export default {
67   - IsDebug: false, // 是否debug模式,debug模式会打印log,可使用stat模块setDebug api进行修改
68   - AdCacheDuration: 30, // 广告列表缓存持续时间间隔
69   - IsUseShareModule: true, // 是否使用分享模块
70   - IsOnlineAutoUse: true, // 是否开启sdk自动请求online模块(在线参数配置)的updateOnlineConfig,拉取在线参数配置
71   - IsOnlineDebug: true, // 是否开启online模块(配置参数模块)debug模式
72   - ShareRightKey: 'forward', // 右上角分享的shareKey,shareKey请阅读share模块说明,默认为forward,为空字符串则不使用右上角分享
73   -
74   - ShareData: { // 必填,默认分享数据(拉取不到分享配置后使用,默认分享,SDK自动分配share_id为99999)
75   - share_desc: 'xxx',
76   - share_wxad_id: '', // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享
77   - share_icon: 'xxx'
78   - },
79   - GameId: 0, // 必填,游戏ID,运营提供;
80   - ChannelId: 0, // 必填,游戏渠道ID,运营提供;
81   - IntegralChannelId: 0, // 必填,积分投放渠道ID,运营提供;
82   - Secret: '***请配置你的Secret***', // 必填,游戏的secret key
83   - MidasPay: { // 米大师虚拟支付配置
84   - OfferId: "0", // 在米大师申请的应用id
85   - ZoneId: "1", // 分区ID,默认:1
86   - Mode: "game", // 支付的类型,不同的支付类型有各自额外要传的附加参数,默认:game
87   - CurrencyType: "CNY", // 币种,默认:CNY
88   - Platform: '' // 申请接入时的平台,platform与OfferId(米大师申请的应用id)有关,详情请阅读文档config.js参数MidasPay下的Platform配置
89   - }
90   - };
91   -```
92   -
93   -
94   -参数详解:
95   -
96   -<div id="config_env"></div>
97   -2. **IsDebug ( boolean ):**是否debug模式,debug模式会打印sdk中的console.log/error/warn log。
98   -
99   - false:关闭log打印,提审前建议设置为false,不打印log信息
100   -
101   - true:开启log打印,如遇到联调问题,可设置为true,发体验版本或者查看log发给相关人员进行查看解决问题
102   -
103   - 也可在代码中动态设置:PCSDK.stat.setDebug( boolean )
104   -
105   -3. **AdCacheDuration(number):**表示获取广告位列表的缓存时间,例如:配置30,SDK中拉取交叉推广位列表后缓存30秒。此参数对接入交叉推广位模块后有效,没有接入可不修改,使用默认值。
106   -
107   -4. **IsUseShareModule( boolean ):**是否启用sdk分享/视频功能(sdk把分享和视频封装为share模块,登录后台->【游戏数据】->【配置相关】->【分享/视频配置】后可对分享视频进行动态配置)
108   -
109   - false:SDK启动时不拉取分享/视频列表,不接入分享/视频模块功能
110   -
111   - true:SDK启动时拉取后台配置的分享/视频列表,运营或者开发者登录后台后,配置分享/视频,开发者请详看分享视频模块接入。
112   -
113   -5. **IsOnlineAutoUse( boolean ):**是否启用在线配置参数模块功能
114   -
115   - false:两种处理 1)不启用在线配置参数模块功能; 2)启用在线配置参数功能,但是SDK启动时不自动调用updateOnlineConfig拉取后台配置参数列表,开发者在代码主动调用拉取在线配置参数:PCSDK.online.updateOnlineConfig();
116   -
117   - 示例:开发者代码中主动拉取在线配置参数。
118   -
119   - ```javascript
120   - // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关
121   - PCSDK.online.updateOnlineConfig().then(() => {
122   - // 获取是否后台动态配置开启插屏广告,1为开启,0为关闭
123   - let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
124   - // isInterstitialAd && '显示插屏广告';
125   - // 获取动态多个广告位开启的配置
126   - let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
127   - // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位';
128   - // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位';
129   - // pcGameOpenMap.Cross === 1 && '显示交叉推广位';
130   - });
131   - ```
132   - true:sdk启动时自动调用updateOnlineConfig拉取后台在线配置参数列表,开发者可通过
133   -
134   - PCSDK.online.getParamsObj、PCSDK.online.getParamsInt、PCSDK.online.getParamsString、PCSDK.online.getParams api传递后台配置参数key获取在线配置参数。
135   -
136   - 示例:IsOnlineAutoUse: true,开发者可使用下面api获取在线配置参数配置的值
137   -
138   - ```javascript
139   - let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
140   - let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
141   - ```
142   -
143   -6. **IsOnlineDebug( boolean ):**是否启用online模块(在线配置参数)debug模式,建议设置为true。
144   -
145   - false:不启动debug模式,开发者主动调用updateOnlineConfig或者SDK启动时调用updateOnlineConfig都会把在线配置参数列表设置10分钟缓存,不用每次都去服务器请求,参照了友盟在线参数功能的设计
146   -
147   - true: 开启debug模式,只要是请求updateOnlineConfig api都会立即发起请求,而不是去检测读取缓存
148   -
149   -7. **ShareRightKey( string ):**右上角分享的shareKey,shareKey请阅读分享视频模块,默认为forward,为空字符串则不使用右上角分享,此配置在配置【IsUseShareModule: true】情况下生效。
150   -
151   - 示例:
152   -
153   - 在后台的【分享/视频配置】栏目配置了一条分享key为:forward的分享配置
154   -
155   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_004.png "🔍点击查看大图")
156   -
157   -8. **ShareData( object ):**此配置在【IsUseShareModule: true】起效,开发者如果接入了分享视频模块,>>> 请务必配置一条 <<<。
158   -
159   - > IsUseShareModule设置true sdk启动拉取分享视频配置列表,如果分享视频列表拉取请求失败,或此shareKey不在分享视频配置列表中(登录后台 ->【游戏数据】->【分享/视频配置】栏没有配置分享key)就会使用此条设置的数据。
160   -
161   - 示例:可从后台【游戏数据】->【分享/视频配置】中选取一条:复制文案,点击分享素材icon -> 查看大图 -> 右键查看分享图片的html源码复制src图片地址:
162   -
163   - ```json
164   - {
165   - // 分享文案内容
166   - share_desc: ' 半夜传来啪啪啪!竟是隔壁老王偷偷打气球',
167   - // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享
168   - share_wxad_id: 'adunit-6958dcfc3f0bed31',
169   - // 分享图
170   - share_icon: 'https://dep.miso-lab.com/data_analysis/games/res/5D57D4A3Yx.png'
171   - }
172   - ```
173   -
174   - 操作步骤:
175   -
176   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_005.png "🔍点击查看大图")
177   -
178   -9. **GameId:必填,游戏id,请联系运营人员提供**
179   -
180   -10. **ChannelId:必填,游戏渠道id,请联系运营人员提供**
181   -
182   -11. **IntegralChannelId:必填,积分投放渠道ID,运营提供**
183   -
184   -12. **Secret:必填,游戏 Secret Key,请联系运营人员提供**
185   -
186   -13. **MidasPay( object ):**米大师虚拟支付配置,请注意下面规则
187   -
188   - OfferId:在米大师申请的应用id,没有接入米大师(比如第三方支付),默认为"0"
189   -
190   - ZoneId:分区ID,默认:"1"
191   -
192   - Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game"
193   -
194   - CurrencyType:币种,默认:"CNY"
195   -
196   - Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。
197   -
198   - 1)接入了米大师,填写"android"(ios暂时没有开放)
199   -
200   - 2)未接入米大师,使用其他支付,如果只支持android,则填写"android";
201   -
202   - 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios";
203   -
204   - 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios
205   -
206   -
207   -
208   -* #### 如果项目使用Typescript语言开发,请引入解压文件夹下的sdk.d.ts文件到项目中。
209   -
210   - 示例:项目采用的是Laya Typescript版本进行开发,将该文件复制到libs目录下面
211   -
212   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_007.png "🔍点击查看大图")
213   -
214   -* #### 到此,SDK的准备工作已经配置完毕,运行起来:
215   -
216   - 运行中碰到问题,[[请查看FAQ](faq.md)],或者微信群联系相关人员。
217   -
218   - 正常运行,阅读SDK手册,开始[[SDK模块功能](modules.md)]接入。
219 0 \ No newline at end of file
... ... @@ -1,56 +0,0 @@
1   -# 噗嗤SDK
2   -PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。
3   -PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。
4   -
5   -**PCSDK提供的模块功能:**
6   -
7   -- [统计模块](stat.md)
8   -- [分享视频模块](share.md)
9   -- [配置参数模块️](online.md)
10   -- [多平台接口模块](platform.md)
11   -- [数据模块](data.md)
12   -- [事件模块](event.md)
13   -
14   -
15   -
16   -# 噗嗤管理后台
17   -噗嗤管理后台对sdk中上报的各项数据进行分析,管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。
18   -
19   -噗嗤管理后台地址:
20   -
21   -- https://data.d3games.com/#/login
22   -
23   -**友情提示:**
24   -
25   -- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。**
26   -- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。**
27   -- **登录后台即可使用后台提供的各项服务**
28   -
29   -
30   -
31   -**后台概览:**
32   -## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图")
33   -
34   -
35   -
36   -**后台提供数据分析功能(不能跳转请联系管理员添加权限):**
37   -
38   -- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart)
39   -- [分享数据分析](https://data.d3games.com/index.html#/share_exact)
40   -- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list)
41   -- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list)
42   -
43   -
44   -
45   -**后台提供配置相关功能(不能跳转请联系管理员添加权限):**
46   -
47   -- [分享/视频配置](https://data.d3games.com/index.html#/share_list)
48   -- [配置参数](https://data.d3games.com/index.html#/config_list)
49   -
50   -
51   -# 更多:
52   -- 快速接入,请详读 [安装步骤](install.md)
53   -
54   -
55   -
56   -- 遇到问题可以查看 [FAQ](faq.md)
57 0 \ No newline at end of file
modules.md
... ... @@ -1,87 +0,0 @@
1   -# 模块概览
2   -下图是PCSDK的概要思维导图,SDK所提供的所有功能都在下图列出<font color="red">(点击查看大图)</font>:
3   -
4   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_000.png "🔍点击查看大图")
5   -
6   -
7   -[统计模块:stat](stat.md)
8   -
9   - 启动注册打点
10   -
11   - setLoginInfo:设置登录信息
12   -
13   - loadingFinish:资源加载完成
14   -
15   - active:添加注册活跃用户
16   -
17   - 关卡分析打点
18   -
19   - logLevelRelive:游戏关卡复活上报
20   -
21   - logLevelHide:游戏关卡页onHide上报
22   -
23   - logLevelFail:游戏关卡失败上报
24   -
25   - logLevelWin:游戏关卡成功上报
26   -
27   - logMerge:游戏2合1合成最高等级上报
28   -
29   - 交叉推广位:悬浮框、抽屉式、猜你喜欢
30   -
31   - bannerList:获取对应类型交叉推广位列表
32   -
33   - bannerNavigateTo:点击跳转到对应appid的游戏
34   -
35   - addExposure:交叉推广位一条或者多条广告展示,添加曝光数据
36   -
37   - 自定义事件
38   -
39   - event:自定义打点事件
40   -
41   -[数据模块:data](data.md)
42   -
43   - GameId:获取游戏的GameId,来源于config.js配置的GameId
44   -
45   - ChannelId:获取游戏渠道ID,来源于config.js配置的ChannelId
46   -
47   - UserId:获取用户ID,来源于setLoginInfo传递的openId的值
48   -
49   - RegTime:获取用户注册时间,来源于setLoginInfo传递的regTime的值
50   -
51   - ShareId:获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0。需接shareVideo模块
52   -
53   - ShareKey:接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key
54   -
55   - Platform:获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备)
56   -
57   - SystemId:获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备)
58   -
59   - QueryUserInviteUid:获取此次分享会话进入游戏,分享来源者用户ID,来源query的参数invite_user_uid
60   -
61   - IsCross:获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏
62   -
63   - IsDrawer:获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏
64   -
65   - IsGuessLike:获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏
66   -
67   -[配置参数模块:online](online.md)
68   -
69   - updateOnlineConfig:拉取后台配置的配置参数数据,可代码中手动调用,也可SDK自动拉取
70   -
71   - getParamsInt:根据在线参数key获取number类型参数值
72   -
73   - getParamsObj:根据在线参数key获取object类型参数值
74   -
75   - getParamsString:根据在线参数key获取string类型参数值
76   -
77   -事件模块:event
78   -
79   -多平台接口模块:platform
80   -
81   -[分享视频模块:shareVideo](share.md)
82   -
83   - share:普通分享,不需要处理回调的场景
84   -
85   - dispatch:分享视频分发入口,传入功能点英文命名的分享/视频key
86   -
87   - getShareVideoType:根据功能点在后台配置的分享/视频key,得到此功能点分享开关
online.md
... ... @@ -1,165 +0,0 @@
1   -
2   -# 配置参数模块
3   -
4   -------
5   -
6   -#### **简介**
7   -
8   -在线配置参数是噗嗤游戏开放的一个新模块功能,可以让开发者在后台【配置参数】栏中动态修改游戏使用的参数值。例如:动态修改游戏的数值,小到一个简单开关0/1切换、一个简单的数字配置;大到一个游戏json配置等。
9   -
10   -该模块借鉴了[友盟在线配置参数](http://www.it610.com/article/4896789.htm)的设计思路。
11   -
12   -
13   -
14   -#### **后台使用**
15   -
16   -设置在线配置参数,登录后台->头部tab切换到【游戏数据】->【配置相关】->【配置参数】可新增、编辑修改参数值,配置完毕后,通过online模块相关的api使用:
17   -
18   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_021.png "🔍点击查看大图")
19   -
20   -
21   -
22   -#### **接入API:**
23   -
24   -| **名称** | **功能说明** |
25   -| ------------------------------- | ------------------------------------------------------------ |
26   -| PCSDK.online.updateOnlineConfig | 拉取后台配置的配置参数数据,可代码中手动调用,也可以通过config.js中配置SDK主动拉取,注意:使用前请详细[阅读config.js的IsOnlineAutoUse和IsOnlineDebug参数详解](install.md#config_env) |
27   -| PCSDK.online.getParamsInt | 根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数 |
28   -| PCSDK.online.getParamsObj | 根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象 |
29   -| PCSDK.online.getParamsString | 根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串 |
30   -
31   -
32   -
33   -1. ##### **updateOnlineConfig**
34   -
35   - ```javascript
36   - PCSDK.online.updateOnlineConfig(): Promise<any>
37   - ```
38   -
39   - 定义:拉取后台配置的配置参数数据,
40   -
41   - 提示:
42   -
43   - > [config.js中配置IsOnlineAutoUse](install.md#config_env)为true:SDK启动时会自动去拉取在线配置参数,开发者不需要调用此接口,不然会导致重复拉取
44   - >
45   - > [config.js中配置IsOnlineAutoUse](install.md#config_env)为false:有两种理解方式:1)不接入使用在线配置参数模块;2)接入使用在线配置参数模块,开发者自己手动调用updateOnlineConfig api处理逻辑。
46   - >
47   - > 下面示例会演示两种不同配置的使用范例:
48   -
49   - 参数:
50   -
51   - ```
52   - 无
53   - ```
54   -
55   - 返回值:
56   -
57   - ```
58   - Promise<any>
59   - ```
60   -
61   - <div id="sample"></div>
62   -
63   - 示例1:config.js配置IsOnlineAutoUse为false,开发者调用updateOnlineConfig api手动拉取在线配置参数数据
64   -
65   - ```javascript
66   - // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关
67   - PCSDK.online.updateOnlineConfig().then(() => {
68   - // 使用1:获取是否后台动态配置开启插屏广告,1为开启,0为关闭
69   - let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
70   - // isInterstitialAd && '显示插屏广告';
71   -
72   - // 使用2:获取动态多个广告位开启的配置
73   - let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
74   - // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位';
75   - // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位';
76   - // pcGameOpenMap.Cross === 1 && '显示交叉推广位';
77   -
78   - // 使用3:获取签到配置
79   - let signRewardCfg = PCSDK.online.getParamsObj('sign_reward_cfg', [100, 300, 500, 700, 900, 2000, 3000]);
80   -
81   - // 使用4:获取动态bannerUid
82   - let bannerUid = PCSDK.online.getParamsString('banner_common_uid', 'adunit-fe38438f074c717f');
83   - // bannerUid && '显示banner';
84   - });
85   - ```
86   -
87   - 示例2:config.js配置IsOnlineAutoUse为true,SDK启动时会自动调用 updateOnlineConfig api拉取在线配置参数数据
88   -
89   - ```javascript
90   - let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
91   - let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
92   - ```
93   -
94   -
95   -
96   -2. ##### **getParamsInt**
97   -
98   - ```javascript
99   - PCSDK.online.getParamsInt( key: string, defaultVal?: number ): number
100   - ```
101   -
102   - 定义:根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数
103   -
104   - 参数:
105   -
106   - ```javascript
107   - key: string 必传 后台 ->【配置参数】配置的key
108   - defaultVal: number 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值
109   - ```
110   -
111   - 返回值:
112   -
113   - ```
114   - number
115   - ```
116   -
117   - 示例:[查看上面的示例代码](online.md#sample)
118   -
119   -3. **getParamsObj**
120   -
121   - ```javascript
122   - PCSDK.online.getParamsObj( key: string, defaultVal?: any ): any
123   - ```
124   -
125   - 定义:根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象
126   -
127   - 参数:
128   -
129   - ```javascript
130   - key: string 必传 后台 ->【配置参数】配置的key
131   - defaultVal: any 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值
132   - ```
133   -
134   - 返回值:
135   -
136   - ```
137   - object | array | null
138   - ```
139   -
140   - 示例:[查看上面的示例代码](online.md#sample)
141   -
142   -1. **getParamsString**
143   -
144   - ```javascript
145   - PCSDK.online.getParamsString( key: string, defaultVal?: string ): string
146   - ```
147   -
148   - 定义:根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串
149   -
150   - 参数:
151   -
152   - ```javascript
153   - key: string 必传 后台 ->【配置参数】配置的key
154   - defaultVal: string 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值
155   - ```
156   -
157   - 返回值:
158   -
159   - ```
160   - string
161   - ```
162   -
163   - 示例:[查看上面的示例代码](online.md#sample)
164   -
165   -
166 0 \ No newline at end of file
outer/.gitignore 0 → 100644
... ... @@ -0,0 +1,64 @@
  1 +# Node rules:
  2 +## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
  3 +.grunt
  4 +
  5 +## Dependency directory
  6 +## Commenting this out is preferred by some people, see
  7 +## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git
  8 +node_modules
  9 +node_modules/
  10 +node_modules/**/*
  11 +
  12 +# Book build output
  13 +_book
  14 +
  15 +# eBook build output
  16 +*.epub
  17 +*.mobi
  18 +*.pdf
  19 +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion
  20 +
  21 +*.iml
  22 +
  23 +## Directory-based project format:
  24 +.idea/
  25 +# if you remove the above rule, at least ignore the following:
  26 +
  27 +# User-specific stuff:
  28 +# .idea/workspace.xml
  29 +# .idea/tasks.xml
  30 +# .idea/dictionaries
  31 +
  32 +# Sensitive or high-churn files:
  33 +# .idea/dataSources.ids
  34 +# .idea/dataSources.xml
  35 +# .idea/sqlDataSources.xml
  36 +# .idea/dynamic.xml
  37 +# .idea/uiDesigner.xml
  38 +
  39 +# Gradle:
  40 +# .idea/gradle.xml
  41 +# .idea/libraries
  42 +
  43 +# Mongo Explorer plugin:
  44 +# .idea/mongoSettings.xml
  45 +
  46 +## File-based project format:
  47 +*.ipr
  48 +*.iws
  49 +
  50 +## Plugin-specific files:
  51 +
  52 +# IntelliJ
  53 +/out/
  54 +
  55 +# mpeltonen/sbt-idea plugin
  56 +.idea_modules/
  57 +
  58 +# JIRA plugin
  59 +atlassian-ide-plugin.xml
  60 +
  61 +# Crashlytics plugin (for Android Studio and IntelliJ)
  62 +com_crashlytics_export_strings.xml
  63 +crashlytics.properties
  64 +crashlytics-build.properties
... ...
outer/README.md 0 → 100644
... ... @@ -0,0 +1,56 @@
  1 +# 噗嗤SDK
  2 +PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。
  3 +PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。
  4 +
  5 +**PCSDK提供的模块功能:**
  6 +
  7 +- [统计模块](stat.md)
  8 +- [分享视频模块](share.md)
  9 +- [配置参数模块️](online.md)
  10 +- [多平台接口模块](platform.md)
  11 +- [数据模块](data.md)
  12 +- [事件模块](event.md)
  13 +
  14 +
  15 +
  16 +# 噗嗤管理后台
  17 +噗嗤管理后台对sdk中上报的各项数据进行分析;管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。
  18 +
  19 +噗嗤管理后台地址:
  20 +
  21 +- https://data.d3games.com/#/login
  22 +
  23 +**友情提示:**
  24 +
  25 +- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。**
  26 +- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。**
  27 +- **登录后台即可使用后台提供的各项服务**
  28 +
  29 +
  30 +
  31 +**后台概览:**
  32 +## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图")
  33 +
  34 +
  35 +
  36 +**后台提供数据分析功能(不能跳转请联系管理员添加权限):**
  37 +
  38 +- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart)
  39 +- [分享数据分析](https://data.d3games.com/index.html#/share_exact)
  40 +- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list)
  41 +- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list)
  42 +
  43 +
  44 +
  45 +**后台提供配置相关功能(不能跳转请联系管理员添加权限):**
  46 +
  47 +- [分享/视频配置](https://data.d3games.com/index.html#/share_list)
  48 +- [配置参数](https://data.d3games.com/index.html#/config_list)
  49 +
  50 +
  51 +# 更多:
  52 +- 快速接入,请详读 [安装步骤](install.md)
  53 +
  54 +
  55 +
  56 +- 遇到问题可以查看 [FAQ](faq.md)
0 57 \ No newline at end of file
... ...
outer/SUMMARY.md 0 → 100644
... ... @@ -0,0 +1,28 @@
  1 +# Summary
  2 +## SDK入门
  3 +* [SDK简介](intro.md)
  4 +* [SDK下载](download.md)
  5 +* [安装步骤️️️️](install.md)
  6 +
  7 +## SDK手册
  8 +* [模块概览](modules.md)
  9 +
  10 +* [统计模块](stat.md)
  11 + * [启动注册打点️](stat_active.md)
  12 + * [关卡分析打点️️](stat_level.md)
  13 + * [支付结果打点](stat_pay.md)
  14 + * [自定义事件打点](stat_event.md)
  15 + * [交叉推广位](stat_ads.md)
  16 +* [分享视频模块](share.md)
  17 +* [配置参数模块️](online.md)
  18 +* [多平台接口模块](platform.md)
  19 + * [打开客服消息](platform.md#service)
  20 + * [检测自动更新](platform.md#checkUpdate)
  21 + * [复制文本内容](platform.md#copy)
  22 + * [震动接口](platform.md#vibrate)
  23 + * [小游戏推荐弹窗组件GamePortal](platform.md#gamePortal)
  24 + * [小游戏插屏广告组件InterstitialAd](platform.md#interstitialAd)
  25 + * [小游戏推荐icon组件GameIcon](platform.md#gameicon)
  26 +* [数据模块](data.md)
  27 +* [事件模块](event.md)
  28 +* [FAQ❎](faq.md)
0 29 \ No newline at end of file
... ...
outer/book.json 0 → 100644
... ... @@ -0,0 +1,69 @@
  1 +{
  2 + "title": "噗嗤游戏使用文档",
  3 + "description": "记录 GitBook 的配置和一些插件的使用",
  4 + "author": "zhangjikai",
  5 + "output.name": "site",
  6 + "language": "zh-hans",
  7 + "gitbook": "3.2.3",
  8 + "root": ".",
  9 + "plugins": [
  10 + "-lunr",
  11 + "-search",
  12 + "-sharing",
  13 + "-highlight",
  14 + "-livereload",
  15 + "emphasize",
  16 + "simple-page-toc@^0.1.1",
  17 + "prism",
  18 + "prism-themes",
  19 + "include-codeblock@^3.0.2",
  20 + "splitter@^0.0.8",
  21 + "tbfed-pagefooter@^0.0.1",
  22 + "expandable-chapters-small@^0.1.7",
  23 + "sectionx@^3.1.0",
  24 + "local-video@^1.0.1",
  25 + "anchor-navigation-ex",
  26 + "todo@^0.1.3",
  27 + "popup",
  28 + "lightbox",
  29 + "versions-select@^0.1.1",
  30 + "copy-code-button"
  31 + ],
  32 + "structure": {
  33 + "readme": "README.md"
  34 + },
  35 + "styles": {
  36 + "website": "styles/website.css"
  37 + },
  38 + "pluginsConfig": {
  39 + "versions": {
  40 + "options": [
  41 + {
  42 + "value": "http://dep.miso-lab.com/sdkword/web/v1.0/intro.html",
  43 + "text": "外部游戏-v1.0.0.3"
  44 + },
  45 + {
  46 + "value": "http://dep.miso-lab.com/sdkword/web/v2.0/intro.html",
  47 + "text": "内部游戏-v1.0.0.3"
  48 + }
  49 + ]
  50 + },
  51 + "prism": {
  52 + "css": [
  53 + "prism-themes/themes/prism-base16-ateliersulphurpool.light.css"
  54 + ]
  55 + },
  56 + "anchor-navigation-ex": {
  57 + "associatedWithSummary": false,
  58 + "showLevel": true,
  59 + "multipleH1": true,
  60 + "mode": "float",
  61 + "pageTop": {
  62 + "showLevelIcon": false,
  63 + "level1Icon": "fa fa-hand-o-right",
  64 + "level2Icon": "fa fa-hand-o-right",
  65 + "level3Icon": "fa fa-hand-o-right"
  66 + }
  67 + }
  68 + }
  69 +}
0 70 \ No newline at end of file
... ...
outer/data.md 0 → 100644
... ... @@ -0,0 +1,226 @@
  1 +
  2 +# 数据模块
  3 +
  4 +------
  5 +
  6 +#### **简介**
  7 +
  8 +此模块为开发者提供游戏用到的一些数据信息,例如:config.js配置的GameId,ChannelId、从分享链接进入query携带的参数(share_id/share_key/user_invite_uid/channel_id)、setLogind设置的用户ID(userId)和用户注册时间(regTime)等等,详细请阅读下面的api。
  9 +
  10 +
  11 +
  12 +#### **API:**
  13 +
  14 +| **名称** | **功能说明** |
  15 +| ------------------------------- | ------------------------------------------------------------ |
  16 +| PCSDK.data.GameId | 获取游戏的GameId,来源于config.js配置的GameId |
  17 +| PCSDK.data.ChannelId| 获取游戏渠道ID,来源于config.js配置的ChannelId |
  18 +| PCSDK.data.UserId | 获取用户ID,setLoginInfo传递的openId的值|
  19 +| PCSDK.data.RegTime | 获取用户注册时间,setLoginInfo传递的regTime的值 |
  20 +| PCSDK.data.ShareId | 获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0 |
  21 +| PCSDK.data.ShareKey | 接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key |
  22 +| PCSDK.data.Platform | 获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备) |
  23 +| PCSDK.data.SystemId | 获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备) |
  24 +| PCSDK.data.QueryUserInviteUid | 获取此次分享会话进入游戏,分享来源者用户ID |
  25 +| PCSDK.data.IsCross | 获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏 |
  26 +| PCSDK.data.IsDrawer | 获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏 |
  27 +| PCSDK.data.IsGuessLike | 获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏 |
  28 +
  29 +
  30 +
  31 +1. ##### **GameId**
  32 +
  33 + ```javascript
  34 + PCSDK.data.GameId: number
  35 + ```
  36 +
  37 + 定义:获取游戏的GameId,该值来源于congfig.js中的【GameId】配置。详细[阅读config.js的GameId参数详解](install.md#config_env)
  38 +
  39 + 示例:
  40 +
  41 + ```javascript
  42 + let gameId = PCSDK.data.GameId;
  43 + ```
  44 +2. ##### **ChannelId**
  45 +
  46 + ```javascript
  47 + PCSDK.data.ChannelId: number
  48 + ```
  49 +
  50 + 定义:获取游戏的渠道Id,该值来源于congfig.js中的【ChannelId】配置。详细[阅读config.js的ChannelId参数详解](install.md#config_env)
  51 +
  52 + 示例:
  53 +
  54 + ```javascript
  55 + let channelId = PCSDK.data.ChannelId;
  56 + ```
  57 +3. ##### **UserId**
  58 +
  59 + ```javascript
  60 + PCSDK.data.UserId: number | string
  61 + ```
  62 +
  63 + 定义:获取用户ID,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的openId
  64 +
  65 + 示例:
  66 +
  67 + ```javascript
  68 + let userId = PCSDK.data.UserId;
  69 + ```
  70 +4. ##### **RegTime**
  71 +
  72 + ```javascript
  73 + PCSDK.data.RegTime: number
  74 + ```
  75 +
  76 + 定义:获取用户第一次创角的时间戳,该值来源于[启动打点setLoginInfo](stat_active.md#stat_login)设置的regTime
  77 +
  78 + 示例:
  79 +
  80 + ```javascript
  81 + let regTime = PCSDK.data.RegTime;
  82 + ```
  83 +5. ##### **ShareId**
  84 +
  85 + ```javascript
  86 + PCSDK.data.ShareId: number
  87 + ```
  88 +
  89 + 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_id参数,从分享会话点入游戏,获取此次分享会话的shareId,不是从分享会话点入游戏ShareId为0
  90 +
  91 + 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入
  92 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍")
  93 +
  94 + ```javascript
  95 + // shareId的值为:680
  96 + let shareId = PCSDK.data.ShareId;
  97 + ```
  98 +6. ##### **ShareKey**
  99 +
  100 + ```javascript
  101 + PCSDK.data.ShareKey: string
  102 + ```
  103 +
  104 + 定义:接入SDK的分享视频模块,分享出去的链接query会携带share_key参数,从分享会话点入游戏,获取此次分享会话的shareKey,不是从分享会话点入游戏ShareKey为''
  105 +
  106 + 示例:成功结算奖励双倍分享,后台配置的信息:shareId: 680 shareKey: success_double,其他用户从此条分享进入
  107 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_022.png "点击查看大图🔍")
  108 +
  109 + ```javascript
  110 + // shareKey的值为:success_double
  111 + let shareKey = PCSDK.data.ShareKey;
  112 + ```
  113 +7. ##### **Platform**
  114 +
  115 + ```javascript
  116 + PCSDK.data.Platform: string
  117 + ```
  118 +
  119 + 定义:获取游戏运行平台环境:devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备)
  120 +
  121 + 示例:
  122 +
  123 + ```javascript
  124 + let platform = PCSDK.data.Platform;
  125 + switch (platform) {
  126 + case 'devtools': // 开发者工具
  127 +
  128 + break;
  129 +
  130 + case 'ios': // 苹果设备
  131 +
  132 + break;
  133 +
  134 + case 'android': // 安卓设备
  135 +
  136 + break;
  137 + }
  138 + ```
  139 +8. ##### **SystemId**
  140 +
  141 + ```javascript
  142 + PCSDK.data.SystemId: number
  143 + ```
  144 +
  145 + 定义:获取游戏运行平台环境:0(开发者调试工具或ios)、1(安卓设备)
  146 +
  147 + 示例:
  148 +
  149 + ```javascript
  150 + let systemId = PCSDK.data.SystemId;
  151 + switch (systemId) {
  152 + case 0: // 开发者工具 or 苹果设备
  153 +
  154 + break;
  155 +
  156 + case 1: // 安卓设备
  157 +
  158 + break;
  159 + }
  160 + ```
  161 +9. ##### **QueryUserInviteUid**
  162 +
  163 + ```javascript
  164 + PCSDK.data.QueryUserInviteUid: any
  165 + ```
  166 +
  167 + 定义:获取此次分享会话进入游戏,分享来源者用户userId
  168 +
  169 + 接入SDK的分享视频模块,分享出去的链接query会携带invite_user_uid参数,从分享会话点入游戏,获取此次分享会话的邀请者id: invite_user_uid,不是从分享会话点入游戏QueryUserInviteUid为0。
  170 + >>>开发者不接入SDK分享视频模块,游戏分享url的query参数必须要加入以下两个参数channel_id与user_invite_uid:channel_id的值通过ChannelId api获取,user_invite_uid的值可通过UserId api获取,也可以开发者从游戏中得到。
  171 + >>>每次分享query请携带:
  172 + ```javascript
  173 + `channel_id=${ PCSDK.data.ChannelId }&user_invite_uid=${ PCSDK.data.UserId }`
  174 + ```
  175 +
  176 + 示例:
  177 +
  178 + ```javascript
  179 + // 从分享会话邀请链接进入,获得的值为邀请者用户id,不是分享会话邀请进入获取值为0
  180 + let inviteUid = PCSDK.data.QueryUserInviteUid;
  181 + ```
  182 +10. ##### **IsCross**<div id="ad_cross"></div>
  183 +
  184 + ```javascript
  185 + PCSDK.data.IsCross: boolean
  186 + ```
  187 +
  188 + 定义:获取是否显示/隐藏交叉悬浮框推广位,true:显示,false:隐藏
  189 +
  190 + 示例:获取是否显示交叉悬浮框推广位
  191 +
  192 + ```javascript
  193 + // 设置交叉悬浮框推广位ui的显示隐藏
  194 + let isShow = PCSDK.data.IsCross;
  195 + this.uiCross.visible = isShow;
  196 + ```
  197 +11. ##### **IsDrawer**
  198 +
  199 + ```javascript
  200 + PCSDK.data.IsDrawer: boolean
  201 + ```
  202 +
  203 + 定义:获取是否显示/隐藏交叉抽屉推广位,true:显示,false:隐藏
  204 +
  205 + 示例:
  206 +
  207 + ```javascript
  208 + // 设置交叉抽屉推广位ui的显示隐藏
  209 + let isShow = PCSDK.data.IsDrawer;
  210 + this.uiDrawer.visible = isShow;
  211 + ```
  212 +12. ##### **IsGuessLike**
  213 +
  214 + ```javascript
  215 + PCSDK.data.IsGuessLike: boolean
  216 + ```
  217 +
  218 + 定义:获取是否显示/隐藏交叉猜你喜欢推广位,true:显示,false:隐藏
  219 +
  220 + 示例:
  221 +
  222 + ```javascript
  223 + // 设置交叉猜你喜欢推广位ui的显示隐藏
  224 + let isShow = PCSDK.data.IsGuessLike;
  225 + this.uiGuessLike.visible = isShow;
  226 + ```
0 227 \ No newline at end of file
... ...
outer/download.md 0 → 100644
... ... @@ -0,0 +1,61 @@
  1 +# SDK下载
  2 +
  3 +------
  4 +
  5 +## [v1.0.0.3 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.3.zip)
  6 +
  7 +> *发布时间*:2019.09.18
  8 +
  9 +**新增:**
  10 +
  11 +1. 移除掉stat模块的onlineTimeLen和logout api。
  12 +2. 微信小游戏引入GameIcon、GameBanner、GamePortal组件。
  13 +3. config.js添加积分投放IntegralChannelId参数,用于积分投放渠道统计。
  14 +
  15 +## [v1.0.0.2 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.2.zip)
  16 +
  17 +> *发布时间*:2019.09.11
  18 +
  19 +**修复:**
  20 +
  21 +1. 修复外部游戏设置openId导致userId为0的问题:外部游戏openId替换userId。
  22 +
  23 +**新增:**
  24 +
  25 +1. 外部游戏修改setLogind接口为setLoginInfo( { openId: strinng , retTime: number } )。
  26 +2. loadingFinish传递isActive参数,isActive为true SDK在loadingFinish结束后自动调用active。
  27 +
  28 +## [v1.0.0.1 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.1.zip)
  29 +
  30 +> *发布时间*:2019.09.04
  31 +
  32 +**修复:**
  33 +
  34 +1. 修复外部游戏stat launch api调用时序问题导致参数传递异常
  35 +
  36 +**新增:**
  37 +
  38 +1. config.js配置ShareData新增share_wxad_id参数:视频广告uid,配置此参数,推送看视频,不配置或者配置的uid无效则推送分享。
  39 +2. stat模块的addLogLevel拆分为多个接口:logLevelRelive、logLevelWin、logLevelFail、logLevelHide,addLogLevel继续保留。
  40 +3. data模块新增了三个控制交叉推广位动态控制显示/隐藏的api:IsCross、IsDrawer、IsGuessLike。
  41 +4. share模块重新命名为:shareVideo,shareDispatch修改为dispatch、shareWithType修改为dispatchType、getShareType修改为getShareVideoType,原来的share模块还是能用。
  42 +
  43 +
  44 +## [v1.0.0.0 下载](https://dep.miso-lab.com/sdkword/versions/sdk-out-v1.0.0.0.zip)
  45 +
  46 +> *发布时间*:2019.08.31
  47 +
  48 +**修复:**
  49 +
  50 +1. SDK外部版本不需要接入方调用stat 模块launch接口,SDK启动时候自动调用。
  51 +2. QQ轻游戏分享不成功回调的问题。
  52 +3. QQ轻游戏banner广告不贴底部的问题。
  53 +
  54 +**新增:**
  55 +
  56 +1. config.js配置新增IsOnlineAutoUse、IsOnlineDebug、ShareRightKey配置参数。
  57 +
  58 + 在线参数获取通过配置决定是否启动拉取,右上角分享配置进行读取shareKey。
  59 +
  60 +2. SDK分享模块不区分内部还是外部游戏,都引入分享/视频模块功能。
  61 +
... ...
outer/event.md 0 → 100644
... ... @@ -0,0 +1,275 @@
  1 +# 事件模块
  2 +事件是一种观察者的设计模式,对象可以发布事件,然后其它对象可以观察该对象,等待这些时刻到来并通过运行代码来响应。
  3 +
  4 +事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。
  5 +
  6 +开发者游戏项目和PCSDK属于两个不同的模块,PCSDK会在SDK内部处理一些业务,想要把这些处理结果告知开发者,那么自定义事件就派上用场了,SDK封装了一个event模块:PCSDK.event,开发者可使用这个模块接收SDK内部派发的消息,也可以应用在游戏中不同模块中通信的情况。
  7 +
  8 +<font color="red">PCSDK内部派发了以下几个内部消息,开发者可根据实际功能需要使用PCSDK.event api监听这些消息:</font>
  9 +
  10 +> 1、app.show:多平台的onShow事件消息,例如微信小游戏、QQ轻游戏的onShow事件。使用方式:
  11 +>
  12 +> **PCSDK.event.add( 'app.show' , 处理此消息的事件函数, 事件函数上下文)**
  13 +
  14 +> 2、app.hide: 多平台的onHide事件消息,例如微信小游戏、QQ轻游戏的onHide事件。使用方式:
  15 +>
  16 +> **PCSDK.event.add( 'app.hide' , 处理此消息的事件函数, 事件函数上下文)**
  17 +
  18 +> 3、tactic.update:推送策略更新事件消息,接入[分享视频模块(shareVideo)](share.md)后,某个功能点当前分享/视频完成后,下一次推送策略类型会通过这个消息发送处理,开发者监听这个消息,可处理游戏页面上的ui展示(如:视频分享icon、视频分享文案等),[查看完整示例](share.md#detail)。使用方式:
  19 +>
  20 +> **PCSDK.event.add( 'tactic.update' , 处理此消息的事件函数, 事件函数上下文)**
  21 +
  22 +
  23 +#### **接入API**:
  24 +
  25 +| **名称** | **功能说明** |
  26 +| ---------------- | ------------------------------------------------------------ |
  27 +| PCSDK.event.add | 添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文 |
  28 +| PCSDK.event.once | 添加一个事件监听,执行一次后会自动移除此事件监听 |
  29 +| PCSDK.event.emit | 触发事件监听:执行所绑定的事件类型对应的触发函数 |
  30 +| PCSDK.event.remove | 移除事件监听:移除添加的事件类型的触发函数 |
  31 +| PCSDK.event.removeAll | 移除所有事件监听:移除添加的事件类型下所有该类型的触发函数 |
  32 +
  33 +1. **add**
  34 + ```javascript
  35 + PCSDK.event.add( evt_name: string, listener: Function, context: any ): PCSDK.event
  36 + ```
  37 +
  38 + 定义:添加一个事件监听:传入参数为事件类型名称、触发函数func、触发函数的执行上下文。与之对应的是移除事件监听:PCSDK.event.remove:页面销毁或者关闭的时候移除监听
  39 +
  40 + 参数:
  41 +
  42 + ```javascript
  43 + evt_name: string 必传 事件类型名称
  44 +
  45 + listener: Function 必传 触发函数func,事件处理监听函数
  46 +
  47 + context: any 必传 触发函数func执行上下文
  48 + ```
  49 + 返回值:
  50 +
  51 + ```javascript
  52 + PCSDK.event
  53 + 返回的是event对象,方便链式调用, 例如:
  54 + PCSDK.event.add('update.money', () => { }, this )
  55 + .add('update.exp', () => { }, this );
  56 + ```
  57 + <div id="event_add"></div>
  58 + 示例:游戏中进入Home场景监听金币更新函数,更新金币ui界面的值,关闭Home场景时,移除金币更新函数。
  59 +
  60 + ```javascript
  61 + export default class HomeScene extends BaseView{
  62 + protected addEvent() {
  63 + super.addEvent();
  64 + // 添加注册金币更新事件监听
  65 + PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  66 + }
  67 +
  68 + protected removeEvent() {
  69 + super.removeEvent();
  70 + // 移除注册金币更新事件监听
  71 + PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  72 + }
  73 +
  74 + /**
  75 + * 更新金币ui
  76 + */
  77 + private handleUpdateMoney( money: number ){
  78 + this.txtCoin.text = `${money}`;
  79 + }
  80 + }
  81 +
  82 + /**
  83 + * event事件枚举
  84 + */
  85 + export enum EventEnum{
  86 + UPDATE_MONEY = 'update.money'
  87 + }
  88 + ```
  89 +2. **once**
  90 + ```javascript
  91 + PCSDK.event.once( evt_name: string, listener: Function, context?: any ): PCSDK.event
  92 + ```
  93 +
  94 + 定义:添加一个事件监听,执行一次后会自动移除此事件监听
  95 +
  96 + 参数:
  97 +
  98 + ```javascript
  99 + evt_name: string 必传 事件类型名称
  100 +
  101 + listener: Function 必传 触发函数func,事件处理监听函数
  102 +
  103 + context: any 必传 触发函数func执行上下文
  104 + ```
  105 + 返回值:
  106 +
  107 + ```javascript
  108 + PCSDK.event
  109 + 返回的是event对象,方便链式调用, 例如:
  110 + PCSDK.event.once('update.money', () => { }, this )
  111 + .once('update.exp', () => { }, this );
  112 + ```
  113 +
  114 + 示例:游戏中进入Home场景监听金币更新函数一次,该函数执行完一次后会自动移除该监听事件函数。
  115 +
  116 + ```javascript
  117 + export default class HomeScene extends BaseView{
  118 + protected open(){
  119 + super.open();
  120 + // 添加一次注册金币更新事件监听,该事件监听执行一次后,自动移除
  121 + PCSDK.event.once(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  122 + }
  123 +
  124 + /**
  125 + * 更新金币ui
  126 + */
  127 + private handleUpdateMoney( money: number ){
  128 + this.txtCoin.text = `${money}`;
  129 + }
  130 + }
  131 +
  132 + /**
  133 + * event事件枚举
  134 + */
  135 + export enum EventEnum{
  136 + UPDATE_MONEY = 'update.money'
  137 + }
  138 + ```
  139 +3. **emit**
  140 + ```javascript
  141 + PCSDK.event.emit( evt_name: string, ...args: any[] ): PCSDK.event
  142 + ```
  143 +
  144 + 定义:派发事件监听消息:执行所绑定的事件类型对应的触发函数,可以传递一些触发函数需要的其他任意参数
  145 +
  146 + 参数:
  147 +
  148 + ```javascript
  149 + evt_name: string 必传 事件类型名称
  150 +
  151 + args: any[] 选传 触发函数需要的其他任意参数
  152 + ```
  153 + 返回值:
  154 +
  155 + ```javascript
  156 + PCSDK.event
  157 + 返回的是event对象,方便链式调用, 例如:
  158 + PCSDK.event.emit('update.money', 10000)
  159 + .emit('update.exp', 2, 1000 );
  160 + ```
  161 +
  162 + 示例:游戏中金币领取奖励弹出框,点击领奖后派发金币更新的消息
  163 +
  164 + ```javascript
  165 + // RewardCoinPopwin弹出框领奖励后,派发update.money消息
  166 + export default class RewardCoinPopwin extends BaseView{
  167 + private rewardCoin: number;
  168 +
  169 + protected open(){
  170 + super.open();
  171 + this.rewardCoin = 10000000;
  172 + }
  173 +
  174 + protected addEvent() {
  175 + super.addEvent();
  176 + this.btnReward.on(Laya.Event.CLICK, this, this.onReward);
  177 + }
  178 +
  179 + protected removeEvent() {
  180 + super.removeEvent();
  181 + this.btnReward.off(Laya.Event.CLICK, this, this.onReward);
  182 + }
  183 +
  184 + /**
  185 + * 金币领取奖励
  186 + */
  187 + private onReward(ev: Laya.Event){
  188 + // 派发金币更新的消息,并把添加的金币传递
  189 + PCSDK.event.emit(EventEnum.UPDATE_MONEY, this.rewardCoin );
  190 + }
  191 + }
  192 +
  193 + // HomeScene监听update.money消息,处理加金币操作
  194 + export default class HomeScene extends BaseView{
  195 + protected addEvent() {
  196 + super.addEvent();
  197 + // 添加注册金币更新事件监听
  198 + PCSDK.event.add(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  199 + }
  200 +
  201 + protected removeEvent() {
  202 + super.removeEvent();
  203 + // 移除注册金币更新事件监听
  204 + PCSDK.event.remove(EventEnum.UPDATE_MONEY, this.handleUpdateMoney, this);
  205 + }
  206 +
  207 + /**
  208 + * 更新金币ui
  209 + */
  210 + private handleUpdateMoney( addMoney: number ){
  211 + this.txtAddCoin.text = `${addMoney}`;
  212 + }
  213 + }
  214 +
  215 + /**
  216 + * event事件枚举
  217 + */
  218 + export enum EventEnum{
  219 + UPDATE_MONEY = 'update.money'
  220 + }
  221 + ```
  222 +
  223 +4. **remove**
  224 + ```javascript
  225 + PCSDK.event.remove( evt_name: string, listener: Function, context?: any ): PCSDK.event
  226 + ```
  227 +
  228 + 定义:移除事件监听:移除添加的事件类型的触发函数。
  229 +
  230 + 参数:
  231 +
  232 + ```javascript
  233 + evt_name: string 必传 事件类型名称
  234 +
  235 + listener: Function 必传 触发函数func,事件处理监听函数
  236 +
  237 + context: any 必传 触发函数func执行上下文
  238 + ```
  239 + 返回值:
  240 +
  241 + ```javascript
  242 + PCSDK.event
  243 + 返回的是event对象,方便链式调用, 例如:
  244 + PCSDK.event.remove('update.money', () => { }, this )
  245 + .remove('update.exp', () => { }, this );
  246 + ```
  247 +
  248 + 示例:[见上例](event.md#event_add)
  249 +
  250 +5. **removeAll**
  251 + ```javascript
  252 + PCSDK.event.removeAll( evt_name: string ): PCSDK.event
  253 + ```
  254 +
  255 + 定义:移除所有事件监听:移除添加的事件类型下所有该类型的触发函数
  256 +
  257 + 参数:
  258 +
  259 + ```javascript
  260 + evt_name: string 必传 事件类型名称
  261 + ```
  262 + 返回值:
  263 +
  264 + ```javascript
  265 + PCSDK.event
  266 + 返回的是event对象,方便链式调用, 例如:
  267 + PCSDK.event.removeAll('update.money')
  268 + .removeAll('update.exp');
  269 + ```
  270 +
  271 + 示例:
  272 +
  273 + 移除游戏中所有update.money事件监听:PCSDK.event.removeAll('update.money');
  274 +
  275 + 移除游戏中所有update.exp事件监听:PCSDK.event.removeAll('update.exp');
... ...
outer/faq.md 0 → 100644
... ... @@ -0,0 +1,174 @@
  1 +# FAQ
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。
  8 +
  9 +
  10 +
  11 +#### **后台使用**
  12 +
  13 +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息:
  14 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png "🔍点击查看大图")
  15 +
  16 +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息:
  17 +
  18 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png "🔍点击查看大图")
  19 +
  20 +
  21 +
  22 +
  23 +
  24 +#### **接入API:**
  25 +
  26 +| **名称** | **功能说明** |
  27 +| ------------------------ | ------------------------------------------------------------ |
  28 +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,不是微信代码包白屏加载完成,游戏loading自身cdn资源加载完成调用 |
  29 +| PCSDK.stat.setLogind | 设置sdk必须要使用的用户id、第一次创建角色的注册时间,游戏接入方登录游戏服务器后调用 |
  30 +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在setLogind设置需要的信息过后使用(不限于使用位置),不然会导致新增注册数据统计异常 |
  31 +
  32 +
  33 +
  34 +
  35 +
  36 +
  37 +
  38 +1. **loadingFinish**
  39 +
  40 + ```javascript
  41 + PCSDK.stat.loadingFinish(): void
  42 + ```
  43 +
  44 + 定义:加载游戏加载资源完成时打点
  45 +
  46 + 参数:
  47 +
  48 + ```
  49 + 无
  50 + ```
  51 +
  52 + 示例:加载完成游戏主界面图片、json资源打点
  53 +
  54 + ```javascript
  55 + private async initEnv() {
  56 + await SDKTools.env(Const.VERSION);
  57 + this.loadRes();
  58 + this.loadLogin();
  59 + }
  60 +
  61 + // 开始加载资源
  62 + private loadRes() {
  63 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  64 + }
  65 +
  66 + // 资源加载完成
  67 + private onLoadedMain() {
  68 + PCSDK.stat.loadingFinish()
  69 + }
  70 +
  71 + // 更新资源加载进度条
  72 + private onProgressMain(ret) {
  73 + let progress = ret.data;
  74 + this.skin.txtProgress.text = Math.floor(progress * 100) + '%';
  75 + }
  76 + ```
  77 +
  78 +2. **setLogind**
  79 +
  80 + ```javascript
  81 + PCSDK.stat.setLogind( data: object ): void
  82 + ```
  83 +
  84 + 定义:游戏登录完成,得到登录用户的用户id和用户第一次注册时间,设置SDK必需的用户信息
  85 +
  86 + 参数:
  87 +
  88 + ```javascript
  89 + data: object
  90 +{
  91 + userId: string | number 必传, 用户唯一标识id
  92 + regTime: number 必传,用户第一次创建角色的注册时间戳
  93 + }
  94 + ```
  95 +
  96 + 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟使用环境)
  97 +
  98 + ```javascript
  99 + // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息
  100 + Api.login().then( data => {
  101 + let { user_id, user_reg_time } = data;
  102 + PCSDK.stat.setLogind({
  103 + userId: data.user_id,
  104 + regTime: data.user_reg_time
  105 + });
  106 + });
  107 + ```
  108 +
  109 +3. **active**
  110 +
  111 + ```javascript
  112 + PCSDK.stat.active(): void
  113 + ```
  114 +
  115 + 定义:用户活跃/新增注册上报,切记在使用setLogind设置用户信息过后调用此接口,不然会导致新增注册数据统计异常
  116 +
  117 + 参数:
  118 +
  119 + ```javascript
  120 + 无
  121 + ```
  122 +
  123 + 示例:游戏登录完成后,获取用户信息后进行打点(该示例,只是模拟该接口使用环境)
  124 +
  125 + ```javascript
  126 + // 使用场景1:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息后立即调用active
  127 + Api.login().then( data => {
  128 + let { user_id, user_reg_time } = data;
  129 + // 设置用户信息
  130 + PCSDK.stat.setLogind({
  131 + userId: data.user_id,
  132 + regTime: data.user_reg_time
  133 + });
  134 + // 用户活跃注册打点
  135 + PCSDK.stat.active();
  136 + });
  137 +
  138 + // 使用场景2:发起登录请求,得到用户数据信息,调用setLogind设置SDK用户信息。在其他界面调用active
  139 + // 资源加载loading界面
  140 + class LoadingScene(){
  141 + constructor(){
  142 + this.login();
  143 + }
  144 +
  145 + private login(){
  146 + // 登录
  147 + Api.login().then( data => {
  148 + let { user_id, user_reg_time } = data;
  149 + // 设置用户信息
  150 + PCSDK.stat.setLogind({
  151 + userId: data.user_id,
  152 + regTime: data.user_reg_time
  153 + });
  154 + // 进入home主页场景
  155 + SceneManager.I.switchScene(HomeScene);
  156 + });
  157 + }
  158 + }
  159 +
  160 + // Home页面
  161 + class HomeScene(){
  162 + constructor(){
  163 + this.btnStarGame.on('click', this.onGame, this);
  164 + }
  165 +
  166 + private onGame(){
  167 + // 用户活跃注册打点
  168 + PCSDK.stat.active();
  169 + // 进入游戏页面
  170 + SceneManager.I.switchScene(GameScene);
  171 + }
  172 + }
  173 +
  174 + ```
0 175 \ No newline at end of file
... ...
outer/install.md 0 → 100644
... ... @@ -0,0 +1,218 @@
  1 +# 安装步骤
  2 +
  3 +------
  4 +
  5 +## SDK下载
  6 +
  7 +1. 下载最新版本的SDK [SDK下载](download.md) 。
  8 +2. 解压下载的sdk-in-v{版本号}.zip包,解压文件夹里面的的目录结构:
  9 +
  10 +```
  11 +├── sdk.d.ts
  12 +├── sdk/
  13 +| ├── config.js
  14 +| └── entry.js
  15 +| └── libs/
  16 + | └── game.min.js
  17 +```
  18 +
  19 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_001.png "🔍点击查看大图")
  20 +
  21 +- **sdk.d.ts:sdk的ts声明文件,开发者项目采用Typescript开发,请复制该文件到项目中。**
  22 +- sdk/config.js:sdk配置文件,【[详细请阅读下方config.js参数说明](install.md#config)】
  23 +- sdk/entry.js:sdk入口文件,引入了sdk所提供的模块功能
  24 +- sdk/libs/game.min.js:sdk类库核心代码文件
  25 +
  26 +
  27 +
  28 +## 配置合法域名
  29 +
  30 +* ##### 管理员或开发者身份在微信小程序后台→设置→开发者设置中添加 request、download合法域名
  31 + 正式环境 request 合法域名:
  32 +
  33 + https://dataapi.d3games.com (统计平台正式服域名)
  34 +
  35 + cdn资源请求合法域名:
  36 +
  37 + https://dep.miso-lab.com (>>>request、download均要添加<<<)
  38 +
  39 +
  40 +
  41 +
  42 +
  43 +​
  44 +## SDK配置步骤
  45 +
  46 +* #### 将下载下来的sdk压缩包,解压后,拷贝sdk文件夹到微信开发者工具项目中。
  47 +
  48 + 示例:将sdk放入到小游戏开发者工具项目的src文件夹中
  49 +
  50 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_002.png "🔍点击查看大图")
  51 +
  52 +
  53 +
  54 +
  55 +
  56 +* #### 在game.js中将sdk.js文件使用require导入。
  57 +
  58 + 示例:将sdk放入到小游戏开发者工具项目的src文件夹中
  59 + ![引入目录](https://dep.miso-lab.com/sdkword/sdk_003.png "🔍点击查看大图")
  60 +
  61 +
  62 +
  63 +* #### 根据运营提供的信息修改sdk文件夹下的**config**.js文件(可横向拖动查看查看更多====>)<div id="config"></div>
  64 +<div id="configJs"></div>
  65 + ```javascript
  66 + export default {
  67 + IsDebug: false, // 是否debug模式,debug模式会打印log,可使用stat模块setDebug api进行修改
  68 + AdCacheDuration: 30, // 广告列表缓存持续时间间隔
  69 + IsUseShareModule: true, // 是否使用分享模块
  70 + IsOnlineAutoUse: true, // 是否开启sdk自动请求online模块(在线参数配置)的updateOnlineConfig,拉取在线参数配置
  71 + IsOnlineDebug: true, // 是否开启online模块(配置参数模块)debug模式
  72 + ShareRightKey: 'forward', // 右上角分享的shareKey,shareKey请阅读share模块说明,默认为forward,为空字符串则不使用右上角分享
  73 +
  74 + ShareData: { // 必填,默认分享数据(拉取不到分享配置后使用,默认分享,SDK自动分配share_id为99999)
  75 + share_desc: 'xxx',
  76 + share_wxad_id: '', // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享
  77 + share_icon: 'xxx'
  78 + },
  79 + GameId: 0, // 必填,游戏ID,运营提供;
  80 + ChannelId: 0, // 必填,游戏渠道ID,运营提供;
  81 + IntegralChannelId: 0, // 必填,积分投放渠道ID,运营提供;
  82 + Secret: '***请配置你的Secret***', // 必填,游戏的secret key
  83 + MidasPay: { // 米大师虚拟支付配置
  84 + OfferId: "0", // 在米大师申请的应用id
  85 + ZoneId: "1", // 分区ID,默认:1
  86 + Mode: "game", // 支付的类型,不同的支付类型有各自额外要传的附加参数,默认:game
  87 + CurrencyType: "CNY", // 币种,默认:CNY
  88 + Platform: '' // 申请接入时的平台,platform与OfferId(米大师申请的应用id)有关,详情请阅读文档config.js参数MidasPay下的Platform配置
  89 + }
  90 + };
  91 +```
  92 +
  93 +
  94 +参数详解:
  95 +
  96 +<div id="config_env"></div>
  97 +2. **IsDebug ( boolean ):**是否debug模式,debug模式会打印sdk中的console.log/error/warn log。
  98 +
  99 + false:关闭log打印,提审前建议设置为false,不打印log信息
  100 +
  101 + true:开启log打印,如遇到联调问题,可设置为true,发体验版本或者查看log发给相关人员进行查看解决问题
  102 +
  103 + 也可在代码中动态设置:PCSDK.stat.setDebug( boolean )
  104 +
  105 +3. **AdCacheDuration(number):**表示获取广告位列表的缓存时间,例如:配置30,SDK中拉取交叉推广位列表后缓存30秒。此参数对接入交叉推广位模块后有效,没有接入可不修改,使用默认值。
  106 +
  107 +4. **IsUseShareModule( boolean ):**是否启用sdk分享/视频功能(sdk把分享和视频封装为share模块,登录后台->【游戏数据】->【配置相关】->【分享/视频配置】后可对分享视频进行动态配置)
  108 +
  109 + false:SDK启动时不拉取分享/视频列表,不接入分享/视频模块功能
  110 +
  111 + true:SDK启动时拉取后台配置的分享/视频列表,运营或者开发者登录后台后,配置分享/视频,开发者请详看分享视频模块接入。
  112 +
  113 +5. **IsOnlineAutoUse( boolean ):**是否启用在线配置参数模块功能
  114 +
  115 + false:两种处理 1)不启用在线配置参数模块功能; 2)启用在线配置参数功能,但是SDK启动时不自动调用updateOnlineConfig拉取后台配置参数列表,开发者在代码主动调用拉取在线配置参数:PCSDK.online.updateOnlineConfig();
  116 +
  117 + 示例:开发者代码中主动拉取在线配置参数。
  118 +
  119 + ```javascript
  120 + // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关
  121 + PCSDK.online.updateOnlineConfig().then(() => {
  122 + // 获取是否后台动态配置开启插屏广告,1为开启,0为关闭
  123 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
  124 + // isInterstitialAd && '显示插屏广告';
  125 + // 获取动态多个广告位开启的配置
  126 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
  127 + // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位';
  128 + // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位';
  129 + // pcGameOpenMap.Cross === 1 && '显示交叉推广位';
  130 + });
  131 + ```
  132 + true:sdk启动时自动调用updateOnlineConfig拉取后台在线配置参数列表,开发者可通过
  133 +
  134 + PCSDK.online.getParamsObj、PCSDK.online.getParamsInt、PCSDK.online.getParamsString、PCSDK.online.getParams api传递后台配置参数key获取在线配置参数。
  135 +
  136 + 示例:IsOnlineAutoUse: true,开发者可使用下面api获取在线配置参数配置的值
  137 +
  138 + ```javascript
  139 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
  140 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
  141 + ```
  142 +
  143 +6. **IsOnlineDebug( boolean ):**是否启用online模块(在线配置参数)debug模式,建议设置为true。
  144 +
  145 + false:不启动debug模式,开发者主动调用updateOnlineConfig或者SDK启动时调用updateOnlineConfig都会把在线配置参数列表设置10分钟缓存,不用每次都去服务器请求,参照了友盟在线参数功能的设计
  146 +
  147 + true: 开启debug模式,只要是请求updateOnlineConfig api都会立即发起请求,而不是去检测读取缓存
  148 +
  149 +7. **ShareRightKey( string ):**右上角分享的shareKey,shareKey请阅读分享视频模块,默认为forward,为空字符串则不使用右上角分享,此配置在配置【IsUseShareModule: true】情况下生效。
  150 +
  151 + 示例:
  152 +
  153 + 在后台的【分享/视频配置】栏目配置了一条分享key为:forward的分享配置
  154 +
  155 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_004.png "🔍点击查看大图")
  156 +
  157 +8. **ShareData( object ):**此配置在【IsUseShareModule: true】起效,开发者如果接入了分享视频模块,>>> 请务必配置一条 <<<。
  158 +
  159 + > IsUseShareModule设置true sdk启动拉取分享视频配置列表,如果分享视频列表拉取请求失败,或此shareKey不在分享视频配置列表中(登录后台 ->【游戏数据】->【分享/视频配置】栏没有配置分享key)就会使用此条设置的数据。
  160 +
  161 + 示例:可从后台【游戏数据】->【分享/视频配置】中选取一条:复制文案,点击分享素材icon -> 查看大图 -> 右键查看分享图片的html源码复制src图片地址:
  162 +
  163 + ```json
  164 + {
  165 + // 分享文案内容
  166 + share_desc: ' 半夜传来啪啪啪!竟是隔壁老王偷偷打气球',
  167 + // 可选,视频广告uid,配置此参数,拉取不到对应的shareKey,推送看视频,不配置或者配置的uid无效则推送分享
  168 + share_wxad_id: 'adunit-6958dcfc3f0bed31',
  169 + // 分享图
  170 + share_icon: 'https://dep.miso-lab.com/data_analysis/games/res/5D57D4A3Yx.png'
  171 + }
  172 + ```
  173 +
  174 + 操作步骤:
  175 +
  176 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_005.png "🔍点击查看大图")
  177 +
  178 +9. **GameId:必填,游戏id,请联系运营人员提供**
  179 +
  180 +10. **ChannelId:必填,游戏渠道id,请联系运营人员提供**
  181 +
  182 +11. **IntegralChannelId:必填,积分投放渠道ID,运营提供**
  183 +
  184 +12. **Secret:必填,游戏 Secret Key,请联系运营人员提供**
  185 +
  186 +13. **MidasPay( object ):**米大师虚拟支付配置,请注意下面规则
  187 +
  188 + OfferId:在米大师申请的应用id,没有接入米大师(比如第三方支付),默认为"0"
  189 +
  190 + ZoneId:分区ID,默认:"1"
  191 +
  192 + Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game"
  193 +
  194 + CurrencyType:币种,默认:"CNY"
  195 +
  196 + Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。
  197 +
  198 + 1)接入了米大师,填写"android"(ios暂时没有开放)
  199 +
  200 + 2)未接入米大师,使用其他支付,如果只支持android,则填写"android";
  201 +
  202 + 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios";
  203 +
  204 + 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios
  205 +
  206 +
  207 +
  208 +* #### 如果项目使用Typescript语言开发,请引入解压文件夹下的sdk.d.ts文件到项目中。
  209 +
  210 + 示例:项目采用的是Laya Typescript版本进行开发,将该文件复制到libs目录下面
  211 +
  212 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_007.png "🔍点击查看大图")
  213 +
  214 +* #### 到此,SDK的准备工作已经配置完毕,运行起来:
  215 +
  216 + 运行中碰到问题,[[请查看FAQ](faq.md)],或者微信群联系相关人员。
  217 +
  218 + 正常运行,阅读SDK手册,开始[[SDK模块功能](modules.md)]接入。
0 219 \ No newline at end of file
... ...
outer/intro.md 0 → 100644
... ... @@ -0,0 +1,56 @@
  1 +# 噗嗤SDK
  2 +PCSDK(噗嗤SDK)是一款封装了微信小游戏、QQ小游戏平台常用api接口和用户行为数据上报的一款产品。
  3 +PCSDK上报小游戏用户所触发的各种行为数据到噗嗤管理后台,后台对数据统计分析后以多样化的方式展现数据。
  4 +
  5 +**PCSDK提供的模块功能:**
  6 +
  7 +- [统计模块](stat.md)
  8 +- [分享视频模块](share.md)
  9 +- [配置参数模块️](online.md)
  10 +- [多平台接口模块](platform.md)
  11 +- [数据模块](data.md)
  12 +- [事件模块](event.md)
  13 +
  14 +
  15 +
  16 +# 噗嗤管理后台
  17 +噗嗤管理后台对sdk中上报的各项数据进行分析,管理sdk中所需要的配置信息:分享/视频配置、配置参数(在线参数配置)、交叉推广位配置、用户自定义事件配置。
  18 +
  19 +噗嗤管理后台地址:
  20 +
  21 +- https://data.d3games.com/#/login
  22 +
  23 +**友情提示:**
  24 +
  25 +- **之后文档中'后台'指的是[噗嗤管理后台],而不是微信小程序/小游戏后台。**
  26 +- **后台登录账号获取:需提供手机信息给我方运营,运营创建后台登录账号、密码后提供反馈。**
  27 +- **登录后台即可使用后台提供的各项服务**
  28 +
  29 +
  30 +
  31 +**后台概览:**
  32 +## ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_006.png "🔍点击查看大图")
  33 +
  34 +
  35 +
  36 +**后台提供数据分析功能(不能跳转请联系管理员添加权限):**
  37 +
  38 +- [注册/活跃用户,在线时长实时数据分析](https://data.d3games.com/index.html#/view_chart)
  39 +- [分享数据分析](https://data.d3games.com/index.html#/share_exact)
  40 +- [用户事件行为分析](https://data.d3games.com/index.html#/dot_list)
  41 +- [渠道数据统计分析](https//data.d3games.com/index.html#/channel_stat_list)
  42 +
  43 +
  44 +
  45 +**后台提供配置相关功能(不能跳转请联系管理员添加权限):**
  46 +
  47 +- [分享/视频配置](https://data.d3games.com/index.html#/share_list)
  48 +- [配置参数](https://data.d3games.com/index.html#/config_list)
  49 +
  50 +
  51 +# 更多:
  52 +- 快速接入,请详读 [安装步骤](install.md)
  53 +
  54 +
  55 +
  56 +- 遇到问题可以查看 [FAQ](faq.md)
0 57 \ No newline at end of file
... ...
outer/modules.md 0 → 100644
... ... @@ -0,0 +1,87 @@
  1 +# 模块概览
  2 +下图是PCSDK的概要思维导图,SDK所提供的所有功能都在下图列出<font color="red">(点击查看大图)</font>:
  3 +
  4 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_000.png "🔍点击查看大图")
  5 +
  6 +
  7 +[统计模块:stat](stat.md)
  8 +
  9 + 启动注册打点
  10 +
  11 + setLoginInfo:设置登录信息
  12 +
  13 + loadingFinish:资源加载完成
  14 +
  15 + active:添加注册活跃用户
  16 +
  17 + 关卡分析打点
  18 +
  19 + logLevelRelive:游戏关卡复活上报
  20 +
  21 + logLevelHide:游戏关卡页onHide上报
  22 +
  23 + logLevelFail:游戏关卡失败上报
  24 +
  25 + logLevelWin:游戏关卡成功上报
  26 +
  27 + logMerge:游戏2合1合成最高等级上报
  28 +
  29 + 交叉推广位:悬浮框、抽屉式、猜你喜欢
  30 +
  31 + bannerList:获取对应类型交叉推广位列表
  32 +
  33 + bannerNavigateTo:点击跳转到对应appid的游戏
  34 +
  35 + addExposure:交叉推广位一条或者多条广告展示,添加曝光数据
  36 +
  37 + 自定义事件
  38 +
  39 + event:自定义打点事件
  40 +
  41 +[数据模块:data](data.md)
  42 +
  43 + GameId:获取游戏的GameId,来源于config.js配置的GameId
  44 +
  45 + ChannelId:获取游戏渠道ID,来源于config.js配置的ChannelId
  46 +
  47 + UserId:获取用户ID,来源于setLoginInfo传递的openId的值
  48 +
  49 + RegTime:获取用户注册时间,来源于setLoginInfo传递的regTime的值
  50 +
  51 + ShareId:获取进入游戏的分享会话ID,不是从分享会话进入ShareId为0。需接shareVideo模块
  52 +
  53 + ShareKey:接入SDK的分享视频模块后,从分享会话进去游戏,获取到分享会话的分享key
  54 +
  55 + Platform:获取游戏运行平台环境,字符串形式:devtools、ios、android。devtools(开发者调试工具)、ios(苹果设备)、android(安卓设备)
  56 +
  57 + SystemId:获取游戏运行平台环境,整数形式:0、1。0(开发者调试工具或ios)、1(安卓设备)
  58 +
  59 + QueryUserInviteUid:获取此次分享会话进入游戏,分享来源者用户ID,来源query的参数invite_user_uid
  60 +
  61 + IsCross:获取是否显示/隐藏悬浮框交叉推广位,true:显示,false:隐藏
  62 +
  63 + IsDrawer:获取是否显示/隐藏抽屉式交叉推广位,true:显示,false:隐藏
  64 +
  65 + IsGuessLike:获取是否显示/隐藏猜你喜欢交叉推广位,true:显示,false:隐藏
  66 +
  67 +[配置参数模块:online](online.md)
  68 +
  69 + updateOnlineConfig:拉取后台配置的配置参数数据,可代码中手动调用,也可SDK自动拉取
  70 +
  71 + getParamsInt:根据在线参数key获取number类型参数值
  72 +
  73 + getParamsObj:根据在线参数key获取object类型参数值
  74 +
  75 + getParamsString:根据在线参数key获取string类型参数值
  76 +
  77 +事件模块:event
  78 +
  79 +多平台接口模块:platform
  80 +
  81 +[分享视频模块:shareVideo](share.md)
  82 +
  83 + share:普通分享,不需要处理回调的场景
  84 +
  85 + dispatch:分享视频分发入口,传入功能点英文命名的分享/视频key
  86 +
  87 + getShareVideoType:根据功能点在后台配置的分享/视频key,得到此功能点分享开关
... ...
outer/online.md 0 → 100644
... ... @@ -0,0 +1,165 @@
  1 +
  2 +# 配置参数模块
  3 +
  4 +------
  5 +
  6 +#### **简介**
  7 +
  8 +在线配置参数是噗嗤游戏开放的一个新模块功能,可以让开发者在后台【配置参数】栏中动态修改游戏使用的参数值。例如:动态修改游戏的数值,小到一个简单开关0/1切换、一个简单的数字配置;大到一个游戏json配置等。
  9 +
  10 +该模块借鉴了[友盟在线配置参数](http://www.it610.com/article/4896789.htm)的设计思路。
  11 +
  12 +
  13 +
  14 +#### **后台使用**
  15 +
  16 +设置在线配置参数,登录后台->头部tab切换到【游戏数据】->【配置相关】->【配置参数】可新增、编辑修改参数值,配置完毕后,通过online模块相关的api使用:
  17 +
  18 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_021.png "🔍点击查看大图")
  19 +
  20 +
  21 +
  22 +#### **接入API:**
  23 +
  24 +| **名称** | **功能说明** |
  25 +| ------------------------------- | ------------------------------------------------------------ |
  26 +| PCSDK.online.updateOnlineConfig | 拉取后台配置的配置参数数据,可代码中手动调用,也可以通过config.js中配置SDK主动拉取,注意:使用前请详细[阅读config.js的IsOnlineAutoUse和IsOnlineDebug参数详解](install.md#config_env) |
  27 +| PCSDK.online.getParamsInt | 根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数 |
  28 +| PCSDK.online.getParamsObj | 根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象 |
  29 +| PCSDK.online.getParamsString | 根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串 |
  30 +
  31 +
  32 +
  33 +1. ##### **updateOnlineConfig**
  34 +
  35 + ```javascript
  36 + PCSDK.online.updateOnlineConfig(): Promise<any>
  37 + ```
  38 +
  39 + 定义:拉取后台配置的配置参数数据,
  40 +
  41 + 提示:
  42 +
  43 + > [config.js中配置IsOnlineAutoUse](install.md#config_env)为true:SDK启动时会自动去拉取在线配置参数,开发者不需要调用此接口,不然会导致重复拉取
  44 + >
  45 + > [config.js中配置IsOnlineAutoUse](install.md#config_env)为false:有两种理解方式:1)不接入使用在线配置参数模块;2)接入使用在线配置参数模块,开发者自己手动调用updateOnlineConfig api处理逻辑。
  46 + >
  47 + > 下面示例会演示两种不同配置的使用范例:
  48 +
  49 + 参数:
  50 +
  51 + ```
  52 + 无
  53 + ```
  54 +
  55 + 返回值:
  56 +
  57 + ```
  58 + Promise<any>
  59 + ```
  60 +
  61 + <div id="sample"></div>
  62 +
  63 + 示例1:config.js配置IsOnlineAutoUse为false,开发者调用updateOnlineConfig api手动拉取在线配置参数数据
  64 +
  65 + ```javascript
  66 + // 后台 ->【游戏数据】->【配置参数】栏配置了:是否显示微信插屏广告、交叉推广位是否展示动态开关
  67 + PCSDK.online.updateOnlineConfig().then(() => {
  68 + // 使用1:获取是否后台动态配置开启插屏广告,1为开启,0为关闭
  69 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
  70 + // isInterstitialAd && '显示插屏广告';
  71 +
  72 + // 使用2:获取动态多个广告位开启的配置
  73 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
  74 + // pcGameOpenMap.Drawer === 1 && '显示抽屉推广位';
  75 + // pcGameOpenMap.GuessLike === 1 && '显示猜你喜欢推广位';
  76 + // pcGameOpenMap.Cross === 1 && '显示交叉推广位';
  77 +
  78 + // 使用3:获取签到配置
  79 + let signRewardCfg = PCSDK.online.getParamsObj('sign_reward_cfg', [100, 300, 500, 700, 900, 2000, 3000]);
  80 +
  81 + // 使用4:获取动态bannerUid
  82 + let bannerUid = PCSDK.online.getParamsString('banner_common_uid', 'adunit-fe38438f074c717f');
  83 + // bannerUid && '显示banner';
  84 + });
  85 + ```
  86 +
  87 + 示例2:config.js配置IsOnlineAutoUse为true,SDK启动时会自动调用 updateOnlineConfig api拉取在线配置参数数据
  88 +
  89 + ```javascript
  90 + let isInterstitialAd = PCSDK.online.getParamsInt('interstitial_ad_open', 0) === 1;
  91 + let pcGameOpenMap = PCSDK.online.getParamsObj('pc_games_open', { "Drawer": 0, "GuessLike": 0, "Cross": 0 });
  92 + ```
  93 +
  94 +
  95 +
  96 +2. ##### **getParamsInt**
  97 +
  98 + ```javascript
  99 + PCSDK.online.getParamsInt( key: string, defaultVal?: number ): number
  100 + ```
  101 +
  102 + 定义:根据在线参数key获取number类型参数值,适合配置参数为:整数、浮点数
  103 +
  104 + 参数:
  105 +
  106 + ```javascript
  107 + key: string 必传 后台 ->【配置参数】配置的key
  108 + defaultVal: number 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值
  109 + ```
  110 +
  111 + 返回值:
  112 +
  113 + ```
  114 + number
  115 + ```
  116 +
  117 + 示例:[查看上面的示例代码](online.md#sample)
  118 +
  119 +3. **getParamsObj**
  120 +
  121 + ```javascript
  122 + PCSDK.online.getParamsObj( key: string, defaultVal?: any ): any
  123 + ```
  124 +
  125 + 定义:根据在线参数key获取object类型参数值,适合配置参数为:数组、json对象
  126 +
  127 + 参数:
  128 +
  129 + ```javascript
  130 + key: string 必传 后台 ->【配置参数】配置的key
  131 + defaultVal: any 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值
  132 + ```
  133 +
  134 + 返回值:
  135 +
  136 + ```
  137 + object | array | null
  138 + ```
  139 +
  140 + 示例:[查看上面的示例代码](online.md#sample)
  141 +
  142 +1. **getParamsString**
  143 +
  144 + ```javascript
  145 + PCSDK.online.getParamsString( key: string, defaultVal?: string ): string
  146 + ```
  147 +
  148 + 定义:根据在线参数key获取string类型参数值,适合配置参数为:字符串、json字符串
  149 +
  150 + 参数:
  151 +
  152 + ```javascript
  153 + key: string 必传 后台 ->【配置参数】配置的key
  154 + defaultVal: string 选传 默认值 后台没有配置此key,或在线配置参数数据拉取失败,则返回此值
  155 + ```
  156 +
  157 + 返回值:
  158 +
  159 + ```
  160 + string
  161 + ```
  162 +
  163 + 示例:[查看上面的示例代码](online.md#sample)
  164 +
  165 +
0 166 \ No newline at end of file
... ...
outer/platform.md 0 → 100644
... ... @@ -0,0 +1,577 @@
  1 +# 多平台接口模块:PCSDK.platform
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +所谓多平台指的是微信小游戏、QQ轻游戏、今日头条、oppo等游戏发布的平台。微信和QQ接口文档api相似度99%,微信、QQ、今日头条平台的接口api相似度80%以上,虽然相似度很高,但是仍需要针对差异性做一些处理。多平台接口模块就是想要在SDK内部去抹平了各个平台差异性的处理,达到同一个api调用,应用多个平台的作用。
  8 +
  9 +#### **此模块是参照微信小游戏提供的api进行封装的公用方法,提供了以下游戏中常用到的功能:**
  10 +
  11 +2. **打开客服消息:openCustomerServiceConversation** 整理来自[wx.openCustomerServiceConversation](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html)
  12 +
  13 +3. **检测版本更新:checkUpdate** 整理来自:[wx.getUpdateManager](https://developers.weixin.qq.com/minigame/dev/api/base/update/UpdateManager.html)
  14 +4. **显示模态弹出框:showModal** 整理来自:[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html)
  15 +5. **复制文本:copy** 整理来自:[wx.setClipboardData](https://developers.weixin.qq.com/minigame/dev/api/device/clipboard/wx.setClipboardData.html)
  16 +6. **长震动:vibrateLong** 整理来自:[wx.vibrateLong](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateLong.html)
  17 +7. **短震动:vibrateShort** 整理来自:[wx.vibrateShort](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateShort.html)
  18 +9. **微信小游戏推荐弹窗组件GamePortal:isGamePortalPlaying 与 gamePortalShow** 整理来自:[wx.createGamePortal](https://developers.weixin.qq.com/minigame/dev/api/game-portal/GameBanner.html)
  19 +10. **微信小游戏插屏广告组件InterstitialAd:isInterstitialPlaying 与 interstitialShow** 整理来自:[wx.createInterstitialAd](https://developers.weixin.qq.com/minigame/dev/api/ad/InterstitialAd.html)
  20 +11. **微信小游戏推荐icon组件GameIcon:gameIconShow 与 gameIconDestroy** 整理来自:[wx.createGameIcon](https://developers.weixin.qq.com/minigame/dev/api/game-portal/wx.createGameIcon.html)
  21 +
  22 +
  23 +
  24 +#### **接入API:**
  25 +
  26 +| **名称** | **功能说明** |
  27 +| ------------------------ | ------------------------------------------------------------ |
  28 +| PCSDK.platform.openCustomerServiceConversation | 进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力、钻石和进入跳转充值等,[具体用法请看](platform.md#service)|
  29 +| PCSDK.platform.checkUpdate | 检测版本是否有更新,如果版本更新会弹出确认框 |
  30 +| PCSDK.platform.copy | 设置系统剪贴板的内容。微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s |
  31 +| PCSDK.platform.vibrateShort | 使手机发生较短时间的振动(15 ms) |
  32 +| PCSDK.platform.vibrateLong | 使手机发生较长时间的振动(400 ms) |
  33 +| PCSDK.platform.gamePortalShow | 传入adUnitId创建并展示小游戏推荐弹窗组件 |
  34 +| PCSDK.platform.isGamePortalPlaying | 是否正在加载小游戏推荐弹窗组件 |
  35 +| PCSDK.platform.interstitialShow | 传入adUnitId创建并展示小游戏插屏广告组件 |
  36 +| PCSDK.platform.isInterstitialPlaying | 是否正在加载小游戏插屏广告组件 |
  37 +| PCSDK.platform.gameIconShow | 创建并显示小游戏推荐icon组件 |
  38 +| PCSDK.platform.gameIconDestroy | 销毁正在展示的小游戏推荐icon组件 |
  39 +
  40 +
  41 +
  42 +
  43 +
  44 +<div id="service"></div>
  45 +
  46 +2. **openCustomerServiceConversation**
  47 +
  48 + ```javascript
  49 + PCSDK.platform.openCustomerServiceConversation( params?: _CustomerServiceConversationObject ): void
  50 + ```
  51 +
  52 + 定义:进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力和进入跳转充值
  53 +
  54 + 参数:
  55 +
  56 + ```javascript
  57 + params _CustomerServiceConversationObject 选传,不传递打开一个普通的客户会话。[参数说明参照](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html)
  58 + {
  59 + sessionFrom string 选传 会话来源
  60 + showMessageCard boolean 选传 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息
  61 + sendMessageTitle string 选传 会话内消息卡片标题
  62 + sendMessagePath string 选传 会话内消息卡片路径
  63 + sendMessageImg string 选传 会话内消息卡片图片路径
  64 + success function 选传 接口调用成功的回调函数
  65 + fail function 选传 接口调用失败的回调函数
  66 + complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行)
  67 + }
  68 + ```
  69 + 返回值:
  70 +
  71 + ```
  72 + void
  73 + 无
  74 + ```
  75 +
  76 + 示例1:进入普通的客服会话
  77 +
  78 + ```javascript
  79 + PCSDK.platform.openCustomerServiceConversation();
  80 + ```
  81 + 示例2:应用场景如进入客服会话跳转领取体力、钻石等等: 示例为跳转客服领取18888钻石奖励,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断)。
  82 + <iframe height=498 width=740 src="https://dep.miso-lab.com/sdkword/sdk_video_001.mp4" frameborder=0 allowfullscreen></iframe>
  83 + ```javascript
  84 + // 跳转客服领取18888钻石奖励,开发者可根据示例修改
  85 + PCSDK.platform.openCustomerServiceConversation({
  86 + showMessageCard: true,
  87 + sendMessageTitle: '钻石已发送,点击领取钻石!',
  88 + sendMessagePath: '',
  89 + sendMessageImg: 'http://dep.miso-lab.com/mergeguns/bin/res/image/service_reward.png', // 图片icon对应的域名记得加入到request和download白名单中
  90 + success: () => {
  91 + // 打开跳转客服成功,记录成功状态,在游戏全局注册的onShow监听通过判断这个状态去请求接口领取奖励
  92 + // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改
  93 + AppDataManager.I.set('service.reward.data', {
  94 + status: 1, // 可以领奖
  95 + reward: 18888 // 获得18888钻石
  96 + });
  97 + },
  98 + fail: (err) => {
  99 + console.log("openCustomerServiceConversation fail: ", err);
  100 + }
  101 + });
  102 + // 在游戏中全局注册的onShow事件监听中检测是
  103 + // 游戏入口:Main.cs
  104 + class Main {
  105 + constructor() {
  106 + this.init();
  107 + }
  108 +
  109 + private init() {
  110 + PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this));
  111 + PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this));
  112 + }
  113 +
  114 + private onShow(opts) {
  115 + // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断
  116 + let serviceRewardData = AppDataManager.I.get('service.reward.data');
  117 + if (serviceRewardData && serviceRewardData.status === 1) {
  118 + AppDataManager.I.set('service.reward.data', null);
  119 + // 奖励发放,处理发放后的逻辑,比如每天只能领取一次的记录,防止重复刷奖励
  120 + }
  121 + }
  122 +
  123 + private onHide(){
  124 + // 监听平台的onHide事件
  125 + }
  126 + }
  127 + ```
  128 + 示例3:应用场景例如进入客服会话,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断),点击右下角的充值按钮后,跳转充值,充值完成后在onShow中处理:需要后台提供api接口,验证充值合理性并发放奖励,**此接口需要后端支持**。
  129 + <iframe height=498 width=740 src="https://dep.miso-lab.com/sdkword/sdk_video_002.mp4" frameborder=0 allowfullscreen></iframe>
  130 + ```javascript
  131 + // 跳转客服充值,开发者可根据示例修改,sendMessagePath请严格按照示例中提供的参数
  132 + /**
  133 + * 充值跳转客服
  134 + * @param itemId 购买道具商品id
  135 + * @param money 购买商品花费,单位元
  136 + */
  137 + private openServiceWithItem(itemId: number, money: number) {
  138 + PCSDK.platform.openCustomerServiceConversation({
  139 + showMessageCard: true,
  140 + sendMessageTitle: `充值${money}元`,
  141 + sendMessagePath: `channel=${PCSDK.data.ChannelId}&item=${itemId}&uid=${PCSDK.data.UserId}&pf=${PCSDK.data.SystemId}`,
  142 + sendMessageImg: 'http://dep.miso-lab.com/idiom/bin/share/pay.png', // 图片icon对应的域名记得加入到request和download白名单中
  143 + success: () => {
  144 + // 打开跳转客服成功,记录成功状态,onShow通过判断这个状态去请求接口领取奖励
  145 + // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改
  146 + AppDataManager.I.set('service.pay.data', {
  147 + status: 1, // 可以领奖
  148 + itemId: itemId, // 购买道具商品id
  149 + money: money // 购买商品花费,单位元
  150 + });
  151 + },
  152 + fail: (err) => {
  153 + console.log("openCustomerServiceConversation fail: ", err);
  154 + }
  155 + });
  156 + }
  157 +
  158 + // 在游戏中全局注册的onShow事件监听中检测是
  159 + // 游戏入口:Main.cs
  160 + class Main {
  161 + constructor() {
  162 + this.init();
  163 + }
  164 +
  165 + private init() {
  166 + PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this));
  167 + PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this));
  168 + }
  169 +
  170 + private onShow(opts) {
  171 + // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断
  172 + let serviceRewardData = AppDataManager.I.get('service.pay.data');
  173 + if (serviceRewardData && serviceRewardData.status === 1) {
  174 + AppDataManager.I.set('service.pay.data', null);
  175 + // 领取奖励的逻辑,比如每天只能领取一次的记录,防止重复刷奖励
  176 + // 请求后端接口验证奖励合理性
  177 + }
  178 + }
  179 +
  180 + private onHide(){
  181 + // 监听平台的onHide事件
  182 + }
  183 + }
  184 + ```
  185 +<div id="checkUpdate"></div>
  186 +3. **checkUpdate**
  187 +
  188 + ```javascript
  189 + PCSDK.platform.checkUpdate( params?: _ShowModalObject ): void
  190 + ```
  191 + 定义:检测版本是否有更新,如果版本有更新会弹出确认框,参数可不传递,不传递有版本更新会弹出下图的默认确认框;开发者可自定义弹出框的显示样式,参数与[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html)一模一样。
  192 + 建议此api在游戏的入口调用。
  193 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_029.png "🔍点击查看大图")
  194 +
  195 + 参数:
  196 +
  197 + ```javascript
  198 + params _ShowModalObject 选传 不传递有版本更新会弹出上图样式默认确认框;开发者可自定义弹出框的显示样式,参数参照wx.showModal的参数
  199 + {
  200 + title string 选传 提示的标题,默认为:更新提示
  201 + content string 选传 提示的内容,默认为:新版本已经准备好,是否重启应用?
  202 + showCancel boolean 选传 是否显示取消按钮,默认为:false不显示
  203 + cancelText string 选传 取消按钮的文字,最多4个字符
  204 + cancelColor string 选传 取消按钮的文字颜色,必须是16进制格式的颜色字符串
  205 + confirmText string 选传 确认按钮的文字,最多4个字符
  206 + confirmColor string 选传 确认按钮的文字颜色,必须是16进制格式的颜色字符串
  207 + success function 选传 接口调用成功的回调函数
  208 + fail function 选传 接口调用失败的回调函数
  209 + complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行)
  210 + }
  211 + ```
  212 + 返回值:
  213 +
  214 + ```
  215 + void
  216 + 无
  217 + ```
  218 +
  219 + 示例:在游戏入口类中检测是否有版本更新
  220 +
  221 + 1)、依照下面的示例接入checkUpdate api
  222 +
  223 + ```javascript
  224 + class Main {
  225 + constructor() {
  226 + this.init();
  227 + }
  228 +
  229 + private init() {
  230 + this.checkUpdate();
  231 + }
  232 +
  233 + private checkUpdate() {
  234 + // 调用SDK的checkUpdate,微信版本有更新,会自动弹出更新确认框
  235 + PCSDK.platform.checkUpdate();
  236 +
  237 + // 自定义更新弹出框
  238 + /*
  239 + PCSDK.platform.checkUpdate({
  240 + showCancel: true,
  241 + content: '客官,xxx游戏有更新了!',
  242 + cancelText: '放弃'
  243 + });
  244 + */
  245 + }
  246 + }
  247 +
  248 + ```
  249 + 2)、接入代码完毕后,按照下图的操作本地开发工具调试是否接入成功。
  250 +
  251 + I、选择:添加编译模式。
  252 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_030.png "🔍点击查看大图")
  253 + II、选择:自定义模式名称、勾选下次编译时模拟更新、选择模拟成功还是失败状态,点击确定。
  254 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_031.png "🔍点击查看大图")
  255 + III、开发工具会自动重新启动游戏,弹出更新框,看到弹出框接入成功。
  256 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_032.png "🔍点击查看大图")
  257 +<div id="copy"></div>
  258 +4. **copy**
  259 +
  260 + ```javascript
  261 + PCSDK.platform.copy( str: string ): Promise<any>
  262 + ```
  263 + 定义:设置系统剪贴板的内容。提示:微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s
  264 +
  265 + 参数:
  266 +
  267 + ```javascript
  268 + str string 必传 剪贴板的内容
  269 +
  270 + ```
  271 + 返回值:
  272 +
  273 + ```
  274 + Promise<any>
  275 + Promise resolve复制系统剪贴板内容成功回调,reject失败回调
  276 + ```
  277 +
  278 + 示例:
  279 +
  280 + ```javascript
  281 + PCSDK.platform.copy('这是我想要复制的内容')
  282 + .then( ret => {
  283 + // 打印复制的内容
  284 + console.log(ret.data);
  285 + })
  286 + .catch(err => {
  287 + console.warn('复制失败', err);
  288 + });
  289 + ```
  290 +<div id="vibrate"></div>
  291 +4. **vibrateShort**
  292 +```javascript
  293 + PCSDK.platform.vibrateShort(): Promise<any>
  294 +```
  295 +定义:使手机发生较短时间的振动(15 ms)。仅在 iPhone 7 / 7 Plus 以上及 Android 机型生效
  296 +参数:
  297 +
  298 + ```javascript
  299 + 无
  300 + ```
  301 +示例:
  302 +
  303 + ```javascript
  304 + PCSDK.platform.vibrateShort();
  305 +
  306 + ```
  307 +5. **vibrateLong**
  308 +
  309 + ```javascript
  310 + PCSDK.platform.vibrateLong(): Promise<any>
  311 + ```
  312 + 定义:使手机发生较长时间的振动(400 ms)
  313 + 参数:
  314 + ```javascript
  315 + 无
  316 + ```
  317 + 示例:
  318 + ```javascript
  319 + PCSDK.platform.vibrateLong();
  320 + ```
  321 +<div id="gamePortal"></div>
  322 +6. **gamePortalShow**
  323 + ```javascript
  324 + PCSDK.platform.gamePortalShow(adUnitId: string): Promise<any>
  325 + ```
  326 + 定义:传入adUnitId创建并展示小游戏推荐弹窗组件,Promise resolve创建展示成功回调,reject创建失败回调。
  327 +
  328 + 参数:
  329 + ```javascript
  330 + adUnitId string 必传 小游戏推荐弹窗组件推荐单元id
  331 + ```
  332 + 返回值:
  333 + ```javascript
  334 + Promise<any>
  335 + Promise resolve创建展示成功回调,reject创建失败回调
  336 + ```
  337 + 示例:
  338 + ```javascript
  339 + // 例子1:显示弹窗组件
  340 + let adUnitId: string = 'PBgAAgPWNXGtCwcA';
  341 + PCSDK.platform.gamePortalShow(adUnitId);
  342 +
  343 + // 例子2:显示推荐弹窗组件,如果显示不成功,则显示小游戏插屏广告,插屏广告api使用请继续往下看。
  344 + let adUnitId: string = 'PBgAAgPWNXGtCwcA';
  345 + PCSDK.platform.gamePortalShow(adUnitId).catch(err => {
  346 + // 推荐弹窗组件显示不成功显示插屏广告
  347 + adUnitId = 'adunit-4da0ec77513f8eea';
  348 + PCSDK.platform.interstitialShow(adUnitId);
  349 + });
  350 +
  351 + ```
  352 +7. **isGamePortalPlaying**
  353 +
  354 + ```javascript
  355 + PCSDK.platform.isGamePortalPlaying(): boolean
  356 + ```
  357 +
  358 + 定义:是否正在加载小游戏推荐弹窗组件;在PCSDK.platform.gamePortalShow api内部,如果正在创建弹窗组件会在Promise reject返回错误提示信息。
  359 +
  360 + 参数:
  361 +
  362 + ```javascript
  363 + 无
  364 + ```
  365 + 返回值:
  366 +
  367 + ```javascript
  368 + boolean
  369 + ```
  370 +
  371 + 示例:
  372 +
  373 + ```javascript
  374 + let isPlaying = PCSDK.platform.isGamePortalPlaying();
  375 +
  376 + ```
  377 +<div id="interstitialAd"></div>
  378 +8. **interstitialShow**
  379 +
  380 + ```javascript
  381 + PCSDK.platform.interstitialShow(adUnitId: string): Promise<any>
  382 + ```
  383 +
  384 + 定义:传入adUnitId创建并展示小游戏插屏广告组件,Promise resolve创建展示成功回调,reject创建失败回调
  385 +
  386 + 参数:
  387 +
  388 + ```javascript
  389 + adUnitId string 必传 小游戏插屏广告组件广告单元id
  390 + ```
  391 + 返回值:
  392 +
  393 + ```javascript
  394 + Promise<any>
  395 + Promise resolve创建展示成功回调,reject创建失败回调
  396 + ```
  397 +
  398 + 示例:
  399 +
  400 + ```javascript
  401 + // 例子1:显示插屏广告组件
  402 + let adUnitId: string = 'adunit-4da0ec77513f8eea';
  403 + PCSDK.platform.interstitialShow(adUnitId);
  404 +
  405 + // 例子2:显示插屏广告组件,如果显示不成功,则显示小游戏推荐弹窗组件。
  406 + let adUnitId: string = 'adunit-4da0ec77513f8eea';
  407 + PCSDK.platform.interstitialShow(adUnitId).catch( err => {
  408 + // 加载不成功显示小游戏推荐弹窗组件
  409 + adUnitId = 'PBgAAgPWNXGtCwcA';
  410 + PCSDK.platform.gamePortalShow(adUnitId);
  411 + });
  412 + ```
  413 +9. **isInterstitialPlaying**
  414 +
  415 + ```javascript
  416 + PCSDK.platform.isInterstitialPlaying(): boolean
  417 + ```
  418 +
  419 + 定义:是否正在加载小游戏插屏广告组件;在PCSDK.platform.interstitialShow如果正在创建插屏广告会在Promise reject返回错误提示信息。
  420 +
  421 + 参数:
  422 +
  423 + ```javascript
  424 + 无
  425 + ```
  426 + 返回值:
  427 +
  428 + ```javascript
  429 + boolean
  430 + ```
  431 +
  432 + 示例:
  433 +
  434 + ```javascript
  435 + let isPlaying = PCSDK.platform.isInterstitialPlaying();
  436 +
  437 + ```
  438 +<div id="gameicon"></div>
  439 +10. **gameIconShow**
  440 + ```javascript
  441 + PCSDK.platform.gameIconShow(adUnitId: string, opts: { count: number, style: Array<_GameIconStyleItem> }): Promise<any>
  442 + ```
  443 +
  444 + 定义:创建并显示小游戏推荐icon组件。
  445 +
  446 + 参数:
  447 +
  448 + ```javascript
  449 + adUnitId string 必传 小游戏推荐icon组件广告单元id
  450 + opts object 必传 扩展参数,目前支持count和style两个属性值
  451 + {
  452 + count number 必传 游戏icon的数量,请注意,正式版下面渲染出来的icon数量会小于等于count,请注册做好样式兼容
  453 + style Array<_GameIconStyleItem> 必传 数组的每一项可以针对对应的icon设置位置和样式等信息,style的每一项称为_GameIconStyleItem
  454 + }
  455 +
  456 + Object _GameIconStyleItem:单个游戏icon的位置和样式信息
  457 + {
  458 + appNameHidden boolean 必传 游戏名称是否隐藏
  459 + color string 必传 游戏名称的颜色色值
  460 + size number 必传 游戏icon的宽高值
  461 + borderWidth number 必传 游戏icon的border尺寸
  462 + borderColor string 必传 游戏icon的border颜色色值
  463 + left number 必传 游戏icon的X轴坐标
  464 + top number 必传 游戏icon的Y轴坐标
  465 + }
  466 + ```
  467 + 返回值:
  468 +
  469 + ```javascript
  470 + Promise<any>
  471 + Promise resolve创建展示成功回调,reject创建失败回调
  472 + ```
  473 +
  474 + 示例:
  475 +
  476 + ```javascript
  477 + // 显示1个推荐icon组件
  478 + private showGameIcon(){
  479 + let adUnitId: string = 'PBgAAgPWNXGkQ4p0';
  480 + let {windowWidth} = PCSDK.platform.getSystemData();
  481 + PCSDK.platform.gameIconShow(adUnitId, {
  482 + count: 1,
  483 + style: [
  484 + {
  485 + appNameHidden: false,
  486 + color: "#FF0000",
  487 + size: 50,
  488 + borderWidth: 0,
  489 + borderColor: "#FF0000",
  490 + left: (windowWidth / 750) * 550,
  491 + top: (windowWidth / 750) * 150
  492 + }
  493 + ]
  494 + })
  495 + .then(() => {
  496 + // console.warn('显示GameIcon成功');
  497 + })
  498 + .catch((err) => {
  499 + // console.warn('显示GameIcon失败');
  500 + });
  501 + }
  502 +
  503 + ```
  504 +11. **gameIconDestroy**
  505 +
  506 + ```javascript
  507 + PCSDK.platform.gameIconDestroy(): void
  508 + ```
  509 +
  510 + 定义:销毁正在展示的小游戏推荐icon组件。展示推荐icon组件广告后,请记得在页面关闭时候调用此api销毁GameIcon。
  511 +
  512 + 参数:
  513 +
  514 + ```javascript
  515 + 无
  516 + ```
  517 + 返回值:
  518 +
  519 + ```javascript
  520 + void
  521 + ```
  522 +
  523 + 示例:
  524 +
  525 + ```javascript
  526 +
  527 + private open(){
  528 + super.open();
  529 + this.showGameIcon();
  530 + }
  531 +
  532 + private close(){
  533 + super.close();
  534 + this.destoryGameIcon();
  535 + }
  536 +
  537 + // 显示2个推荐icon组件
  538 + private showGameIcon(){
  539 + let adUnitId: string = 'PBgAAgPWNXGkQ4p0';
  540 + let {windowWidth} = PCSDK.platform.getSystemData();
  541 + PCSDK.platform.gameIconShow(adUnitId, {
  542 + count: 2,
  543 + style: [
  544 + {
  545 + appNameHidden: false,
  546 + color: "#FF0000",
  547 + size: 50,
  548 + borderWidth: 0,
  549 + borderColor: "#FF0000",
  550 + left: (windowWidth / 750) * 450,
  551 + top: (windowWidth / 750) * 150
  552 + },
  553 + {
  554 + appNameHidden: false,
  555 + color: "#FF0000",
  556 + size: 50,
  557 + borderWidth: 0,
  558 + borderColor: "#FF0000",
  559 + left: (windowWidth / 750) * 550,
  560 + top: (windowWidth / 750) * 150
  561 + }
  562 + ]
  563 + })
  564 + .then(() => {
  565 + // console.warn('显示GameIcon成功');
  566 + })
  567 + .catch((err) => {
  568 + // console.warn('显示GameIcon失败');
  569 + });
  570 + }
  571 +
  572 + // 销毁展示创建的GameIcon组件
  573 + private destoryGameIcon(){
  574 + PCSDK.platform.gameIconDestroy();
  575 + }
  576 +
  577 + ```
0 578 \ No newline at end of file
... ...
outer/share.md 0 → 100644
... ... @@ -0,0 +1,539 @@
  1 +
  2 +# 分享视频模块
  3 +
  4 +------
  5 +
  6 +#### **简介**
  7 +小游戏生态中,普遍把平台提供的分享/视频接口更多用于某个奖励领取、获取n倍奖励、游戏死亡复活、转盘额外次数获得等等一种有效途径(分享:拉取新用户,视频:赚钱广告费);噗嗤游戏在分享or视频推送不断的探索迭代中,总结了一套分享/视频积分策略,集成在SDK中开放给开发者,开发者只需对游戏中分享视频功能点命名一个英文名称key(分享视频key),这个key关联分享文案、分享图、分享开关(推送类型)、视频uid等等在后台配置好,使用SDK提供的一个dispatch api传入英文名称key即可完成接入工作。
  8 +
  9 +- 分享/视频配置可以让开发者在后台中动态修改相关功能点的分享/视频配置内容。
  10 +
  11 +- 新增某个功能的分享点配置、在线修改相关功能点的分享图或文案、在线切换某个功能点按钮的分享/视频推送类型。
  12 +
  13 +- 调用SDK的dispatch api,dispatch会根据后台配置的分享开关(推送类型)自动进行分发:推送分享还是视频全权交由SDK去处理,开发者只需要传入成功/失败回调函数,成功回调函数处理发放领取奖励、n倍奖励、成功复活等操作,失败回调函数处理参数传递的msg信息。
  14 +
  15 +#### **疑惑解答**
  16 +1. 为什么要引入这个模块?
  17 +
  18 + > 游戏中很多n倍奖励、复活、额外奖励等功能点通常需要分享或者视频才能额外获得,游戏上线后,运营很有可能会对某些功能点有额外的需求修改:a功能点获取由分享改成视频方式获取、b功能点由视频改成分享方式获取、c功能点需要在前面n次看视频获得后全是分享获得、为某某功能的分享图想换一个、拉取视频不成功自动切换分享等等;为了应对这些不同情形,我们把分享和视频点包装成一个模块,a功能点也不在局限于只是简单的分享、b功能只是视频,而是通过后台分享开关去灵活切换。所有功能点入口调用都是使用dispatch,每个功能点都是转化为一个分享视频key在后台管理。
  19 +
  20 +2. 什么是分享视频key?
  21 +
  22 + > 分享视频key是一个功能点的英文名称,这个key配置在后台中,关联分享文案、分享图、分享开关(推送类型)、视频uid等等信息。某个功能点(不论是分享还是视频方式)调用dispatch传入这个key,SDK会读取这个key关联的信息,根据分享开关(推送类型)来推送分享(需要分享文案、分享图)还是推送视频(需要视频uid)。
  23 +
  24 +3. 什么是分享视频分发?
  25 +
  26 + > 调用dispatch api传入分享视频key,SDK会查找这个key在后台配置的数据,SDK读取数据中分享开关(推送类型)的字段信息,通过这个开关类型来判断推给用户是分享还是视频,这个根据类型来推送的操作就是分发操作。
  27 +
  28 +4. 游戏中之前是玩家分享n次后变成看视频或者是看视频n次后全是分享,dispatch能满足吗?
  29 +
  30 + > 上面的问题dispatch也同样支持,还是同样的调用方式,不需要做其他额外处理,dispatch是怎么做到的了:分享开关(推送类型)有一个分享积分选择项,这个选项就是通过积分策略实现了上面问题。
  31 + >
  32 +
  33 +
  34 +#### **后台使用**
  35 +
  36 +配置分享视频配置,登录后台->头部tab切换到【游戏数据】->【配置相关】->【分享/视频配置】可新增、编辑修改分享/视频内容:
  37 +
  38 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_023.png "🔍点击查看大图")
  39 +
  40 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_024.png "🔍点击查看大图")
  41 +
  42 +接入分享视频模块后,后台已经对分享和视频数据分别进行整理统计了,游戏接入方可实时查看分享/视频的各项数据:
  43 +
  44 +查看分享分析,登录后台->头部tab切换到【游戏数据】->【产品分析】->【分享分析】可阅览游戏分享数据的各项统计:
  45 +
  46 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_025.png "🔍点击查看大图")
  47 +
  48 +查看视频广告详情,登录后台->头部tab切换到【游戏数据】->【配置相关】->【视频广告详情】可阅览游戏各个功能点视频数据统计:
  49 +
  50 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_026.png "🔍点击查看大图")
  51 +
  52 +
  53 +
  54 +#### **接入必读**
  55 +
  56 +- 接入此模块前,请[**前往sdk/config.js文件中配置【IsUseShareModule: true 】开启分享视频模块功能**](install.md#config_env),此参数配置为true,才能正常使用此模块的功能,SDK启动时会自动拉取后台配置所有功能点的分享/视频配置列表。
  57 +
  58 +- <font color="#FF0000">微信小游戏开发者接入此模块,如果游戏有很多分享点,提审时避免触犯微信平台的[滥用分享行为](https://developers.weixin.qq.com/minigame/product/#_5-1-滥用分享行为),在后台【配置参数】中配置了一个SDK内部使用的[配置参数](online.md)share_unlock,进行分享开关切换:1(开启)0(关闭),提审时设置为0,审核通过后设为1。share_unlock设置为0,所有的功能点不会分享完成、拉起看完视频后发放奖励,而是直接发放奖励,这样就能避免审核时,如果是推送分享拉起分享,被微信认为是诱导分享,被拒的可能性。
  59 +
  60 +- sdk/config.js的配置参数ShareRightKey,表示右上角分享的分享视频key,请配置到后台【分享/视频配置】中。如果ShareRightKey配置不为空,SDK会自动调用微信的右上角分享接口(wx.onShareAppMessage),实现右上角分享功能,注意的是开发者在游戏中已经有注册wx.onShareAppMessage需要删除掉,不然游戏中onShareAppMessage的注册事件会把SDK中的注册事件处理函数覆盖掉,导致还是使用的是开发者注册的右上角分享功能。
  61 +
  62 +- sdk/config.js的配置参数ShareData表示默认分享视频配置,此条配置应用在两种情况下:
  63 +
  64 + > 1、请求功能点的分享/视频配置列表出错,使用key去查找对应的分享配置肯定是查找不到的,会读取此条默认数据。
  65 + >
  66 + >
  67 + >
  68 + > 2、请求功能点的分享/视频配置列表成功了,但是这个key没有配置到后台,也会读取此条默认数据
  69 +
  70 +#### **接入**API:
  71 +
  72 +| **名称** | **功能说明** |
  73 +| ------------------------------- | ------------------------------------------------------------ |
  74 +| PCSDK.shareVideo.share | 普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 |
  75 +| PCSDK.shareVideo.dispatch | 分享视频分发入口,传入功能点英文命名的分享/视频key |
  76 +| PCSDK.shareVideo.getShareVideoType | 根据功能点在后台配置的分享/视频key,得到此功能点分享开关(推送类型)SDK计算得到最终推送类型:-1(无视频无分享)、0(分享)、1(异步分享)、5(分享积分)、2(视频)、3(无视频则分享)、4(视频和分享)(控制分享和视频两个按钮的显示) |
  77 +
  78 +
  79 +
  80 +1. ##### **share**
  81 +
  82 + ```javascript
  83 + PCSDK.shareVideo.share(key:sring, params?: any, opts?: any): void
  84 + ```
  85 +
  86 + 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。
  87 +
  88 + 参数:
  89 +
  90 + ```javascript
  91 + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key)
  92 +
  93 + params: object 选传 扩展参数:分享链接query携带自定义参数,{ key: value }对象形式,该对象传递的参数会与SDK内部query参数一起组成query(查询参数, key1=val1&key2=val2的格式)的值,SDK内部参数key有:channel_id、user_invite_uid、share_id、share_key。
  94 +
  95 + 提示:params传递的对象中如果含有传递SDK内部query参数key,会被SDK内部参数值覆盖,所以开发者避免传递这些key。
  96 +
  97 + opts: object 选传 可不传递
  98 +
  99 + ```
  100 +
  101 + 返回值:
  102 +
  103 + ```javascript
  104 + void
  105 + ```
  106 +
  107 + 示例:游戏首页分享到群的功能,假如config.js配置的ChannelId: 20024;后台配置的分享视频key: home_share2group、此分享key的id:512;用户id:100000。
  108 +
  109 + ```javascript
  110 + // 示例1:
  111 + // 分享后生成的query:share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000
  112 + PCSDK.shareVideo.share( 'home_share2group' );
  113 +
  114 + // 示例2:第二个参数是分享生成的query携带的参数
  115 + // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000
  116 + PCSDK.shareVideo.share( 'home_share2group', {
  117 + type:99
  118 + });
  119 +
  120 + // 示例3:第二个参数是分享生成的query携带的参数,传递SDK内部query参数:channel_id
  121 + // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000
  122 + PCSDK.shareVideo.share( 'home_share2group', {
  123 + type:99,
  124 + channel_id:10000
  125 + });
  126 + ```
  127 +
  128 +2. ##### **dispatch**
  129 +
  130 + ```javascript
  131 + PCSDK.shareVideo.dispatch( key: string, params?: { success: Function, fail: Function, context?: any} ): void
  132 + ```
  133 +
  134 + 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。
  135 +
  136 + 参数:
  137 +
  138 + ```javascript
  139 + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key)
  140 +
  141 + params: object 选传 扩展参数:success分享视频成功回调处理函数,fail分享视频失败回调处理函数,contex函数执行上下文
  142 + {
  143 + success: ( from:number, ret: any | null ) => void,
  144 + error: ( from:number, error: object | null ) => void,
  145 + context: any
  146 + }
  147 +
  148 + from:此次分发成功推送类型
  149 + from返回枚举值为:
  150 + 0:无视频无分享(后台配置分享开关(推送类型)or 应对审核分享关闭:配置参数share_unlock设置为0)
  151 + 1:推送同步分享
  152 + 2:推送异步分享
  153 + 3:推送视频
  154 +
  155 + error:此次分发失败的错误消息
  156 + error返回枚举值为:
  157 + { code: 1000, msg: '要看完视频哦!' },
  158 + { code: 1001, msg: '视频加载失败!' },
  159 + { code: 999, msg: '视频UID不存在!' },
  160 + { code: 1002, msg: '视频组件未开放!' },
  161 + { code: 1003, msg: '正在观看视频中...' },
  162 + { code: 1004, msg: '分享失败,请尝试发送至不同群!' },
  163 + { code: 1005, msg: '别总骚扰这个群,换个群分享吧!' },
  164 + { code: 1006, msg: '请分享到群哦!' },
  165 + { code: 1007, msg: '分享到群才能领取更多~' },
  166 + { code: 1008, msg: '分享失败,请尝试发送至不同群!' },
  167 + { code: 1009, msg: '今日已达分享上限次数,请明日再来' }
  168 + ```
  169 +
  170 + 返回值:
  171 +
  172 + ```javascript
  173 + void
  174 + ```
  175 +
  176 + 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。
  177 +
  178 + 演示
  179 +
  180 + ```javascript
  181 + // DiamondDoublePopwin.ts文件
  182 + export default class DiamondDoublePopwin extends BaseView{
  183 + protected addEvent() {
  184 + super.addEvent();
  185 + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用)
  186 + this.btnFree.on(Laya.Event.CLICK, this, this.onReward);
  187 + // 分享双倍
  188 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward);
  189 + // 视频双倍
  190 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward);
  191 + }
  192 +
  193 + protected removeEvent() {
  194 + super.removeEvent();
  195 + this.btnFree.off(Laya.Event.CLICK, this, this.onReward);
  196 + this.btnShare.off(Laya.Event.CLICK, this, this.onReward);
  197 + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward);
  198 + }
  199 +
  200 + // 领取奖励操作
  201 + private onReward(){
  202 + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), {
  203 + success: this.handleReward,
  204 + fail: this.handleError,
  205 + context: this
  206 + } );
  207 + }
  208 +
  209 + // 分享/视频成功后回调处理函数:发奖励
  210 + private handleReward(from: ShareVideoFrom, ret: any | null){
  211 + // 分享成功、视频成功、无视频无分享
  212 + }
  213 +
  214 + // 分享/视频失败后回调处理函数:弹出提示
  215 + private handleError(from: ShareVideoFrom, error: any | null){
  216 + // 返回错误,处理错误msg信息,自定义处理
  217 + if( error ){
  218 + wx.showToast({
  219 + title: error.msg
  220 + });
  221 + }
  222 + }
  223 + }
  224 +
  225 + // Enums.ts文件
  226 + // 分享视频key枚举,每个key表示一个功能点
  227 + enum ShareVideoKeys {
  228 + // 钻石双倍获取
  229 + DiamondDouble = 'diamond_double',
  230 + // 失败获得双倍奖励
  231 + FailRewardDouble = 'fail_reward_double'
  232 + }
  233 +
  234 + // 分享视频功能点最终处理方式
  235 + enum ShareVideoFrom{
  236 + None = 0, // 无视频无分享
  237 + Share = 1, // 分享
  238 + ShareAsync = 2, // 异步分享
  239 + Video = 3, // 看视频
  240 + }
  241 + ```
  242 +
  243 +3. ##### **getShareVideoType**
  244 +
  245 + ```javascript
  246 + PCSDK.shareVideo.getShareVideoType( key: string ): number
  247 + ```
  248 +
  249 + 定义:根据分享视频key获取此次shareVideo模块推送的分享视频类型值:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分);此api用于通过得到的类型值处理页面的ui状态(微信和QQ平台对按钮的icon有强制限制):显示视频icon、显示分享icon、既没有分享icon,也没有视频icon。
  250 +
  251 + 参数:
  252 + ```javascript
  253 + key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key)
  254 + ```
  255 +
  256 + 返回值:
  257 +
  258 + ```javascript
  259 + number
  260 + 返回值此次点击功能按钮触发的推送类型:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分)
  261 + 分享视频类型枚举值如下:
  262 + // 推送类型:分享视频类型枚举
  263 + enum ShareVideoType {
  264 + None = -1, // -1无分享无视频
  265 + Share = 0, // 0分享
  266 + ShareAysnc = 1, // 1异步分享
  267 + ShareIntegral = 5, // 5分享积分
  268 + Video = 2, // 2看视频
  269 + VideoToShare = 3, // 3无视频则分享
  270 + VideoAndShare = 4 // 4视频和分享(控制分享和视频两个按钮的显示) ,
  271 + }
  272 + ```
  273 +
  274 + 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。
  275 +
  276 + ```javascript
  277 + // DiamondDoublePopwin.ts文件
  278 + export default class DiamondDoublePopwin extends BaseView{
  279 + protected addEvent() {
  280 + super.addEvent();
  281 + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用)
  282 + this.btnFree.on(Laya.Event.CLICK, this, this.onReward);
  283 + // 分享双倍
  284 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward);
  285 + // 视频双倍
  286 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward);
  287 + }
  288 +
  289 + protected removeEvent() {
  290 + super.removeEvent();
  291 + this.btnFree.off(Laya.Event.CLICK, this, this.onReward);
  292 + this.btnShare.off(Laya.Event.CLICK, this, this.onReward);
  293 + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward);
  294 + }
  295 +
  296 + // 每次打开此popwin执行onOpen
  297 + protected onOpen(){
  298 + super.onOpen();
  299 + this.iniitRewardUI();
  300 + }
  301 +
  302 + // 初始化/更新获得奖励按钮ui
  303 + private initRewardUI() {
  304 + let shareVideoType: ShareVideoType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString());
  305 + switch (shareVideoType) {
  306 + case ShareVideoType.Share: // 同步分享
  307 + case ShareVideoType.ShareAysnc: // 异步分享
  308 + case ShareVideoType.ShareIntegral: // 分享积分
  309 + this.btnFree.visible = false;
  310 + this.btnShare.visible = true;
  311 + this.btnVideo.visible = false;
  312 + break;
  313 +
  314 + case ShareVideoType.Video: // 推送视频
  315 + case ShareVideoType.VideoToShare: // 无视频则分享
  316 + // 视频ui状态
  317 + this.btnFree.visible = false;
  318 + this.btnShare.visible = false;
  319 + this.btnVideo.visible = true;
  320 + break;
  321 +
  322 + default: // 无视频和无分享
  323 + // 既不显示分享ui又不显示视频ui,直接领奖ui状态
  324 + this.btnFree.visible = true;
  325 + this.btnShare.visible = false;
  326 + this.btnVideo.visible = false;
  327 + break;
  328 + }
  329 + }
  330 +
  331 + // 领取奖励操作
  332 + private onReward(){
  333 + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), {
  334 + success: this.handleReward,
  335 + fail: this.handleError,
  336 + context: this
  337 + } );
  338 + }
  339 +
  340 + // 分享/视频成功后回调处理函数:发奖励
  341 + private handleReward(from: ShareVideoFrom, ret: any | null){
  342 + // 分享成功、视频成功、无视频无分享
  343 + }
  344 +
  345 + // 分享/视频失败后回调处理函数:弹出提示
  346 + private handleError(from: ShareVideoFrom, error: any | null){
  347 + // 返回错误,处理错误msg信息,自定义处理
  348 + if( error ){
  349 + wx.showToast({
  350 + title: error.msg
  351 + });
  352 + }
  353 + }
  354 + }
  355 +
  356 + // Enums.ts文件
  357 + // 分享视频类型(与后台一一对应)
  358 + export enum ShareVideoType {
  359 + None = -1, // -1无分享无视频
  360 + Share = 0, // 0同步分享
  361 + ShareAysnc = 1, // 1异步分享
  362 + ShareIntegral = 5, // 5分享积分
  363 + Video = 2, // 2看视频
  364 + VideoToShare = 3, // 3无视频则分享
  365 + VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示)
  366 + }
  367 +
  368 + // 分享视频key枚举,每个key表示一个功能点
  369 + enum ShareVideoKeys {
  370 + // 钻石双倍获取
  371 + DiamondDouble = 'diamond_double',
  372 + // 失败获得双倍奖励
  373 + FailRewardDouble = 'fail_reward_double'
  374 + }
  375 +
  376 + // 分享视频功能点最终推送类型
  377 + enum ShareVideoFrom{
  378 + None = 0, // 无视频无分享
  379 + Share = 1, // 分享
  380 + ShareAsync = 2, // 异步分享
  381 + Video = 3, // 看视频
  382 + }
  383 +
  384 + ```
  385 + <div id="detail"></div>
  386 + 下面演示dispatch和getShareVideoType两个api的完整使用,Laya引擎开发:
  387 +
  388 + 页面功能点按钮做三个状态:
  389 +
  390 + 1、看视频状态(显示视频icon)
  391 +
  392 + 2、分享状态(显示分享icon)
  393 +
  394 + 3、直接领奖(没有icon,审核状态)
  395 +
  396 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_1.png "🔍点击查看大图")
  397 +
  398 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_2.png "🔍点击查看大图")
  399 +
  400 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_3.png "🔍点击查看大图")
  401 +
  402 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_4.png "🔍点击查看大图")
  403 +
  404 + 例如,一个领取钻石双倍,页面的按钮ui通过下面的方式进行切换
  405 +
  406 + 1、页面做三个按钮:视频icon按钮、分享icon按钮、直接领取按钮
  407 +
  408 + 2、进入页面根据配置的key获取类型,显示对应类型ui:调用下面的initRewardUI(可随意命名)
  409 +
  410 + 3、<font color="#FF0000">分享或者视频后,SDK会发送一个tactic.update的消息过来,使用PCSDK.event.add注册监听,PCSDK.event.remove移除监听(PCSDK.event详细了解请查看[事件模块](event.md)),监听事件处理下一次推送显示ui状态:执行一下initRewardUI。</font>
  411 +
  412 + 4、给三个按钮都注册事件:onReward
  413 + ```javascript
  414 + // DiamondDoublePopwin.ts文件
  415 + export default class DiamondDoublePopwin extends BaseView {
  416 + protected addEvent() {
  417 + super.addEvent();
  418 + // 免费领取双倍(应对微信审核,审核分享不能开放时候使用)
  419 + this.btnFree.on(Laya.Event.CLICK, this, this.onReward);
  420 + // 分享双倍
  421 + this.btnShare.on(Laya.Event.CLICK, this, this.onReward);
  422 + // 视频双倍
  423 + this.btnVideo.on(Laya.Event.CLICK, this, this.onReward);
  424 + // PCSDK.event.add注册监听SDK发送的消息:tactic.update,更新获得奖励按钮ui
  425 + PCSDK.event.add('tactic.update', this.initRewardUI, this);
  426 + }
  427 +
  428 + protected removeEvent() {
  429 + super.removeEvent();
  430 + this.btnFree.off(Laya.Event.CLICK, this, this.onReward);
  431 + this.btnShare.off(Laya.Event.CLICK, this, this.onReward);
  432 + this.btnVideo.off(Laya.Event.CLICK, this, this.onReward);
  433 + // PCSDK.event.remove移除监听SDK发送的消息:tactic.update
  434 + PCSDK.event.remove('tactic.update', this.initRewardUI, this);
  435 + }
  436 +
  437 + // 每次打开此popwin执行onOpen
  438 + protected onOpen(){
  439 + super.onOpen();
  440 + // 界面打开
  441 + this.initRewardUI();
  442 + }
  443 +
  444 + // 领取奖励操作
  445 + private onReward(){
  446 + PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), {
  447 + success: this.handleReward,
  448 + context: this
  449 + } );
  450 + }
  451 +
  452 + // 分享/视频成功后回调处理函数:发奖励
  453 + private handleReward(from: ShareVideoFrom, ret: any | null){
  454 + // 分享成功、视频成功、无视频无分享
  455 + }
  456 +
  457 + // 分享/视频失败后回调处理函数:弹出提示
  458 + private handleError(from: ShareVideoFrom, error: any | null){
  459 + // 返回错误,处理错误msg信息,自定义处理
  460 + if( error ){
  461 + wx.showToast({
  462 + title: error.msg
  463 + });
  464 + }
  465 + }
  466 +
  467 + // 初始化/更新获得奖励按钮ui
  468 + private initRewardUI() {
  469 + let shareVideoType: ShareType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString());
  470 + switch (shareVideoType) {
  471 + case ShareVideoType.Share: // 同步分享
  472 + case ShareVideoType.ShareAysnc: // 异步分享
  473 + case ShareVideoType.ShareIntegral: // 分享积分
  474 + // 分享ui状态
  475 + this.stat_share.play(0,false);
  476 + // 等同于
  477 + // this.btnFree.visible = false;
  478 + // this.btnShare.visible = true;
  479 + // this.btnVideo.visible = false;
  480 + break;
  481 +
  482 + case ShareVideoType.Video: // 视频
  483 + case ShareVideoType.VideoToShare: // 无视频则分享
  484 + // 视频ui状态
  485 + this.stat_video.play(0,false);
  486 + // 等同于
  487 + // this.btnFree.visible = false;
  488 + // this.btnShare.visible = false;
  489 + // this.btnVideo.visible = true;
  490 + break;
  491 +
  492 + default: // 无视频和无分享
  493 + // 既不显示分享ui又不显示视频ui,直接领奖ui状态
  494 + this.stat_free.play(0,false);
  495 + // 等同于
  496 + // this.btnFree.visible = true;
  497 + // this.btnShare.visible = false;
  498 + // this.btnVideo.visible = false;
  499 + break;
  500 + }
  501 + }
  502 + }
  503 +
  504 + // Enums.ts文件
  505 + // 分享视频类型(与后台一一对应)
  506 + export enum ShareVideoType {
  507 + None = -1, // -1无分享无视频
  508 + Share = 0, // 0同步分享
  509 + ShareAysnc = 1, // 1异步分享
  510 + ShareIntegral = 5, // 5分享积分
  511 + Video = 2, // 2看视频
  512 + VideoToShare = 3, // 3无视频则分享
  513 + VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示)
  514 + }
  515 +
  516 + // 分享视频key枚举,每个key表示一个功能点
  517 + enum ShareVideoKeys {
  518 + // 钻石双倍获取
  519 + DiamondDouble = 'diamond_double',
  520 + // 失败获得双倍奖励
  521 + FailRewardDouble = 'fail_reward_double'
  522 + }
  523 +
  524 + // 分享视频功能点最终推送类型
  525 + enum ShareVideoFrom{
  526 + None = 0, // 无视频无分享
  527 + Share = 1, // 分享
  528 + ShareAsync = 2, // 异步分享
  529 + Video = 3, // 看视频
  530 + }
  531 + ```
  532 +
  533 +
  534 +
  535 +#### **终章:**
  536 +
  537 +这个模块的内容点比较多,接入的注意事项也比较多,望接入者细度使用说明和理解示例意图。
  538 +
  539 +<font color="#FF0000">噗嗤游戏的小伙伴在开发公司内部游戏中使用此模块,简单封装了SDK分享视频模块的几个通用方法,提供开发者参考,</font>**[点击下载](https://dep.miso-lab.com/sdkword/tools/sdk-share-tools-1.0.0.zip)**。
... ...
outer/stat.md 0 → 100644
... ... @@ -0,0 +1,255 @@
  1 +# 启动注册打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。
  8 +
  9 +
  10 +
  11 +#### **后台使用**
  12 +
  13 +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息:
  14 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png)
  15 +
  16 +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息:
  17 +
  18 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png)
  19 +
  20 +
  21 +
  22 +
  23 +
  24 +#### **接入API:**
  25 +
  26 +| **名称** | **功能说明** |
  27 +| ------------------------ | ------------------------------------------------------------ |
  28 +| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 |
  29 +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) |
  30 +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 |
  31 +
  32 +
  33 +
  34 +接入流程图:
  35 +
  36 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png)
  37 +
  38 +1. **setLoginInfo**
  39 + <div id="stat_login"></div>
  40 + ```javascript
  41 + PCSDK.stat.setLoginInfo( data: object ): void
  42 + ```
  43 +
  44 + 定义:游戏成功登录到服务器,获取到openId和用户信息:<font color="#FF0000">openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息</font>
  45 +
  46 + 参数:
  47 +
  48 + ```javascript
  49 + data: object
  50 +{
  51 + openId: string 必传,openId
  52 + regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒)
  53 + }
  54 + ```
  55 + 返回值:
  56 +
  57 + ```javascript
  58 + 无
  59 + ```
  60 +
  61 + 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。
  62 + 该示例,只是模拟使用环境。
  63 +
  64 + ```javascript
  65 + // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。
  66 + Api.login().then( data => {
  67 + let { user_openid, user_reg_time } = data;
  68 + PCSDK.stat.setLogind({
  69 + openId: user_openid, // openId
  70 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  71 + });
  72 + });
  73 + ```
  74 +
  75 +2. **loadingFinish**
  76 +
  77 + ```javascript
  78 + PCSDK.stat.loadingFinish(): Promise<any>
  79 + ```
  80 +
  81 + 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成)
  82 +
  83 + 参数:
  84 +
  85 + ```
  86 + 无
  87 + ```
  88 + 返回值:
  89 +
  90 + ```javascript
  91 + Promise<any>
  92 + Promise resolve 加载打点成功完成回调
  93 + ```
  94 +
  95 + 示例:
  96 +
  97 + ```javascript
  98 + private async initEnv() {
  99 + await SDKTools.env(Const.VERSION);
  100 + this.loadRes();
  101 + this.loadLogin();
  102 + }
  103 +
  104 + // 开始加载资源
  105 + private loadRes() {
  106 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  107 + }
  108 +
  109 + // 资源加载完成
  110 + private onLoadedMain() {
  111 + // 打点:loadingFinish
  112 + PCSDK.stat.loadingFinish();
  113 + }
  114 +
  115 + // 更新资源加载进度条
  116 + private onProgressMain(ret) {
  117 + let progress = ret.data;
  118 + this.skin.txtProgress.text = Math.floor(progress * 100) + '%';
  119 + }
  120 + ```
  121 +
  122 +3. **active**
  123 +
  124 + ```javascript
  125 + PCSDK.stat.active(): void
  126 + ```
  127 +
  128 + 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式:
  129 + 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。
  130 +
  131 + 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。
  132 +
  133 + 参数:
  134 +
  135 + ```javascript
  136 + 无
  137 + ```
  138 + 返回值:
  139 +
  140 + ```javascript
  141 + void
  142 + 无
  143 + ```
  144 +
  145 + 示例:
  146 +
  147 + ```javascript
  148 + // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active
  149 + // 资源加载loading界面
  150 + class LoadingScene(){
  151 + constructor(){
  152 + // 登录
  153 + this.login();
  154 + // 加载资源
  155 + this.loadResouce();
  156 + }
  157 +
  158 + /**
  159 + * 登录
  160 + */
  161 + private login(){
  162 + Api.login().then( data => {
  163 + let { user_openid, user_reg_time } = data;
  164 + // 打点:设置用户信息
  165 + PCSDK.stat.setLoginInfo({
  166 + openId: user_openid, // openId
  167 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  168 + });
  169 + });
  170 + }
  171 +
  172 + /**
  173 + * 加载资源
  174 + */
  175 + private loadResouce(){
  176 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  177 + }
  178 +
  179 + /**
  180 + * 加载资源完成回调监听
  181 + */
  182 + private onLoadedMain(){
  183 + // 打点:加载资源完成
  184 + PCSDK.stat.loadingFinish().then( () => {
  185 + // 打点:用户活跃注册打点
  186 + PCSDK.stat.active();
  187 +
  188 + // 进入home主页场景
  189 + SceneManager.I.switchScene(HomeScene);
  190 + });
  191 + }
  192 + }
  193 +
  194 + // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。
  195 + // 资源加载loading界面
  196 + class LoadingScene(){
  197 + constructor(){
  198 + // 登录
  199 + this.login();
  200 + // 加载资源
  201 + this.loadResouce();
  202 + }
  203 +
  204 + /**
  205 + * 登录
  206 + */
  207 + private login(){
  208 + Api.login().then( data => {
  209 + let { user_openid, user_reg_time } = data;
  210 + // 打点:设置用户信息
  211 + PCSDK.stat.setLoginInfo({
  212 + openId: user_openid, // openId
  213 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  214 + });
  215 + });
  216 + }
  217 +
  218 + /**
  219 + * 加载资源
  220 + */
  221 + private loadResouce(){
  222 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  223 + }
  224 +
  225 + /**
  226 + * 加载资源完成回调监听
  227 + */
  228 + private onLoadedMain(){
  229 + // 打点:加载资源完成
  230 + PCSDK.stat.loadingFinish().then( () => {
  231 + // 进入home主页场景
  232 + SceneManager.I.switchScene(HomeScene);
  233 + });
  234 + }
  235 + }
  236 +
  237 + // Home页面
  238 + class HomeScene(){
  239 + constructor(){
  240 + this.btnStarGame.on('click', this.onGame, this);
  241 + }
  242 +
  243 + /**
  244 + * 按钮点击开始游戏
  245 + */
  246 + private onGame(){
  247 + // 打点:用户活跃注册打点
  248 + PCSDK.stat.active();
  249 +
  250 + // 进入游戏页面
  251 + SceneManager.I.switchScene(GameScene);
  252 + }
  253 + }
  254 +
  255 + ```
0 256 \ No newline at end of file
... ...
outer/stat_active.md 0 → 100644
... ... @@ -0,0 +1,255 @@
  1 +# 启动注册打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。
  8 +
  9 +
  10 +
  11 +#### **后台使用**
  12 +
  13 +完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息:
  14 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png)
  15 +
  16 +点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息:
  17 +
  18 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png)
  19 +
  20 +
  21 +
  22 +
  23 +
  24 +#### **接入API:**
  25 +
  26 +| **名称** | **功能说明** |
  27 +| ------------------------ | ------------------------------------------------------------ |
  28 +| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 |
  29 +| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) |
  30 +| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 |
  31 +
  32 +
  33 +
  34 +接入流程图:
  35 +
  36 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png)
  37 +
  38 +1. **setLoginInfo**
  39 + <div id="stat_login"></div>
  40 + ```javascript
  41 + PCSDK.stat.setLoginInfo( data: object ): void
  42 + ```
  43 +
  44 + 定义:游戏成功登录到服务器,获取到openId和用户信息:<font color="#FF0000">openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息</font>
  45 +
  46 + 参数:
  47 +
  48 + ```javascript
  49 + data: object
  50 +{
  51 + openId: string 必传,openId
  52 + regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒)
  53 + }
  54 + ```
  55 + 返回值:
  56 +
  57 + ```javascript
  58 + 无
  59 + ```
  60 +
  61 + 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。
  62 + 该示例,只是模拟使用环境。
  63 +
  64 + ```javascript
  65 + // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。
  66 + Api.login().then( data => {
  67 + let { user_openid, user_reg_time } = data;
  68 + PCSDK.stat.setLogind({
  69 + openId: user_openid, // openId
  70 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  71 + });
  72 + });
  73 + ```
  74 +
  75 +2. **loadingFinish**
  76 +
  77 + ```javascript
  78 + PCSDK.stat.loadingFinish(): Promise<any>
  79 + ```
  80 +
  81 + 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成)
  82 +
  83 + 参数:
  84 +
  85 + ```
  86 + 无
  87 + ```
  88 + 返回值:
  89 +
  90 + ```javascript
  91 + Promise<any>
  92 + Promise resolve 加载打点成功完成回调
  93 + ```
  94 +
  95 + 示例:
  96 +
  97 + ```javascript
  98 + private async initEnv() {
  99 + await SDKTools.env(Const.VERSION);
  100 + this.loadRes();
  101 + this.loadLogin();
  102 + }
  103 +
  104 + // 开始加载资源
  105 + private loadRes() {
  106 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  107 + }
  108 +
  109 + // 资源加载完成
  110 + private onLoadedMain() {
  111 + // 打点:loadingFinish
  112 + PCSDK.stat.loadingFinish();
  113 + }
  114 +
  115 + // 更新资源加载进度条
  116 + private onProgressMain(ret) {
  117 + let progress = ret.data;
  118 + this.skin.txtProgress.text = Math.floor(progress * 100) + '%';
  119 + }
  120 + ```
  121 +
  122 +3. **active**
  123 +
  124 + ```javascript
  125 + PCSDK.stat.active(): void
  126 + ```
  127 +
  128 + 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式:
  129 + 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。
  130 +
  131 + 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。
  132 +
  133 + 参数:
  134 +
  135 + ```javascript
  136 + 无
  137 + ```
  138 + 返回值:
  139 +
  140 + ```javascript
  141 + void
  142 + 无
  143 + ```
  144 +
  145 + 示例:
  146 +
  147 + ```javascript
  148 + // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active
  149 + // 资源加载loading界面
  150 + class LoadingScene(){
  151 + constructor(){
  152 + // 登录
  153 + this.login();
  154 + // 加载资源
  155 + this.loadResouce();
  156 + }
  157 +
  158 + /**
  159 + * 登录
  160 + */
  161 + private login(){
  162 + Api.login().then( data => {
  163 + let { user_openid, user_reg_time } = data;
  164 + // 打点:设置用户信息
  165 + PCSDK.stat.setLoginInfo({
  166 + openId: user_openid, // openId
  167 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  168 + });
  169 + });
  170 + }
  171 +
  172 + /**
  173 + * 加载资源
  174 + */
  175 + private loadResouce(){
  176 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  177 + }
  178 +
  179 + /**
  180 + * 加载资源完成回调监听
  181 + */
  182 + private onLoadedMain(){
  183 + // 打点:加载资源完成
  184 + PCSDK.stat.loadingFinish().then( () => {
  185 + // 打点:用户活跃注册打点
  186 + PCSDK.stat.active();
  187 +
  188 + // 进入home主页场景
  189 + SceneManager.I.switchScene(HomeScene);
  190 + });
  191 + }
  192 + }
  193 +
  194 + // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。
  195 + // 资源加载loading界面
  196 + class LoadingScene(){
  197 + constructor(){
  198 + // 登录
  199 + this.login();
  200 + // 加载资源
  201 + this.loadResouce();
  202 + }
  203 +
  204 + /**
  205 + * 登录
  206 + */
  207 + private login(){
  208 + Api.login().then( data => {
  209 + let { user_openid, user_reg_time } = data;
  210 + // 打点:设置用户信息
  211 + PCSDK.stat.setLoginInfo({
  212 + openId: user_openid, // openId
  213 + regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
  214 + });
  215 + });
  216 + }
  217 +
  218 + /**
  219 + * 加载资源
  220 + */
  221 + private loadResouce(){
  222 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  223 + }
  224 +
  225 + /**
  226 + * 加载资源完成回调监听
  227 + */
  228 + private onLoadedMain(){
  229 + // 打点:加载资源完成
  230 + PCSDK.stat.loadingFinish().then( () => {
  231 + // 进入home主页场景
  232 + SceneManager.I.switchScene(HomeScene);
  233 + });
  234 + }
  235 + }
  236 +
  237 + // Home页面
  238 + class HomeScene(){
  239 + constructor(){
  240 + this.btnStarGame.on('click', this.onGame, this);
  241 + }
  242 +
  243 + /**
  244 + * 按钮点击开始游戏
  245 + */
  246 + private onGame(){
  247 + // 打点:用户活跃注册打点
  248 + PCSDK.stat.active();
  249 +
  250 + // 进入游戏页面
  251 + SceneManager.I.switchScene(GameScene);
  252 + }
  253 + }
  254 +
  255 + ```
0 256 \ No newline at end of file
... ...
outer/stat_ads.md 0 → 100644
... ... @@ -0,0 +1,530 @@
  1 +# 交叉推广位
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +交叉推广位是在游戏中展示其他游戏,用户点击某个游戏跳转进入游戏,达到共享用户的目的。
  8 +
  9 +噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析查看。
  10 +
  11 +**3种广告类型:悬浮框交叉推广位、抽屉式交叉推广位、猜你喜欢交叉推广位,对应类型值为:40、70、50**
  12 +
  13 +1. 悬浮框交叉推广位,推荐位置:首页、结算页
  14 +
  15 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_013.png "🔍点击查看大图")
  16 +
  17 +2. 抽屉式交叉推广位,推荐位置:首页、结算页
  18 +
  19 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_014.png "🔍点击查看大图")
  20 +
  21 +3. 猜你喜欢交叉推广位,推荐位置:结算页
  22 +
  23 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_015.png "🔍点击查看大图")
  24 +
  25 +
  26 +
  27 +
  28 +
  29 +#### **后台使用**
  30 +
  31 +完成接入交叉推广位后,登录后台->头部tab切换到【游戏数据】->【流量分析】->【广告导出】即可查看推广位的各项数据信息(需要后台管理人员添加权限):
  32 +
  33 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_012.png "🔍点击查看大图")
  34 +
  35 +
  36 +
  37 +#### **接入必读**
  38 +
  39 +- 由于微信对每个游戏可跳转其他游戏有10个限制,可跳转的其它游戏需要在小游戏根目录下的全局配置文件game.json中进行添加配置:navigateToMiniProgramAppIdList,该参数定义请详读[小程序全局配置](https://developers.weixin.qq.com/minigame/dev/reference/configuration/app.html)。
  40 +
  41 +- **接入3种交叉推广位后,为了防止微信审核被拒(被拒理由:微信认定游戏跳转到其他游戏太多,判断游戏是一个游戏盒子,拒绝审核通过),为了防范被拒,在[数据模块](data.md)提供了三个数据获取api:PCSDK.data.IsCross、PCSDK.data.IsDrawer、PCSDK.data.IsGuessLike,控制3种推广位广告的显示隐藏,开发者在游戏中对三种广告控制显示隐藏状态。[详请请阅读数据api](data.md#ad_cross)。**
  42 +
  43 +- 噗嗤游戏为了方便开发者接入调试交叉推广位,后台已经配置测试使用的3种类型推广位,提供以下10个推广位appid,开发者复制下面的navigateToMiniProgramAppIdList json数据,配置到game.json的navigateToMiniProgramAppIdList参数:
  44 +
  45 + 水果爆破 :"wx26822126b4d99eda",
  46 +
  47 + 球球涂涂涂:"wxac0750884d5bed0c",
  48 +
  49 + 狂野漂移3D:"wx019a09df638e6683",
  50 +
  51 + 星星爱消消:"wx9ff47d13a88e5511",
  52 +
  53 + 土耳其方块消消乐:"wx89efb2282d65a2d0",
  54 +
  55 + 成语小才子:"wxd4d478c7d331ce80",
  56 +
  57 + 球球蹦蹦蹦:"wxabee9afe62d0b114",
  58 +
  59 + 俄罗斯方块连连消:"wx4cd087f19f4cb7c3",
  60 +
  61 + 球球爆爆爆:"wxae33d68413f40641",
  62 +
  63 + 疯狂水果一刀切:"wxdf26a04c53d6f1e9"
  64 +
  65 + ```javascript
  66 + "navigateToMiniProgramAppIdList": [
  67 + "wx26822126b4d99eda",
  68 + "wxac0750884d5bed0c",
  69 + "wx019a09df638e6683",
  70 + "wx9ff47d13a88e5511",
  71 + "wx89efb2282d65a2d0",
  72 + "wxd4d478c7d331ce80",
  73 + "wxabee9afe62d0b114",
  74 + "wx4cd087f19f4cb7c3",
  75 + "wxae33d68413f40641",
  76 + "wxdf26a04c53d6f1e9"
  77 + ]
  78 + ```
  79 +
  80 + ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_010.png "🔍点击查看大图")
  81 +
  82 +
  83 +
  84 +
  85 +#### **接入API:**
  86 +
  87 +| **名称** | **功能说明** |
  88 +| --------------------------- | ------------------------------------------------------------ |
  89 +| PCSDK.stat.bannerList | 根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型:40(悬浮框交叉推广位)、70(抽屉式交叉推广位)、50(猜你喜欢交叉推广位) |
  90 +| PCSDK.stat.bannerNavigateTo | 交叉推广位点击跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram) |
  91 +| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK内部会在onHide时候上报数据到后台 |
  92 +
  93 +
  94 +
  95 +1. ##### **bannerList**
  96 +
  97 + ```javascript
  98 + PCSDK.stat.loadingFinish(banner_type): Promise<any>
  99 + ```
  100 +
  101 + 定义:根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型
  102 +
  103 + 参数:
  104 +
  105 + ```
  106 + banner_type: number 必填 目前支持三种广告类型:40、50、70
  107 + ```
  108 +
  109 + 返回值:Promise<any>
  110 +
  111 + 返回的是Promise类型,Promise resolve成功回调数据结构为:
  112 +
  113 + ```json
  114 + {
  115 + "banner_list": [
  116 + {
  117 + "banner_id": "3568",
  118 + "banner_name": "土耳其方块",
  119 + "banner_type": "40",
  120 + "banner_location": "100",
  121 + "banner_ad_id": "50",
  122 + "banner_launch_appid": "",
  123 + "banner_launch_path": "",
  124 + "banner_appid": "wx89efb2282d65a2d0",
  125 + "banner_path": "?channel_id=20361",
  126 + "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CB97RK.png",
  127 + "banner_user_num": "0",
  128 + "banner_exposure_num": "0",
  129 + "banner_sort": "1",
  130 + "banner_game_id": "1000053",
  131 + "banner_qqgame": "0",
  132 + "banner_qqgame_id": "0",
  133 + "banner_game_type": 0,
  134 + "banner_bone": "0",
  135 + "banner_system": "0",
  136 + "banner_online": "1",
  137 + "banner_reddot": "0",
  138 + "banner_gender": "0",
  139 + "banner_resident": "0",
  140 + "banner_qrcode": "0",
  141 + "banner_qrcode_img": "",
  142 + "banner_bone_info": false,
  143 + "banner_img_info": {
  144 + "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CB97RK.png"
  145 + }
  146 + },
  147 + {
  148 + "banner_id": "3571",
  149 + "banner_name": "水果一刀切",
  150 + "banner_type": "40",
  151 + "banner_location": "100",
  152 + "banner_ad_id": "99",
  153 + "banner_launch_appid": "",
  154 + "banner_launch_path": "",
  155 + "banner_appid": "wxdf26a04c53d6f1e9",
  156 + "banner_path": "?channel_id=20361",
  157 + "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CBACTt.png",
  158 + "banner_user_num": "0",
  159 + "banner_exposure_num": "0",
  160 + "banner_sort": "1",
  161 + "banner_game_id": "1000053",
  162 + "banner_qqgame": "0",
  163 + "banner_qqgame_id": "0",
  164 + "banner_game_type": 0,
  165 + "banner_bone": "0",
  166 + "banner_system": "0",
  167 + "banner_online": "1",
  168 + "banner_reddot": "0",
  169 + "banner_gender": "0",
  170 + "banner_resident": "0",
  171 + "banner_qrcode": "0",
  172 + "banner_qrcode_img": "",
  173 + "banner_bone_info": false,
  174 + "banner_img_info": {
  175 + "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CBACTt.png"
  176 + }
  177 + }
  178 + ]
  179 + }
  180 +
  181 + ```
  182 +
  183 + > **返回的数据banner_list列表解析为 Array< BannerData >,BannerData是banner_list每一项数据实体,下面的bannerNavigateTo与addExposure接口api参数banner_data属于此BannerData结构**。
  184 +
  185 + 示例:
  186 +
  187 + ```javascript
  188 + /**
  189 + * 演示交叉推广位使用示例
  190 + */
  191 + export default class TestBannerSample {
  192 + constructor() {
  193 + // 示例:加载悬浮框交叉推广位
  194 + this.loadBannerList(BannerType.TYPE_CROSS)
  195 + .then((dataList: Array<BannerData>) => {
  196 + // 渲染广告位数据
  197 + this.renderAdCrossList(dataList);
  198 + }).catch(err => {
  199 + // bannerList不存在获取请求拉取失败
  200 + });
  201 + }
  202 +
  203 + /**
  204 + * 渲染广告位列表
  205 + * @param dataList 广告位列表
  206 + */
  207 + private renderAdCrossList(dataList: Array<BannerData>) {
  208 + // ...
  209 + }
  210 +
  211 + /**
  212 + * 根据类型获取交叉推广位列表
  213 + * @param banner_type 广告位类型
  214 + */
  215 + private loadBannerList(banner_type: BannerType): Promise<any> {
  216 + return new Promise((resolve, reject) => {
  217 + PCSDK.stat.bannerList(banner_type)
  218 + .then(data => {
  219 + let bannerList: Array<BannerData> = data.banner_list || [];
  220 + if (bannerList.length) {
  221 + // 处理bannerList数据列表
  222 + resolve(bannerList);
  223 + } else {
  224 + // 处理数据为空情况
  225 + reject(null);
  226 + }
  227 + }).catch(err => {
  228 + // 请求接口报错情况
  229 + reject(err);
  230 + });
  231 + });
  232 + }
  233 + }
  234 +
  235 + // 广告位类型的枚举
  236 + enum BannerType {
  237 + TYPE_CROSS = 40, // 悬浮框交叉推广位
  238 + TYPE_LIKE = 50, // 猜你喜欢交叉推广位
  239 + TYPE_LIST = 70, // 抽屉式交叉推广位
  240 + }
  241 +
  242 + /*
  243 + * banner数据实体结构
  244 + */
  245 + class BannerData {
  246 + public banner_id: string;
  247 + public banner_appid: string;
  248 + public banner_diamond: number;
  249 + public banner_type: string;
  250 + public banner_icon: string;
  251 + public banner_name: string;
  252 + public banner_resident: string; // 是否常驻
  253 + }
  254 + ```
  255 +
  256 +2. ##### **bannerNavigateTo**
  257 +
  258 + ```javascript
  259 + PCSDK.stat.bannerNavigateTo( location:number, banner_data: any, opts?: { extraData?: string; envVersion?: string }): Promise<any>
  260 + ```
  261 +
  262 + 定义:交叉推广位点击游戏跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram), 第三个参数配置可参考[wx.navigateToMiniProgram extraData、envVersion配置信息](https://developers.weixin.qq.com/minigame/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html)
  263 +
  264 + 参数:
  265 +
  266 + ```javascript
  267 + location: number 必传,统一传递为:100
  268 +
  269 + banner_data:any 必传,点击跳转项对应数据,该数据的结构为BannerData,为bannerList获取的Array<BannerData>的单元实体项
  270 +
  271 + opts: object 选传,调试阶段可参照[wx.navigateToMiniProgram(Object object) extraData配置信息]进行裴旭
  272 + {
  273 + extraData: string 选传, 需要传递给目标小程序的数据,目标小程序可在 App.onLaunch,App.onShow 中获取到这份数据
  274 + envVersion: string 选传,要打开的小程序版本,合法值:develop、trial、release
  275 + }
  276 + ```
  277 +
  278 + 示例:获取猜你喜欢交叉推广位,以列表的形式显示在界面上,点击任意一项游戏跳转其他游戏
  279 +
  280 + ```javascript
  281 + // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息
  282 + /**
  283 + * 演示交叉推广位使用示例
  284 + */
  285 + export default class TestBannerSample extends ui.shop.ShopPopwinUI {
  286 + private list: Laya.List;
  287 +
  288 + constructor() {
  289 + super();
  290 +
  291 + // 创建List ui
  292 + this.list = new Laya.List();
  293 + this.list.itemRender = AdItem;
  294 + this.list.vScrollBarSkin = "";
  295 + this.list.scrollBar.elasticBackTime = 500;
  296 + this.list.scrollBar.elasticDistance = 350;
  297 + this.list.x = 0;
  298 + this.list.y = 0;
  299 + this.list.spaceY = 10;
  300 + this.list.height = 1000;
  301 + this.list.renderHandler = new Laya.Handler(this, this.renderAdItem);
  302 + this.boxList.addChild(this.list);
  303 +
  304 + // 示例:加载猜你喜欢交叉推广位数据列表
  305 + this.loadBannerList(BannerType.TYPE_LIKE)
  306 + .then((dataList: Array<BannerData>) => {
  307 + this.renderAdLikeList(dataList);
  308 + }).catch(err => {
  309 + // bannerList不存在获取请求拉取失败
  310 + });
  311 + }
  312 +
  313 + /**
  314 + * 渲染单个广告位ui
  315 + * @param cell
  316 + */
  317 + private renderAdItem(cell: AdItem) {
  318 + cell.init();
  319 + }
  320 +
  321 + /**
  322 + * 渲染广告位列表
  323 + * @param dataList 广告位列表
  324 + */
  325 + private renderAdLikeList(dataList: Array<BannerData>) {
  326 + this.list.array = dataList;
  327 + }
  328 +
  329 + /**
  330 + * 根据类型获取交叉推广位列表
  331 + * @param banner_type 广告位类型
  332 + */
  333 + private loadBannerList(banner_type: BannerType): Promise<any> {
  334 + return new Promise((resolve, reject) => {
  335 + PCSDK.stat.bannerList(banner_type)
  336 + .then(data => {
  337 + let bannerList: Array<BannerData> = data.banner_list || [];
  338 + if (bannerList.length) {
  339 + // 处理bannerList数据列表
  340 + resolve(bannerList);
  341 + } else {
  342 + // 处理数据为空情况
  343 + reject(null);
  344 + }
  345 + }).catch(err => {
  346 + // 请求接口报错情况
  347 + reject(err);
  348 + });
  349 + });
  350 + }
  351 + }
  352 +
  353 + class AdItem extends ui.ads.GameIconUI {
  354 + constructor() {
  355 + super();
  356 + this.on(Laya.Event.CLICK, this, this.onJumpGame);
  357 + }
  358 +
  359 + init() {
  360 + let { banner_icon, banner_name, banner_reddot } = this.dataSource;
  361 + this.iconTex.skin = banner_icon;
  362 + this.nametxt.text = banner_name;
  363 + this.hot.visible = banner_reddot + '' === '1';
  364 + }
  365 +
  366 + private onJumpGame(ev: Laya.Event) {
  367 + PCSDK.stat.bannerNavigateTo(100, { ...this.dataSource }).catch(err => {
  368 + // 跳转游戏微信弹出二次确认框,点击取消执行此处
  369 + });
  370 + }
  371 + }
  372 +
  373 + // 广告位类型的枚举
  374 + enum BannerType {
  375 + TYPE_CROSS = 40, // 悬浮框交叉推广位
  376 + TYPE_LIKE = 50, // 猜你喜欢交叉推广位
  377 + TYPE_LIST = 70, // 抽屉式交叉推广位
  378 + }
  379 +
  380 + /*
  381 + * banner数据实体结构
  382 + */
  383 + class BannerData {
  384 + public banner_id: string;
  385 + public banner_appid: string;
  386 + public banner_diamond: number;
  387 + public banner_type: string;
  388 + public banner_icon: string;
  389 + public banner_name: string;
  390 + public banner_resident: string; // 是否常驻
  391 + }
  392 + ```
  393 +
  394 +
  395 +3. ##### **addExposure**
  396 +
  397 + ```javascript
  398 + PCSDK.stat.addExposure( location: number, banner_data: Array< any > | any ): void
  399 + ```
  400 +
  401 + 定义:对一个或者多个展示的推广位添加曝光,SDK在onHide时候上报曝光数据到后台,后台进行统计查阅
  402 +
  403 + 参数:
  404 +
  405 + ```javascript
  406 + location: number 必传,统一传递为:100
  407 +
  408 + banner_data:any 必传,添加展推广位曝光数据,可添加一个或者多个曝光数据,banner_data参数数据结构为上面bannerList api返回的列表数据的项BannerData实体结构:Array<BannerData> | BannerData
  409 +
  410 + ```
  411 +
  412 + > 提示:
  413 + >
  414 + > 展示猜你喜欢/抽屉式交叉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。
  415 + >
  416 + > 展示悬浮框交叉推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api
  417 +
  418 + 示例:根据悬浮框交叉推广位类型调用PCSDK.stat.bannnerList接口获取悬浮框交叉推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。
  419 + ```javascript
  420 + /**
  421 + * 演示交叉推广位使用示例
  422 + */
  423 +export default class TestBannerSample extends ui.ads.ADbtnUI {
  424 + private data;
  425 + private count: number;
  426 + private adList: Array<BannerData>;
  427 +
  428 + constructor() {
  429 + super();
  430 + this.count = 0;
  431 + this.adList = [];
  432 + this.on(Laya.Event.CLICK, this, this.onJumpGame);
  433 + }
  434 +
  435 + // 初始化显示悬浮框交叉推广位
  436 + init(isFirst: boolean) {
  437 + isFirst && (this.count = 0);
  438 + this.anim_entice.play(0, true);
  439 + this.anim_entice.addLabel('refresh', 38);
  440 + // 交叉悬浮框动画执行到第38帧,自动更新下一个,开发者可根据实际使用定时器实现切换下一个
  441 + this.anim_entice.on(Laya.Event.LABEL, this, this.handleAutoRrefresh);
  442 + // 第一次
  443 + this.refresh();
  444 + }
  445 +
  446 + // 清理悬浮框交叉推广位
  447 + clear() {
  448 + this.anim_entice.gotoAndStop(0);
  449 + this.anim_entice.removeLabel('refresh');
  450 + this.anim_entice.off(Laya.Event.LABEL, this, this.handleAutoRrefresh);
  451 + }
  452 +
  453 + private refresh() {
  454 + let list = this.adList;
  455 + if (!list || !list.length) {
  456 + this.loadBannerList(BannerType.TYPE_CROSS).then(() => this.refresh());
  457 + return;
  458 + }
  459 + let data = list.pop();
  460 + this.renderAdui(data);
  461 + this.data = data;
  462 + // 添加曝光数据
  463 + PCSDK.stat.addExposure(100, data);
  464 + // 也可以采用传递多个方式
  465 + // PCSDK.stat.addExposure(100, [{...data}]);
  466 + }
  467 +
  468 + private renderAdui(data) {
  469 + let { banner_bone_info, banner_img_info } = data;
  470 + if (banner_bone_info) {
  471 + this.imgIcon.visible = false;
  472 + } else {
  473 + this.imgIcon.visible = true;
  474 + this.imgIcon.skin = banner_img_info.banner_icon;
  475 + }
  476 + this.imgHot.visible = data.banner_reddot + '' === '1';
  477 + }
  478 +
  479 + private onJumpGame(ev: Laya.Event) {
  480 + this.anim_entice.gotoAndStop(39);
  481 + this.anim_entice.play(39, true);
  482 + // 切换下一个
  483 + this.refresh();
  484 + PCSDK.stat.bannerNavigateTo(100, { ...this.data }).catch(err => {
  485 + // 跳转游戏微信弹出二次确认框,点击取消执行此处
  486 + });
  487 + }
  488 +
  489 + /**
  490 + * 处理自动切换下一个
  491 + * @param name
  492 + */
  493 + private handleAutoRrefresh(name) {
  494 + if (name === 'refresh' && this.count !== 0) {
  495 + this.refresh();
  496 + }
  497 + this.count++;
  498 + }
  499 +
  500 + /**
  501 + * 根据类型获取交叉推广位列表
  502 + * @param banner_type 广告位类型
  503 + */
  504 + private loadBannerList(banner_type: BannerType): Promise<any> {
  505 + return new Promise((resolve, reject) => {
  506 + PCSDK.stat.bannerList(banner_type)
  507 + .then(data => {
  508 + let bannerList: Array<BannerData> = data.banner_list || [];
  509 + if (bannerList.length) {
  510 + // 处理bannerList数据列表
  511 + resolve(bannerList);
  512 + } else {
  513 + // 处理数据为空情况
  514 + reject(null);
  515 + }
  516 + }).catch(err => {
  517 + // 请求接口报错情况
  518 + reject(err);
  519 + });
  520 + });
  521 + }
  522 + }
  523 +
  524 + // 广告位类型的枚举
  525 + enum BannerType {
  526 + TYPE_CROSS = 40, // 悬浮框交叉推广位
  527 + TYPE_LIKE = 50, // 猜你喜欢交叉推广位
  528 + TYPE_LIST = 70, // 抽屉式交叉推广位
  529 + }
  530 + ```
0 531 \ No newline at end of file
... ...
outer/stat_event.md 0 → 100644
... ... @@ -0,0 +1,153 @@
  1 +# 自定义事件打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +自定义事件是噗嗤游戏为开发者提供的自助分析功能:事件触发去重人数、次数等信息。游戏的任意位置需要统计触达人数、次数等都可以使用事件来实现,后台提供分析数据可查看,并不局限于用户的行为事件。
  8 +
  9 +#### **后台使用**
  10 +
  11 +接入自定义事件打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】可查看自定义事件次数、去重人数等详细信息(此功能需要管理员添加权限):
  12 +
  13 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_018.png "🔍点击查看大图")
  14 +
  15 +
  16 +
  17 +#### **接入必读**
  18 +
  19 +接入自定义事件打点前,请[前往后台](https://data.d3games.com/index.html#/login)进行添加自定义事件的key:登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】->点击【新增】添加自定义事件(事件key可语义化的自定义,推荐_连接)。
  20 +
  21 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_016.png "🔍点击查看大图")
  22 +
  23 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_017.png "🔍点击查看大图")
  24 +
  25 +> 提示:游戏新增自定义事件如果很多,一个个复制可能比较繁琐,进入噗嗤后台【事件列表】后,chrome浏览器打开【开发者工具】,在console栏下方输入下面的命令后,可自动生成自定义事件key的枚举(如果事件很多出现翻页,则每一页都执行后,手动合并为一个枚举),复制到项目中使用,枚举key生成规则为事件key转换为大驼峰式,枚举value为事件key:
  26 +
  27 +```javascript
  28 +// 第1个参数表示生成枚举的名字:EventKeys
  29 +// 第2个参数表示事件key所在列索引(第2列):1
  30 +// 第3个参数表示事件key注释所在列索引(第3列):2
  31 +// 最后一个参数选填,any传递false表示枚举字符串不带any转换
  32 +PCPlugins.transform('EventKeys', 1 , 2 , { any: false});
  33 +```
  34 +
  35 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_019.png "🔍点击查看大图")
  36 +
  37 +
  38 +
  39 +示例:使用PCPlugins.transform('EventKeys', 1 , 2 , { any: false}); 生成的自定义事件key枚举
  40 +
  41 +```javascript
  42 +enum EventKeys {
  43 + // 关卡7进入,
  44 + Level7Enter = 'level7_enter',
  45 + // 关卡6进入,
  46 + Level6Enter = 'level6_enter',
  47 + // 关卡5进入,
  48 + Level5Enter = 'level5_enter',
  49 + // 关卡4进入,
  50 + Level4Enter = 'level4_enter',
  51 + // 关卡3进入,
  52 + Level3Enter = 'level3_enter',
  53 + // 关卡2进入,
  54 + Level2Enter = 'level2_enter',
  55 + // 关卡1进入,
  56 + Level1Enter = 'level1_enter',
  57 + // 关卡失败双倍奖励,
  58 + MapFailDouble = 'map_fail_double',
  59 + // 引导10-主界面再次进入游戏,
  60 + Guide109 = 'guide_109',
  61 + // 引导9-合成确认,
  62 + Guide108 = 'guide_108',
  63 + // 引导8-合成成功后,
  64 + Guide107 = 'guide_107',
  65 + // 引导7-合成,
  66 + Guide106 = 'guide_106',
  67 + // 引导6-第二次购买,
  68 + Guide105 = 'guide_105',
  69 + // 引导5-第一次购买,
  70 + Guide104 = 'guide_104',
  71 + // 引导4-结算引导,
  72 + Guide103 = 'guide_103',
  73 + // 引导3-开始射击,
  74 + Guide102 = 'guide_102',
  75 + // 引导2-开始游戏,
  76 + Guide101 = 'guide_101',
  77 + // 引导1-欢迎,
  78 + Guide100 = 'guide_100',
  79 + // 金币加速,关闭,
  80 + SpeedUpClose = 'speed_up_close',
  81 + // 金币加速,免费领取,
  82 + SpeedUpFree = 'speed_up_free'
  83 +}
  84 +```
  85 +
  86 +
  87 +
  88 +
  89 +
  90 +#### **接入API**:
  91 +
  92 +| **名称** | **功能说明** |
  93 +| ---------------- | ------------------------------------------------------------ |
  94 +| PCSDK.stat.event | 自定义事件打点,使用前请[前往后台](https://data.d3games.com/index.html#/login)进行添加自定义事件key |
  95 +
  96 +
  97 +
  98 +1. **event**
  99 +
  100 + ```javascript
  101 + PCSDK.stat.event(event_key: string , event_source: string , opts?: { ext_val?: string | number} ): Promise<any>
  102 + ```
  103 +
  104 + 定义:自定义事件打点,可在游戏任何位置定义事件打点
  105 +
  106 + 参数:
  107 +
  108 + ```
  109 + event_key: string 必传,后台配置的事件key
  110 +
  111 + event_source: string 必传,触发该事件所在页面位置,例如:结算页面、排行榜界面、签到页面。。。
  112 +
  113 + opts?: object 选传,自定义扩展参数,一些特定的事件想传递更多信息,此参数使用请咨询相关对接人员目前只支持对象一个key(evt_val),多个扩展参数使用'|'连接
  114 + {
  115 + ext_val: '100|1000'
  116 + }
  117 + ```
  118 + 示例:
  119 +
  120 + ```javascript
  121 + // 签到功能
  122 + private onSign() {
  123 + // 事件上报:签到页面打开
  124 + PCSDK.stat.event(EventKeys.FunctionSign, '主界面');
  125 + PopwinMananger.I.openWin(SignPopwin);
  126 + }
  127 +
  128 + // 开始加载资源
  129 + private loadRes() {
  130 + // 事件上报:开始加载资源
  131 + PCSDK.stat.event(EventKeys.LoadingExhibition, '加载界面');
  132 + LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
  133 + }
  134 +
  135 + // 升级领奖
  136 + private onReward(e: Laya.Event) {
  137 + // 事件上报:发起升级领奖
  138 + PCSDK.stat.event(EventKeys.LvUpRewards, '升级界面');
  139 + SDKTools.shareDispatch(ShareKey.LevelUpDiamond, {
  140 + success: this.handleDoubleReward,
  141 + context: this
  142 + });
  143 + }
  144 +
  145 + export enum EventKeys {
  146 + // 升级奖励,
  147 + LvUpRewards = 'lv_up_rewards',
  148 + // 点击主界面-签到,
  149 + FunctionSign = 'function_sign',
  150 + // 加载,
  151 + LoadingExhibition = 'loading_exhibition'
  152 + }
  153 + ```
... ...
outer/stat_level.md 0 → 100644
... ... @@ -0,0 +1,297 @@
  1 +# 关卡分析打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +关卡分析,为开发者提供小游戏详细的关卡数据,分析各关卡玩家的通关状况,帮助开发者从数据角度衡量游戏设计的合理性,调节难易度,观察各关卡道具使用情况和奖励获取状况,对比分析各个指标,通过量化玩家数据,提高游戏体验。
  8 +
  9 +#### **后台使用**
  10 +
  11 +接入关卡分析接口后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【关卡分析】可查看关卡进入用户数据、失败次数、失败率、平均完成时间等):
  12 +
  13 +![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_020.png "🔍点击查看大图")
  14 +
  15 +
  16 +
  17 +#### **接入API**:
  18 +
  19 +| **名称** | **功能说明** |
  20 +| ---------------- | ------------------------------------------------------------ |
  21 +| PCSDK.stat.logLevelRelive | 游戏关卡复活上报 |
  22 +| PCSDK.stat.logLevelHide | 游戏关卡onHide上报,在游戏界面注册wx.onHide事件,判断不属于复活、失败、成功状态下上报此数据 |
  23 +| PCSDK.stat.logLevelFail | 游戏关卡失败上报 |
  24 +| PCSDK.stat.logLevelWin | 游戏关卡成功上报 |
  25 +| PCSDK.stat.logMerge | 游戏二合一合成最高等级上报 |
  26 +
  27 +
  28 +
  29 +1. #### **logLevelRelive**
  30 +
  31 + ```javascript
  32 + PCSDK.stat.logLevelRelive(levelId: string | number , params?: { attr?: number, ext?: any } ): void
  33 + ```
  34 +
  35 + 定义:关卡复活成功数据上报
  36 +
  37 + 参数:
  38 +
  39 + ```
  40 + levelId: string | number 必传,游戏关卡id
  41 +
  42 + params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext
  43 + {
  44 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
  45 + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
  46 + }
  47 + ```
  48 +
  49 + [点此查看完整示例](stat_level.md#sample)如何添加关卡复活成功打点代码
  50 +
  51 +2. #### **logLevelHide**
  52 +
  53 + ```javascript
  54 + PCSDK.stat.logLevelHide(levelId: string | number , params?: { attr?: number, ext?: any } ): void
  55 + ```
  56 + 定义:监听游戏战斗界面onHide时上报关卡的数据。什么是界面onHide?[请详读微信小游戏wx.onHide](https://developers.weixin.qq.com/minigame/dev/api/base/app/life-cycle/wx.onHide.html)
  57 + 注意事项:
  58 +
  59 + > <font color="red">1)游戏战斗界面监听平台的onHide事件,使用此api上报关卡onHide打点。</font>
  60 + >
  61 + >
  62 +
  63 + > <font color="red">2)游戏战斗界面退出后,要移除onHide事件监听,避免在其他界面下,onHide时候执行此次上报。</font>
  64 + >
  65 + >
  66 +
  67 + > <font color="red">3)一定要屏蔽游戏复活中、游戏失败、游戏通过成功状态,这三种状态下避免上报此打点,详看下面示例。</font>
  68 +
  69 + 参数:
  70 +
  71 + ```
  72 + levelId: string | number 必传,游戏关卡id
  73 +
  74 + params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext
  75 + {
  76 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
  77 + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
  78 + }
  79 + ```
  80 + [点此查看完整示例](stat_level.md#sample)如何添加关卡onHide打点代码
  81 +
  82 +3. #### **logLevelFail**
  83 +
  84 + ```javascript
  85 + PCSDK.stat.logLevelFail(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void
  86 + ```
  87 +
  88 + 定义:关卡失败数据上报
  89 +
  90 + 参数:
  91 +
  92 + ```
  93 + levelId: string | number 必传,游戏关卡id
  94 +
  95 + params: object 必传,关卡需要的其他参数
  96 + {
  97 + ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒
  98 + first: number 必传 是否第一次体验关卡,1是,0否
  99 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
  100 + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
  101 + }
  102 + ```
  103 + [点此查看完整示例](stat_level.md#sample)如何添加关卡失败打点代码
  104 +
  105 +4. #### **logLevelWin**
  106 +
  107 + ```javascript
  108 + PCSDK.stat.logLevelWin(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void
  109 + ```
  110 +
  111 + 定义:关卡成功通关数据上报
  112 +
  113 + 参数:
  114 +
  115 + ```
  116 + levelId: string | number 必传,游戏关卡id
  117 +
  118 + params: object 必传,关卡需要的其他参数
  119 + {
  120 + ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒
  121 + first: number 必传 是否第一次体验关卡,1是,0否
  122 + attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
  123 + ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
  124 + }
  125 + ```
  126 + <div id="sample"></div> 完整示例,以上四个接口使用场景:
  127 +> SDK中监听了onHide事件,当游戏onHide时,SDK会发送事件名为'app.hide'的自定义事件,开发者可在代码中使用PCSDK.event.bindEvent监听该事件,使用PCSDK.event.removeEvent移除对应监听事件,[详细文档event模块文档请阅读event事件模块](evennt.md)。
  128 +
  129 + ```javascript
  130 + /**
  131 + * 游戏界面
  132 + **/
  133 + exports class GameScene extends BaseView{
  134 + // 关卡id
  135 + private missionId: number;
  136 + // 当前选中使用的枪支等级
  137 + private currSelectGun: number;
  138 + // 游戏状态机
  139 + private gameState: GameState;
  140 + // 关卡开始时间
  141 + private enterTime: number;
  142 +
  143 + constructor(){
  144 + this.gameState = GameState.Idle;
  145 + }
  146 +
  147 + // 游戏界面打开
  148 + open(){
  149 + super.open();
  150 + this.gameState = GameState.Idle;
  151 + this.enterTime = new Date().getTime();
  152 + this.addEvent();
  153 + }
  154 +
  155 + // 游戏界面关闭
  156 + close(){
  157 + super.close();
  158 + this.removeEvent();
  159 + }
  160 +
  161 + // 添加游戏事件监听
  162 + private addEvent(){
  163 + // 监听SDK中app.hide事件事件消息
  164 + PCSDK.event.bindEvent( 'app.hide', this.handleHide, this);
  165 + // 监听游戏中level.relive事件消息
  166 + EventCenter.I.add('level.relive', this, this.handleLevelRelive);
  167 + }
  168 +
  169 + // 移除游戏事件监听
  170 + private removeEvent(){
  171 + PCSDK.event.removeEvent( 'app.hide', this.handleHide, this);
  172 + EventCenter.I.remove('level.relive', this, this.handleLevelRelive);
  173 + }
  174 +
  175 + // 游戏复活中
  176 + private doGameRelive(){
  177 + this.setState(GameState.Relive);
  178 + }
  179 +
  180 + // 游戏通关失败
  181 + private doGameFail(){
  182 + this.setState(GameState.Fail);
  183 + }
  184 +
  185 + // 游戏通关成功
  186 + private doGameWin(){
  187 + this.setState(GameState.Win);
  188 + }
  189 +
  190 + // SDK发出的app.hide事件监听
  191 + private handleHide() {
  192 + // 战斗界面onHide上报logLevelHide(游戏通关成功、游戏通关失败、游戏复活中不进行上报logLevelHide打点)
  193 + if(!(this.isState(GameState.Win) || this.isState(GameState.Fail) || this.isState(GameState.Relive)))
  194 + PCSDK.stat.logLevelHide(this.missionId, {
  195 + attr: this.currSelectGun
  196 + });
  197 + }
  198 +
  199 + // 监听关卡复活成功消息
  200 + private handleLevelRelive(){
  201 + // 关卡复活成功上报
  202 + PCSDK.stat.logLevelRelive(this.missionId, {
  203 + attr: this.currSelectGun
  204 + });
  205 + }
  206 +
  207 + private isState(state: GameState) {
  208 + return this.state === state;
  209 + }
  210 +
  211 + // 设置状态机
  212 + private setState(state: GameState) {
  213 + if (this.isState(state)) return;
  214 +
  215 + this.state = state;
  216 + let costTime: number; // 关卡消耗时间
  217 + let failNum: number; // 关卡失败次数
  218 + switch (state) {
  219 + case GameState.Win: // 处理成功
  220 + // 关卡成功上报
  221 + costTime = new Date().getTime() - this.enterTime;
  222 + failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId);
  223 + PCSDK.stat.logLevelWin(this.missionId, {
  224 + ctime: costTime,
  225 + first: failNum ? 0 : 1,
  226 + attr: this.currSelectGun,
  227 + ext: {
  228 + currHp: 100000
  229 + }
  230 + });
  231 + break;
  232 +
  233 + case GameState.Fail: // 处理失败
  234 + // 关卡失败上报
  235 + costTime = new Date().getTime() - this.enterTime;
  236 + failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId);
  237 + PCSDK.stat.logLevelFail(this.missionId, {
  238 + ctime: costTime,
  239 + first: failNum ? 0 : 1,
  240 + attr: this.currSelectGun
  241 + });
  242 + break;
  243 +
  244 + case GameState.Relive:// 处理复活中
  245 + // 弹出复活操作界面
  246 + PopWinManager.I.openPopwin(RelivePopwinn);
  247 + break;
  248 + }
  249 + }
  250 + }
  251 +
  252 + /**
  253 + * 复活界面
  254 + **/
  255 + exports class RelivePopwinn extends BaseView{
  256 + // 复活界面关闭
  257 + close(){
  258 + super.close();
  259 + // 关闭模拟:复活成功,发送复活成功消息
  260 + EventCenter.I.emit('level.relive');
  261 + }
  262 + }
  263 +
  264 + // 游戏状态状态机
  265 + enum GameState{
  266 + Idle, // 初始状态
  267 + Fail, // 失败状态
  268 + Win, // 成功通关状态
  269 + Relive // 正在复活状态
  270 + }
  271 + ```
  272 +
  273 +5. #### **logMerge**
  274 +
  275 + ```javascript
  276 + PCSDK.stat.logMerge(mergeLv: number): void
  277 + ```
  278 +
  279 + 定义:游戏二合一合成最高等级上报
  280 +
  281 + 参数:
  282 +
  283 + ```
  284 + mergeLv: number 必传,二合一合成最高等级
  285 + ```
  286 +
  287 + 示例:二合一部分,合成最高等级时候上报
  288 +
  289 + ```javascript
  290 + // 合成最新等级合成
  291 + private handleMergeLastestLv(lastestLv: number){
  292 + // 合成最新等级上报
  293 + PCSDK.stat.logMerge( lastestLv );
  294 + }
  295 + ```
  296 +
  297 +
0 298 \ No newline at end of file
... ...
outer/stat_pay.md 0 → 100644
... ... @@ -0,0 +1,112 @@
  1 +# 支付结果打点
  2 +
  3 +------
  4 +
  5 +#### **简介**
  6 +
  7 +支付上报,是开发者使用米大师或者第三方其他支付(比如H5支付),支付回调后把支付结果(失败支付、成功支付、取消支付)上报到后台。
  8 +
  9 +#### **注意事项**
  10 +
  11 +{% em %} 使用api,需在[config.js中配置MidasPay](install.md#configJs)信息。 {% endem %}
  12 +
  13 +**MidasPay( object )配置:**米大师虚拟支付配置,请注意下面规则
  14 +
  15 + OfferId:在米大师申请的应用id,没有接入米大师,默认为"0"
  16 +
  17 + ZoneId:分区ID,默认:"1"
  18 +
  19 + Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game"
  20 +
  21 + CurrencyType:币种,默认:"CNY"
  22 +
  23 + Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。
  24 +
  25 + 1)接入了米大师,填写"android"(ios暂时没有开放)
  26 +
  27 + 2)未接入米大师,使用其他支付,如果只支持android,则填写"android";
  28 +
  29 + 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios";
  30 +
  31 + 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios
  32 +
  33 +
  34 +
  35 +#### **接入API:**
  36 +
  37 +| **名称** | **功能说明** |
  38 +| ------------------------ | ------------------------------------------------------------ |
  39 +| PCSDK.stat.logPay | 开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付) |
  40 +
  41 +
  42 +1. **logPay**
  43 +
  44 + ```javascript
  45 + PCSDK.stat.logPay( params: object ): void
  46 + ```
  47 +
  48 + 定义:开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付)。该api需在[config.js中配置MidasPay](install.md#configJs)信息。
  49 +
  50 + 参数:
  51 +
  52 + ```
  53 + params object 必传 打点参数
  54 + {
  55 + type: number 必传 支付类型:0(支付失败),1(支付成功),-1(取消支付);
  56 + source: string 必传 游戏服务商生成的订单号,没有则为空字符串
  57 + amount: number 必传 实际支付金额,单位分
  58 + buy_id: string | number; 必传 商品ID
  59 + buy_name: string; 必传 商品名称
  60 + item_info: string 必传 获得的道具内容:道具id及数量,逗号分隔,多项使用分号分隔 => 1,1;2,10;3,100
  61 + }
  62 + ```
  63 + 返回值:
  64 +
  65 + ```
  66 + void
  67 + 无
  68 + ```
  69 +
  70 + 示例:客户端游戏支付完成后上报支付打点,下例只是演示logPay用法
  71 +
  72 + ```javascript
  73 + private reqPay() {
  74 + // 模拟的支付,开发者需更加实际接入支付
  75 + Api.I.pay().then( ret => {
  76 + switch(ret.code){
  77 + case 1: // 支付成功回调处理
  78 + PCSDK.stat.logPay({
  79 + type: 1, // 成功支付
  80 + source: "10000400", // 订单号,没有则为空字符串
  81 + amount: 10 * 100, // 10元
  82 + buy_id: 58, // 支付的商品id
  83 + buy_name: "钻石*152,金币*188888888",
  84 + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90
  85 + });
  86 + break;
  87 +
  88 + case 0: // 支付失败回调处理
  89 + PCSDK.stat.logPay({
  90 + type: 0, // 失败支付
  91 + source: "10000400", // 订单号,没有则为空字符串
  92 + amount: 10 * 100, // 10元
  93 + buy_id: 58, // 支付的商品id
  94 + buy_name: "钻石*152,金币*188888888",
  95 + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90
  96 + });
  97 + break;
  98 +
  99 + case -1: // 支付取消回调处理
  100 + PCSDK.stat.logPay({
  101 + type: -1, // 取消支付
  102 + source: "10000400", // 订单号,没有则为空字符串
  103 + amount: 10 * 100, // 10元
  104 + buy_id: 58, // 支付的商品id
  105 + buy_name: "钻石*152,金币*188888888",
  106 + item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90
  107 + });
  108 + break;
  109 + }
  110 + });
  111 + }
  112 + ```
0 113 \ No newline at end of file
... ...
outer/styles/website.css 0 → 100644
... ... @@ -0,0 +1,68 @@
  1 +/* CSS for website */
  2 +h1 , h2{
  3 + border-bottom: 1px solid #EFEAEA;
  4 + padding-bottom: 3px;
  5 +}
  6 +.markdown-section>:first-child {
  7 + margin-top: 0!important;
  8 +}
  9 +.page-wrapper {
  10 + margin-top: -1.275em;
  11 +}
  12 +.book .book-body .page-wrapper .page-inner section.normal {
  13 + min-height:350px;
  14 + margin-bottom: 30px;
  15 +}
  16 +
  17 +.book .book-body .page-wrapper .page-inner section.normal hr {
  18 + height: 0px;
  19 + padding: 0;
  20 + margin: 1.7em 0;
  21 + overflow: hidden;
  22 + background-color: #e7e7e7;
  23 + border-bottom: 1px dotted #e7e7e7;
  24 +}
  25 +
  26 +.video-js {
  27 + width:100%;
  28 + height: 100%;
  29 +}
  30 +
  31 +pre[class*="language-"] {
  32 + border: none;
  33 + background-color: #f7f7f7;
  34 + /* font-size: 1em; */
  35 + line-height: 1.2em;
  36 +}
  37 +
  38 +.book .book-body .page-wrapper .page-inner section.normal {
  39 + font-size: 16px;
  40 + font-family: "ubuntu", "Tahoma", "Microsoft YaHei", arial, sans-serif;
  41 +}
  42 +
  43 +.aceCode {
  44 + font-size: 14px !important;
  45 +}
  46 +
  47 +input[type=checkbox]{
  48 + margin-left: -2em;
  49 +}
  50 +
  51 +.page-footer span{
  52 + font-size: 12px;
  53 +}
  54 +
  55 +.page-footer .copyright {
  56 + float: left;
  57 +}
  58 +
  59 +.body, html {
  60 + overflow-y: hidden;
  61 +}
  62 +
  63 +.versions-select select {
  64 + height: 2em;
  65 + line-height: 2em;
  66 + border-radius: 4px;
  67 + background: #efefef;
  68 +}
... ...
platform.md
... ... @@ -1,577 +0,0 @@
1   -# 多平台接口模块:PCSDK.platform
2   -
3   -------
4   -
5   -#### **简介**
6   -
7   -所谓多平台指的是微信小游戏、QQ轻游戏、今日头条、oppo等游戏发布的平台。微信和QQ接口文档api相似度99%,微信、QQ、今日头条平台的接口api相似度80%以上,虽然相似度很高,但是仍需要针对差异性做一些处理。多平台接口模块就是想要在SDK内部去抹平了各个平台差异性的处理,达到同一个api调用,应用多个平台的作用。
8   -
9   -#### **此模块是参照微信小游戏提供的api进行封装的公用方法,提供了以下游戏中常用到的功能:**
10   -
11   -2. **打开客服消息:openCustomerServiceConversation** 整理来自[wx.openCustomerServiceConversation](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html)
12   -
13   -3. **检测版本更新:checkUpdate** 整理来自:[wx.getUpdateManager](https://developers.weixin.qq.com/minigame/dev/api/base/update/UpdateManager.html)
14   -4. **显示模态弹出框:showModal** 整理来自:[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html)
15   -5. **复制文本:copy** 整理来自:[wx.setClipboardData](https://developers.weixin.qq.com/minigame/dev/api/device/clipboard/wx.setClipboardData.html)
16   -6. **长震动:vibrateLong** 整理来自:[wx.vibrateLong](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateLong.html)
17   -7. **短震动:vibrateShort** 整理来自:[wx.vibrateShort](https://developers.weixin.qq.com/minigame/dev/api/device/vibrate/wx.vibrateShort.html)
18   -9. **微信小游戏推荐弹窗组件GamePortal:isGamePortalPlaying 与 gamePortalShow** 整理来自:[wx.createGamePortal](https://developers.weixin.qq.com/minigame/dev/api/game-portal/GameBanner.html)
19   -10. **微信小游戏插屏广告组件InterstitialAd:isInterstitialPlaying 与 interstitialShow** 整理来自:[wx.createInterstitialAd](https://developers.weixin.qq.com/minigame/dev/api/ad/InterstitialAd.html)
20   -11. **微信小游戏推荐icon组件GameIcon:gameIconShow 与 gameIconDestroy** 整理来自:[wx.createGameIcon](https://developers.weixin.qq.com/minigame/dev/api/game-portal/wx.createGameIcon.html)
21   -
22   -
23   -
24   -#### **接入API:**
25   -
26   -| **名称** | **功能说明** |
27   -| ------------------------ | ------------------------------------------------------------ |
28   -| PCSDK.platform.openCustomerServiceConversation | 进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力、钻石和进入跳转充值等,[具体用法请看](platform.md#service)|
29   -| PCSDK.platform.checkUpdate | 检测版本是否有更新,如果版本更新会弹出确认框 |
30   -| PCSDK.platform.copy | 设置系统剪贴板的内容。微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s |
31   -| PCSDK.platform.vibrateShort | 使手机发生较短时间的振动(15 ms) |
32   -| PCSDK.platform.vibrateLong | 使手机发生较长时间的振动(400 ms) |
33   -| PCSDK.platform.gamePortalShow | 传入adUnitId创建并展示小游戏推荐弹窗组件 |
34   -| PCSDK.platform.isGamePortalPlaying | 是否正在加载小游戏推荐弹窗组件 |
35   -| PCSDK.platform.interstitialShow | 传入adUnitId创建并展示小游戏插屏广告组件 |
36   -| PCSDK.platform.isInterstitialPlaying | 是否正在加载小游戏插屏广告组件 |
37   -| PCSDK.platform.gameIconShow | 创建并显示小游戏推荐icon组件 |
38   -| PCSDK.platform.gameIconDestroy | 销毁正在展示的小游戏推荐icon组件 |
39   -
40   -
41   -
42   -
43   -
44   -<div id="service"></div>
45   -
46   -2. **openCustomerServiceConversation**
47   -
48   - ```javascript
49   - PCSDK.platform.openCustomerServiceConversation( params?: _CustomerServiceConversationObject ): void
50   - ```
51   -
52   - 定义:进入客服会话,可打开一个普通的客服会话,也可打开客服会话发送体力和进入跳转充值
53   -
54   - 参数:
55   -
56   - ```javascript
57   - params _CustomerServiceConversationObject 选传,不传递打开一个普通的客户会话。[参数说明参照](https://developers.weixin.qq.com/minigame/dev/api/open-api/customer-message/wx.openCustomerServiceConversation.html)
58   - {
59   - sessionFrom string 选传 会话来源
60   - showMessageCard boolean 选传 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息
61   - sendMessageTitle string 选传 会话内消息卡片标题
62   - sendMessagePath string 选传 会话内消息卡片路径
63   - sendMessageImg string 选传 会话内消息卡片图片路径
64   - success function 选传 接口调用成功的回调函数
65   - fail function 选传 接口调用失败的回调函数
66   - complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行)
67   - }
68   - ```
69   - 返回值:
70   -
71   - ```
72   - void
73   - 无
74   - ```
75   -
76   - 示例1:进入普通的客服会话
77   -
78   - ```javascript
79   - PCSDK.platform.openCustomerServiceConversation();
80   - ```
81   - 示例2:应用场景如进入客服会话跳转领取体力、钻石等等: 示例为跳转客服领取18888钻石奖励,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断)。
82   - <iframe height=498 width=740 src="https://dep.miso-lab.com/sdkword/sdk_video_001.mp4" frameborder=0 allowfullscreen></iframe>
83   - ```javascript
84   - // 跳转客服领取18888钻石奖励,开发者可根据示例修改
85   - PCSDK.platform.openCustomerServiceConversation({
86   - showMessageCard: true,
87   - sendMessageTitle: '钻石已发送,点击领取钻石!',
88   - sendMessagePath: '',
89   - sendMessageImg: 'http://dep.miso-lab.com/mergeguns/bin/res/image/service_reward.png', // 图片icon对应的域名记得加入到request和download白名单中
90   - success: () => {
91   - // 打开跳转客服成功,记录成功状态,在游戏全局注册的onShow监听通过判断这个状态去请求接口领取奖励
92   - // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改
93   - AppDataManager.I.set('service.reward.data', {
94   - status: 1, // 可以领奖
95   - reward: 18888 // 获得18888钻石
96   - });
97   - },
98   - fail: (err) => {
99   - console.log("openCustomerServiceConversation fail: ", err);
100   - }
101   - });
102   - // 在游戏中全局注册的onShow事件监听中检测是
103   - // 游戏入口:Main.cs
104   - class Main {
105   - constructor() {
106   - this.init();
107   - }
108   -
109   - private init() {
110   - PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this));
111   - PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this));
112   - }
113   -
114   - private onShow(opts) {
115   - // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断
116   - let serviceRewardData = AppDataManager.I.get('service.reward.data');
117   - if (serviceRewardData && serviceRewardData.status === 1) {
118   - AppDataManager.I.set('service.reward.data', null);
119   - // 奖励发放,处理发放后的逻辑,比如每天只能领取一次的记录,防止重复刷奖励
120   - }
121   - }
122   -
123   - private onHide(){
124   - // 监听平台的onHide事件
125   - }
126   - }
127   - ```
128   - 示例3:应用场景例如进入客服会话,success函数中记录数据状态(用于客服返回,执行onShow生命周期函数时逻辑判断),点击右下角的充值按钮后,跳转充值,充值完成后在onShow中处理:需要后台提供api接口,验证充值合理性并发放奖励,**此接口需要后端支持**。
129   - <iframe height=498 width=740 src="https://dep.miso-lab.com/sdkword/sdk_video_002.mp4" frameborder=0 allowfullscreen></iframe>
130   - ```javascript
131   - // 跳转客服充值,开发者可根据示例修改,sendMessagePath请严格按照示例中提供的参数
132   - /**
133   - * 充值跳转客服
134   - * @param itemId 购买道具商品id
135   - * @param money 购买商品花费,单位元
136   - */
137   - private openServiceWithItem(itemId: number, money: number) {
138   - PCSDK.platform.openCustomerServiceConversation({
139   - showMessageCard: true,
140   - sendMessageTitle: `充值${money}元`,
141   - sendMessagePath: `channel=${PCSDK.data.ChannelId}&item=${itemId}&uid=${PCSDK.data.UserId}&pf=${PCSDK.data.SystemId}`,
142   - sendMessageImg: 'http://dep.miso-lab.com/idiom/bin/share/pay.png', // 图片icon对应的域名记得加入到request和download白名单中
143   - success: () => {
144   - // 打开跳转客服成功,记录成功状态,onShow通过判断这个状态去请求接口领取奖励
145   - // 记录数据状态,onShow的时候读取数据状态判断,只是演示操作,可根据实际情况修改
146   - AppDataManager.I.set('service.pay.data', {
147   - status: 1, // 可以领奖
148   - itemId: itemId, // 购买道具商品id
149   - money: money // 购买商品花费,单位元
150   - });
151   - },
152   - fail: (err) => {
153   - console.log("openCustomerServiceConversation fail: ", err);
154   - }
155   - });
156   - }
157   -
158   - // 在游戏中全局注册的onShow事件监听中检测是
159   - // 游戏入口:Main.cs
160   - class Main {
161   - constructor() {
162   - this.init();
163   - }
164   -
165   - private init() {
166   - PCSDK.event.add('app.show', this.onShow, this); // 等同于wx.onShow(this.onShow.bind(this));
167   - PCSDK.event.add('app.hide', this.onHide, this); // 等同于wx.onHide(this.onHide.bind(this));
168   - }
169   -
170   - private onShow(opts) {
171   - // 判断是否是来源于客服会话,上面的openCustomerServiceConversation的success设置的数据状态做判断
172   - let serviceRewardData = AppDataManager.I.get('service.pay.data');
173   - if (serviceRewardData && serviceRewardData.status === 1) {
174   - AppDataManager.I.set('service.pay.data', null);
175   - // 领取奖励的逻辑,比如每天只能领取一次的记录,防止重复刷奖励
176   - // 请求后端接口验证奖励合理性
177   - }
178   - }
179   -
180   - private onHide(){
181   - // 监听平台的onHide事件
182   - }
183   - }
184   - ```
185   -<div id="checkUpdate"></div>
186   -3. **checkUpdate**
187   -
188   - ```javascript
189   - PCSDK.platform.checkUpdate( params?: _ShowModalObject ): void
190   - ```
191   - 定义:检测版本是否有更新,如果版本有更新会弹出确认框,参数可不传递,不传递有版本更新会弹出下图的默认确认框;开发者可自定义弹出框的显示样式,参数与[wx.showModal](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showModal.html)一模一样。
192   - 建议此api在游戏的入口调用。
193   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_029.png "🔍点击查看大图")
194   -
195   - 参数:
196   -
197   - ```javascript
198   - params _ShowModalObject 选传 不传递有版本更新会弹出上图样式默认确认框;开发者可自定义弹出框的显示样式,参数参照wx.showModal的参数
199   - {
200   - title string 选传 提示的标题,默认为:更新提示
201   - content string 选传 提示的内容,默认为:新版本已经准备好,是否重启应用?
202   - showCancel boolean 选传 是否显示取消按钮,默认为:false不显示
203   - cancelText string 选传 取消按钮的文字,最多4个字符
204   - cancelColor string 选传 取消按钮的文字颜色,必须是16进制格式的颜色字符串
205   - confirmText string 选传 确认按钮的文字,最多4个字符
206   - confirmColor string 选传 确认按钮的文字颜色,必须是16进制格式的颜色字符串
207   - success function 选传 接口调用成功的回调函数
208   - fail function 选传 接口调用失败的回调函数
209   - complete function 选传 接口调用结束的回调函数(调用成功、失败都会执行)
210   - }
211   - ```
212   - 返回值:
213   -
214   - ```
215   - void
216   - 无
217   - ```
218   -
219   - 示例:在游戏入口类中检测是否有版本更新
220   -
221   - 1)、依照下面的示例接入checkUpdate api
222   -
223   - ```javascript
224   - class Main {
225   - constructor() {
226   - this.init();
227   - }
228   -
229   - private init() {
230   - this.checkUpdate();
231   - }
232   -
233   - private checkUpdate() {
234   - // 调用SDK的checkUpdate,微信版本有更新,会自动弹出更新确认框
235   - PCSDK.platform.checkUpdate();
236   -
237   - // 自定义更新弹出框
238   - /*
239   - PCSDK.platform.checkUpdate({
240   - showCancel: true,
241   - content: '客官,xxx游戏有更新了!',
242   - cancelText: '放弃'
243   - });
244   - */
245   - }
246   - }
247   -
248   - ```
249   - 2)、接入代码完毕后,按照下图的操作本地开发工具调试是否接入成功。
250   -
251   - I、选择:添加编译模式。
252   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_030.png "🔍点击查看大图")
253   - II、选择:自定义模式名称、勾选下次编译时模拟更新、选择模拟成功还是失败状态,点击确定。
254   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_031.png "🔍点击查看大图")
255   - III、开发工具会自动重新启动游戏,弹出更新框,看到弹出框接入成功。
256   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_032.png "🔍点击查看大图")
257   -<div id="copy"></div>
258   -4. **copy**
259   -
260   - ```javascript
261   - PCSDK.platform.copy( str: string ): Promise<any>
262   - ```
263   - 定义:设置系统剪贴板的内容。提示:微信小游戏调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s
264   -
265   - 参数:
266   -
267   - ```javascript
268   - str string 必传 剪贴板的内容
269   -
270   - ```
271   - 返回值:
272   -
273   - ```
274   - Promise<any>
275   - Promise resolve复制系统剪贴板内容成功回调,reject失败回调
276   - ```
277   -
278   - 示例:
279   -
280   - ```javascript
281   - PCSDK.platform.copy('这是我想要复制的内容')
282   - .then( ret => {
283   - // 打印复制的内容
284   - console.log(ret.data);
285   - })
286   - .catch(err => {
287   - console.warn('复制失败', err);
288   - });
289   - ```
290   -<div id="vibrate"></div>
291   -4. **vibrateShort**
292   -```javascript
293   - PCSDK.platform.vibrateShort(): Promise<any>
294   -```
295   -定义:使手机发生较短时间的振动(15 ms)。仅在 iPhone 7 / 7 Plus 以上及 Android 机型生效
296   -参数:
297   -
298   - ```javascript
299   - 无
300   - ```
301   -示例:
302   -
303   - ```javascript
304   - PCSDK.platform.vibrateShort();
305   -
306   - ```
307   -5. **vibrateLong**
308   -
309   - ```javascript
310   - PCSDK.platform.vibrateLong(): Promise<any>
311   - ```
312   - 定义:使手机发生较长时间的振动(400 ms)
313   - 参数:
314   - ```javascript
315   - 无
316   - ```
317   - 示例:
318   - ```javascript
319   - PCSDK.platform.vibrateLong();
320   - ```
321   -<div id="gamePortal"></div>
322   -6. **gamePortalShow**
323   - ```javascript
324   - PCSDK.platform.gamePortalShow(adUnitId: string): Promise<any>
325   - ```
326   - 定义:传入adUnitId创建并展示小游戏推荐弹窗组件,Promise resolve创建展示成功回调,reject创建失败回调。
327   -
328   - 参数:
329   - ```javascript
330   - adUnitId string 必传 小游戏推荐弹窗组件推荐单元id
331   - ```
332   - 返回值:
333   - ```javascript
334   - Promise<any>
335   - Promise resolve创建展示成功回调,reject创建失败回调
336   - ```
337   - 示例:
338   - ```javascript
339   - // 例子1:显示弹窗组件
340   - let adUnitId: string = 'PBgAAgPWNXGtCwcA';
341   - PCSDK.platform.gamePortalShow(adUnitId);
342   -
343   - // 例子2:显示推荐弹窗组件,如果显示不成功,则显示小游戏插屏广告,插屏广告api使用请继续往下看。
344   - let adUnitId: string = 'PBgAAgPWNXGtCwcA';
345   - PCSDK.platform.gamePortalShow(adUnitId).catch(err => {
346   - // 推荐弹窗组件显示不成功显示插屏广告
347   - adUnitId = 'adunit-4da0ec77513f8eea';
348   - PCSDK.platform.interstitialShow(adUnitId);
349   - });
350   -
351   - ```
352   -7. **isGamePortalPlaying**
353   -
354   - ```javascript
355   - PCSDK.platform.isGamePortalPlaying(): boolean
356   - ```
357   -
358   - 定义:是否正在加载小游戏推荐弹窗组件;在PCSDK.platform.gamePortalShow api内部,如果正在创建弹窗组件会在Promise reject返回错误提示信息。
359   -
360   - 参数:
361   -
362   - ```javascript
363   - 无
364   - ```
365   - 返回值:
366   -
367   - ```javascript
368   - boolean
369   - ```
370   -
371   - 示例:
372   -
373   - ```javascript
374   - let isPlaying = PCSDK.platform.isGamePortalPlaying();
375   -
376   - ```
377   -<div id="interstitialAd"></div>
378   -8. **interstitialShow**
379   -
380   - ```javascript
381   - PCSDK.platform.interstitialShow(adUnitId: string): Promise<any>
382   - ```
383   -
384   - 定义:传入adUnitId创建并展示小游戏插屏广告组件,Promise resolve创建展示成功回调,reject创建失败回调
385   -
386   - 参数:
387   -
388   - ```javascript
389   - adUnitId string 必传 小游戏插屏广告组件广告单元id
390   - ```
391   - 返回值:
392   -
393   - ```javascript
394   - Promise<any>
395   - Promise resolve创建展示成功回调,reject创建失败回调
396   - ```
397   -
398   - 示例:
399   -
400   - ```javascript
401   - // 例子1:显示插屏广告组件
402   - let adUnitId: string = 'adunit-4da0ec77513f8eea';
403   - PCSDK.platform.interstitialShow(adUnitId);
404   -
405   - // 例子2:显示插屏广告组件,如果显示不成功,则显示小游戏推荐弹窗组件。
406   - let adUnitId: string = 'adunit-4da0ec77513f8eea';
407   - PCSDK.platform.interstitialShow(adUnitId).catch( err => {
408   - // 加载不成功显示小游戏推荐弹窗组件
409   - adUnitId = 'PBgAAgPWNXGtCwcA';
410   - PCSDK.platform.gamePortalShow(adUnitId);
411   - });
412   - ```
413   -9. **isInterstitialPlaying**
414   -
415   - ```javascript
416   - PCSDK.platform.isInterstitialPlaying(): boolean
417   - ```
418   -
419   - 定义:是否正在加载小游戏插屏广告组件;在PCSDK.platform.interstitialShow如果正在创建插屏广告会在Promise reject返回错误提示信息。
420   -
421   - 参数:
422   -
423   - ```javascript
424   - 无
425   - ```
426   - 返回值:
427   -
428   - ```javascript
429   - boolean
430   - ```
431   -
432   - 示例:
433   -
434   - ```javascript
435   - let isPlaying = PCSDK.platform.isInterstitialPlaying();
436   -
437   - ```
438   -<div id="gameicon"></div>
439   -10. **gameIconShow**
440   - ```javascript
441   - PCSDK.platform.gameIconShow(adUnitId: string, opts: { count: number, style: Array<_GameIconStyleItem> }): Promise<any>
442   - ```
443   -
444   - 定义:创建并显示小游戏推荐icon组件。
445   -
446   - 参数:
447   -
448   - ```javascript
449   - adUnitId string 必传 小游戏推荐icon组件广告单元id
450   - opts object 必传 扩展参数,目前支持count和style两个属性值
451   - {
452   - count number 必传 游戏icon的数量,请注意,正式版下面渲染出来的icon数量会小于等于count,请注册做好样式兼容
453   - style Array<_GameIconStyleItem> 必传 数组的每一项可以针对对应的icon设置位置和样式等信息,style的每一项称为_GameIconStyleItem
454   - }
455   -
456   - Object _GameIconStyleItem:单个游戏icon的位置和样式信息
457   - {
458   - appNameHidden boolean 必传 游戏名称是否隐藏
459   - color string 必传 游戏名称的颜色色值
460   - size number 必传 游戏icon的宽高值
461   - borderWidth number 必传 游戏icon的border尺寸
462   - borderColor string 必传 游戏icon的border颜色色值
463   - left number 必传 游戏icon的X轴坐标
464   - top number 必传 游戏icon的Y轴坐标
465   - }
466   - ```
467   - 返回值:
468   -
469   - ```javascript
470   - Promise<any>
471   - Promise resolve创建展示成功回调,reject创建失败回调
472   - ```
473   -
474   - 示例:
475   -
476   - ```javascript
477   - // 显示1个推荐icon组件
478   - private showGameIcon(){
479   - let adUnitId: string = 'PBgAAgPWNXGkQ4p0';
480   - let {windowWidth} = PCSDK.platform.getSystemData();
481   - PCSDK.platform.gameIconShow(adUnitId, {
482   - count: 1,
483   - style: [
484   - {
485   - appNameHidden: false,
486   - color: "#FF0000",
487   - size: 50,
488   - borderWidth: 0,
489   - borderColor: "#FF0000",
490   - left: (windowWidth / 750) * 550,
491   - top: (windowWidth / 750) * 150
492   - }
493   - ]
494   - })
495   - .then(() => {
496   - // console.warn('显示GameIcon成功');
497   - })
498   - .catch((err) => {
499   - // console.warn('显示GameIcon失败');
500   - });
501   - }
502   -
503   - ```
504   -11. **gameIconDestroy**
505   -
506   - ```javascript
507   - PCSDK.platform.gameIconDestroy(): void
508   - ```
509   -
510   - 定义:销毁正在展示的小游戏推荐icon组件。展示推荐icon组件广告后,请记得在页面关闭时候调用此api销毁GameIcon。
511   -
512   - 参数:
513   -
514   - ```javascript
515   - 无
516   - ```
517   - 返回值:
518   -
519   - ```javascript
520   - void
521   - ```
522   -
523   - 示例:
524   -
525   - ```javascript
526   -
527   - private open(){
528   - super.open();
529   - this.showGameIcon();
530   - }
531   -
532   - private close(){
533   - super.close();
534   - this.destoryGameIcon();
535   - }
536   -
537   - // 显示2个推荐icon组件
538   - private showGameIcon(){
539   - let adUnitId: string = 'PBgAAgPWNXGkQ4p0';
540   - let {windowWidth} = PCSDK.platform.getSystemData();
541   - PCSDK.platform.gameIconShow(adUnitId, {
542   - count: 2,
543   - style: [
544   - {
545   - appNameHidden: false,
546   - color: "#FF0000",
547   - size: 50,
548   - borderWidth: 0,
549   - borderColor: "#FF0000",
550   - left: (windowWidth / 750) * 450,
551   - top: (windowWidth / 750) * 150
552   - },
553   - {
554   - appNameHidden: false,
555   - color: "#FF0000",
556   - size: 50,
557   - borderWidth: 0,
558   - borderColor: "#FF0000",
559   - left: (windowWidth / 750) * 550,
560   - top: (windowWidth / 750) * 150
561   - }
562   - ]
563   - })
564   - .then(() => {
565   - // console.warn('显示GameIcon成功');
566   - })
567   - .catch((err) => {
568   - // console.warn('显示GameIcon失败');
569   - });
570   - }
571   -
572   - // 销毁展示创建的GameIcon组件
573   - private destoryGameIcon(){
574   - PCSDK.platform.gameIconDestroy();
575   - }
576   -
577   - ```
578 0 \ No newline at end of file
... ... @@ -1,539 +0,0 @@
1   -
2   -# 分享视频模块
3   -
4   -------
5   -
6   -#### **简介**
7   -小游戏生态中,普遍把平台提供的分享/视频接口更多用于某个奖励领取、获取n倍奖励、游戏死亡复活、转盘额外次数获得等等一种有效途径(分享:拉取新用户,视频:赚钱广告费);噗嗤游戏在分享or视频推送不断的探索迭代中,总结了一套分享/视频积分策略,集成在SDK中开放给开发者,开发者只需对游戏中分享视频功能点命名一个英文名称key(分享视频key),这个key关联分享文案、分享图、分享开关(推送类型)、视频uid等等在后台配置好,使用SDK提供的一个dispatch api传入英文名称key即可完成接入工作。
8   -
9   -- 分享/视频配置可以让开发者在后台中动态修改相关功能点的分享/视频配置内容。
10   -
11   -- 新增某个功能的分享点配置、在线修改相关功能点的分享图或文案、在线切换某个功能点按钮的分享/视频推送类型。
12   -
13   -- 调用SDK的dispatch api,dispatch会根据后台配置的分享开关(推送类型)自动进行分发:推送分享还是视频全权交由SDK去处理,开发者只需要传入成功/失败回调函数,成功回调函数处理发放领取奖励、n倍奖励、成功复活等操作,失败回调函数处理参数传递的msg信息。
14   -
15   -#### **疑惑解答**
16   -1. 为什么要引入这个模块?
17   -
18   - > 游戏中很多n倍奖励、复活、额外奖励等功能点通常需要分享或者视频才能额外获得,游戏上线后,运营很有可能会对某些功能点有额外的需求修改:a功能点获取由分享改成视频方式获取、b功能点由视频改成分享方式获取、c功能点需要在前面n次看视频获得后全是分享获得、为某某功能的分享图想换一个、拉取视频不成功自动切换分享等等;为了应对这些不同情形,我们把分享和视频点包装成一个模块,a功能点也不在局限于只是简单的分享、b功能只是视频,而是通过后台分享开关去灵活切换。所有功能点入口调用都是使用dispatch,每个功能点都是转化为一个分享视频key在后台管理。
19   -
20   -2. 什么是分享视频key?
21   -
22   - > 分享视频key是一个功能点的英文名称,这个key配置在后台中,关联分享文案、分享图、分享开关(推送类型)、视频uid等等信息。某个功能点(不论是分享还是视频方式)调用dispatch传入这个key,SDK会读取这个key关联的信息,根据分享开关(推送类型)来推送分享(需要分享文案、分享图)还是推送视频(需要视频uid)。
23   -
24   -3. 什么是分享视频分发?
25   -
26   - > 调用dispatch api传入分享视频key,SDK会查找这个key在后台配置的数据,SDK读取数据中分享开关(推送类型)的字段信息,通过这个开关类型来判断推给用户是分享还是视频,这个根据类型来推送的操作就是分发操作。
27   -
28   -4. 游戏中之前是玩家分享n次后变成看视频或者是看视频n次后全是分享,dispatch能满足吗?
29   -
30   - > 上面的问题dispatch也同样支持,还是同样的调用方式,不需要做其他额外处理,dispatch是怎么做到的了:分享开关(推送类型)有一个分享积分选择项,这个选项就是通过积分策略实现了上面问题。
31   - >
32   -
33   -
34   -#### **后台使用**
35   -
36   -配置分享视频配置,登录后台->头部tab切换到【游戏数据】->【配置相关】->【分享/视频配置】可新增、编辑修改分享/视频内容:
37   -
38   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_023.png "🔍点击查看大图")
39   -
40   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_024.png "🔍点击查看大图")
41   -
42   -接入分享视频模块后,后台已经对分享和视频数据分别进行整理统计了,游戏接入方可实时查看分享/视频的各项数据:
43   -
44   -查看分享分析,登录后台->头部tab切换到【游戏数据】->【产品分析】->【分享分析】可阅览游戏分享数据的各项统计:
45   -
46   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_025.png "🔍点击查看大图")
47   -
48   -查看视频广告详情,登录后台->头部tab切换到【游戏数据】->【配置相关】->【视频广告详情】可阅览游戏各个功能点视频数据统计:
49   -
50   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_026.png "🔍点击查看大图")
51   -
52   -
53   -
54   -#### **接入必读**
55   -
56   -- 接入此模块前,请[**前往sdk/config.js文件中配置【IsUseShareModule: true 】开启分享视频模块功能**](install.md#config_env),此参数配置为true,才能正常使用此模块的功能,SDK启动时会自动拉取后台配置所有功能点的分享/视频配置列表。
57   -
58   -- <font color="#FF0000">微信小游戏开发者接入此模块,如果游戏有很多分享点,提审时避免触犯微信平台的[滥用分享行为](https://developers.weixin.qq.com/minigame/product/#_5-1-滥用分享行为),在后台【配置参数】中配置了一个SDK内部使用的[配置参数](online.md)share_unlock,进行分享开关切换:1(开启)0(关闭),提审时设置为0,审核通过后设为1。share_unlock设置为0,所有的功能点不会分享完成、拉起看完视频后发放奖励,而是直接发放奖励,这样就能避免审核时,如果是推送分享拉起分享,被微信认为是诱导分享,被拒的可能性。
59   -
60   -- sdk/config.js的配置参数ShareRightKey,表示右上角分享的分享视频key,请配置到后台【分享/视频配置】中。如果ShareRightKey配置不为空,SDK会自动调用微信的右上角分享接口(wx.onShareAppMessage),实现右上角分享功能,注意的是开发者在游戏中已经有注册wx.onShareAppMessage需要删除掉,不然游戏中onShareAppMessage的注册事件会把SDK中的注册事件处理函数覆盖掉,导致还是使用的是开发者注册的右上角分享功能。
61   -
62   -- sdk/config.js的配置参数ShareData表示默认分享视频配置,此条配置应用在两种情况下:
63   -
64   - > 1、请求功能点的分享/视频配置列表出错,使用key去查找对应的分享配置肯定是查找不到的,会读取此条默认数据。
65   - >
66   - >
67   - >
68   - > 2、请求功能点的分享/视频配置列表成功了,但是这个key没有配置到后台,也会读取此条默认数据
69   -
70   -#### **接入**API:
71   -
72   -| **名称** | **功能说明** |
73   -| ------------------------------- | ------------------------------------------------------------ |
74   -| PCSDK.shareVideo.share | 普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。 |
75   -| PCSDK.shareVideo.dispatch | 分享视频分发入口,传入功能点英文命名的分享/视频key |
76   -| PCSDK.shareVideo.getShareVideoType | 根据功能点在后台配置的分享/视频key,得到此功能点分享开关(推送类型)SDK计算得到最终推送类型:-1(无视频无分享)、0(分享)、1(异步分享)、5(分享积分)、2(视频)、3(无视频则分享)、4(视频和分享)(控制分享和视频两个按钮的显示) |
77   -
78   -
79   -
80   -1. ##### **share**
81   -
82   - ```javascript
83   - PCSDK.shareVideo.share(key:sring, params?: any, opts?: any): void
84   - ```
85   -
86   - 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。
87   -
88   - 参数:
89   -
90   - ```javascript
91   - key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key)
92   -
93   - params: object 选传 扩展参数:分享链接query携带自定义参数,{ key: value }对象形式,该对象传递的参数会与SDK内部query参数一起组成query(查询参数, key1=val1&key2=val2的格式)的值,SDK内部参数key有:channel_id、user_invite_uid、share_id、share_key。
94   -
95   - 提示:params传递的对象中如果含有传递SDK内部query参数key,会被SDK内部参数值覆盖,所以开发者避免传递这些key。
96   -
97   - opts: object 选传 可不传递
98   -
99   - ```
100   -
101   - 返回值:
102   -
103   - ```javascript
104   - void
105   - ```
106   -
107   - 示例:游戏首页分享到群的功能,假如config.js配置的ChannelId: 20024;后台配置的分享视频key: home_share2group、此分享key的id:512;用户id:100000。
108   -
109   - ```javascript
110   - // 示例1:
111   - // 分享后生成的query:share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000
112   - PCSDK.shareVideo.share( 'home_share2group' );
113   -
114   - // 示例2:第二个参数是分享生成的query携带的参数
115   - // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000
116   - PCSDK.shareVideo.share( 'home_share2group', {
117   - type:99
118   - });
119   -
120   - // 示例3:第二个参数是分享生成的query携带的参数,传递SDK内部query参数:channel_id
121   - // 分享后生成的query:type=99&share_id=512&share_key=home_share2group&channel_id=20024&user_invite_uid=100000
122   - PCSDK.shareVideo.share( 'home_share2group', {
123   - type:99,
124   - channel_id:10000
125   - });
126   - ```
127   -
128   -2. ##### **dispatch**
129   -
130   - ```javascript
131   - PCSDK.shareVideo.dispatch( key: string, params?: { success: Function, fail: Function, context?: any} ): void
132   - ```
133   -
134   - 定义:普通分享,不需要处理回调的场景,例如分享到群、分享到好友,这些普通的分享,而不用处理成功/失败回调函数。
135   -
136   - 参数:
137   -
138   - ```javascript
139   - key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key)
140   -
141   - params: object 选传 扩展参数:success分享视频成功回调处理函数,fail分享视频失败回调处理函数,contex函数执行上下文
142   - {
143   - success: ( from:number, ret: any | null ) => void,
144   - error: ( from:number, error: object | null ) => void,
145   - context: any
146   - }
147   -
148   - from:此次分发成功推送类型
149   - from返回枚举值为:
150   - 0:无视频无分享(后台配置分享开关(推送类型)or 应对审核分享关闭:配置参数share_unlock设置为0)
151   - 1:推送同步分享
152   - 2:推送异步分享
153   - 3:推送视频
154   -
155   - error:此次分发失败的错误消息
156   - error返回枚举值为:
157   - { code: 1000, msg: '要看完视频哦!' },
158   - { code: 1001, msg: '视频加载失败!' },
159   - { code: 999, msg: '视频UID不存在!' },
160   - { code: 1002, msg: '视频组件未开放!' },
161   - { code: 1003, msg: '正在观看视频中...' },
162   - { code: 1004, msg: '分享失败,请尝试发送至不同群!' },
163   - { code: 1005, msg: '别总骚扰这个群,换个群分享吧!' },
164   - { code: 1006, msg: '请分享到群哦!' },
165   - { code: 1007, msg: '分享到群才能领取更多~' },
166   - { code: 1008, msg: '分享失败,请尝试发送至不同群!' },
167   - { code: 1009, msg: '今日已达分享上限次数,请明日再来' }
168   - ```
169   -
170   - 返回值:
171   -
172   - ```javascript
173   - void
174   - ```
175   -
176   - 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。
177   -
178   - 演示
179   -
180   - ```javascript
181   - // DiamondDoublePopwin.ts文件
182   - export default class DiamondDoublePopwin extends BaseView{
183   - protected addEvent() {
184   - super.addEvent();
185   - // 免费领取双倍(应对微信审核,审核分享不能开放时候使用)
186   - this.btnFree.on(Laya.Event.CLICK, this, this.onReward);
187   - // 分享双倍
188   - this.btnShare.on(Laya.Event.CLICK, this, this.onReward);
189   - // 视频双倍
190   - this.btnVideo.on(Laya.Event.CLICK, this, this.onReward);
191   - }
192   -
193   - protected removeEvent() {
194   - super.removeEvent();
195   - this.btnFree.off(Laya.Event.CLICK, this, this.onReward);
196   - this.btnShare.off(Laya.Event.CLICK, this, this.onReward);
197   - this.btnVideo.off(Laya.Event.CLICK, this, this.onReward);
198   - }
199   -
200   - // 领取奖励操作
201   - private onReward(){
202   - PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), {
203   - success: this.handleReward,
204   - fail: this.handleError,
205   - context: this
206   - } );
207   - }
208   -
209   - // 分享/视频成功后回调处理函数:发奖励
210   - private handleReward(from: ShareVideoFrom, ret: any | null){
211   - // 分享成功、视频成功、无视频无分享
212   - }
213   -
214   - // 分享/视频失败后回调处理函数:弹出提示
215   - private handleError(from: ShareVideoFrom, error: any | null){
216   - // 返回错误,处理错误msg信息,自定义处理
217   - if( error ){
218   - wx.showToast({
219   - title: error.msg
220   - });
221   - }
222   - }
223   - }
224   -
225   - // Enums.ts文件
226   - // 分享视频key枚举,每个key表示一个功能点
227   - enum ShareVideoKeys {
228   - // 钻石双倍获取
229   - DiamondDouble = 'diamond_double',
230   - // 失败获得双倍奖励
231   - FailRewardDouble = 'fail_reward_double'
232   - }
233   -
234   - // 分享视频功能点最终处理方式
235   - enum ShareVideoFrom{
236   - None = 0, // 无视频无分享
237   - Share = 1, // 分享
238   - ShareAsync = 2, // 异步分享
239   - Video = 3, // 看视频
240   - }
241   - ```
242   -
243   -3. ##### **getShareVideoType**
244   -
245   - ```javascript
246   - PCSDK.shareVideo.getShareVideoType( key: string ): number
247   - ```
248   -
249   - 定义:根据分享视频key获取此次shareVideo模块推送的分享视频类型值:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分);此api用于通过得到的类型值处理页面的ui状态(微信和QQ平台对按钮的icon有强制限制):显示视频icon、显示分享icon、既没有分享icon,也没有视频icon。
250   -
251   - 参数:
252   - ```javascript
253   - key: string 必传 功能点的分享/视频key(后台 ->【游戏数据】 ->【配置相关】->【分享/视频配置】配置的key)
254   - ```
255   -
256   - 返回值:
257   -
258   - ```javascript
259   - number
260   - 返回值此次点击功能按钮触发的推送类型:-1(无视频无分享:提审时返回)、0(推送同步分享)、1(推送异步分享)、2(推送看视频)、3(无视频则分享)、4(视频和分享)、5(分享积分)
261   - 分享视频类型枚举值如下:
262   - // 推送类型:分享视频类型枚举
263   - enum ShareVideoType {
264   - None = -1, // -1无分享无视频
265   - Share = 0, // 0分享
266   - ShareAysnc = 1, // 1异步分享
267   - ShareIntegral = 5, // 5分享积分
268   - Video = 2, // 2看视频
269   - VideoToShare = 3, // 3无视频则分享
270   - VideoAndShare = 4 // 4视频和分享(控制分享和视频两个按钮的显示) ,
271   - }
272   - ```
273   -
274   - 示例:下面只是api的简单演示,详细案例,请戳[详细使用示例](share.md#detail)。
275   -
276   - ```javascript
277   - // DiamondDoublePopwin.ts文件
278   - export default class DiamondDoublePopwin extends BaseView{
279   - protected addEvent() {
280   - super.addEvent();
281   - // 免费领取双倍(应对微信审核,审核分享不能开放时候使用)
282   - this.btnFree.on(Laya.Event.CLICK, this, this.onReward);
283   - // 分享双倍
284   - this.btnShare.on(Laya.Event.CLICK, this, this.onReward);
285   - // 视频双倍
286   - this.btnVideo.on(Laya.Event.CLICK, this, this.onReward);
287   - }
288   -
289   - protected removeEvent() {
290   - super.removeEvent();
291   - this.btnFree.off(Laya.Event.CLICK, this, this.onReward);
292   - this.btnShare.off(Laya.Event.CLICK, this, this.onReward);
293   - this.btnVideo.off(Laya.Event.CLICK, this, this.onReward);
294   - }
295   -
296   - // 每次打开此popwin执行onOpen
297   - protected onOpen(){
298   - super.onOpen();
299   - this.iniitRewardUI();
300   - }
301   -
302   - // 初始化/更新获得奖励按钮ui
303   - private initRewardUI() {
304   - let shareVideoType: ShareVideoType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString());
305   - switch (shareVideoType) {
306   - case ShareVideoType.Share: // 同步分享
307   - case ShareVideoType.ShareAysnc: // 异步分享
308   - case ShareVideoType.ShareIntegral: // 分享积分
309   - this.btnFree.visible = false;
310   - this.btnShare.visible = true;
311   - this.btnVideo.visible = false;
312   - break;
313   -
314   - case ShareVideoType.Video: // 推送视频
315   - case ShareVideoType.VideoToShare: // 无视频则分享
316   - // 视频ui状态
317   - this.btnFree.visible = false;
318   - this.btnShare.visible = false;
319   - this.btnVideo.visible = true;
320   - break;
321   -
322   - default: // 无视频和无分享
323   - // 既不显示分享ui又不显示视频ui,直接领奖ui状态
324   - this.btnFree.visible = true;
325   - this.btnShare.visible = false;
326   - this.btnVideo.visible = false;
327   - break;
328   - }
329   - }
330   -
331   - // 领取奖励操作
332   - private onReward(){
333   - PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), {
334   - success: this.handleReward,
335   - fail: this.handleError,
336   - context: this
337   - } );
338   - }
339   -
340   - // 分享/视频成功后回调处理函数:发奖励
341   - private handleReward(from: ShareVideoFrom, ret: any | null){
342   - // 分享成功、视频成功、无视频无分享
343   - }
344   -
345   - // 分享/视频失败后回调处理函数:弹出提示
346   - private handleError(from: ShareVideoFrom, error: any | null){
347   - // 返回错误,处理错误msg信息,自定义处理
348   - if( error ){
349   - wx.showToast({
350   - title: error.msg
351   - });
352   - }
353   - }
354   - }
355   -
356   - // Enums.ts文件
357   - // 分享视频类型(与后台一一对应)
358   - export enum ShareVideoType {
359   - None = -1, // -1无分享无视频
360   - Share = 0, // 0同步分享
361   - ShareAysnc = 1, // 1异步分享
362   - ShareIntegral = 5, // 5分享积分
363   - Video = 2, // 2看视频
364   - VideoToShare = 3, // 3无视频则分享
365   - VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示)
366   - }
367   -
368   - // 分享视频key枚举,每个key表示一个功能点
369   - enum ShareVideoKeys {
370   - // 钻石双倍获取
371   - DiamondDouble = 'diamond_double',
372   - // 失败获得双倍奖励
373   - FailRewardDouble = 'fail_reward_double'
374   - }
375   -
376   - // 分享视频功能点最终推送类型
377   - enum ShareVideoFrom{
378   - None = 0, // 无视频无分享
379   - Share = 1, // 分享
380   - ShareAsync = 2, // 异步分享
381   - Video = 3, // 看视频
382   - }
383   -
384   - ```
385   - <div id="detail"></div>
386   - 下面演示dispatch和getShareVideoType两个api的完整使用,Laya引擎开发:
387   -
388   - 页面功能点按钮做三个状态:
389   -
390   - 1、看视频状态(显示视频icon)
391   -
392   - 2、分享状态(显示分享icon)
393   -
394   - 3、直接领奖(没有icon,审核状态)
395   -
396   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_1.png "🔍点击查看大图")
397   -
398   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_2.png "🔍点击查看大图")
399   -
400   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_3.png "🔍点击查看大图")
401   -
402   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_027_4.png "🔍点击查看大图")
403   -
404   - 例如,一个领取钻石双倍,页面的按钮ui通过下面的方式进行切换
405   -
406   - 1、页面做三个按钮:视频icon按钮、分享icon按钮、直接领取按钮
407   -
408   - 2、进入页面根据配置的key获取类型,显示对应类型ui:调用下面的initRewardUI(可随意命名)
409   -
410   - 3、<font color="#FF0000">分享或者视频后,SDK会发送一个tactic.update的消息过来,使用PCSDK.event.add注册监听,PCSDK.event.remove移除监听(PCSDK.event详细了解请查看[事件模块](event.md)),监听事件处理下一次推送显示ui状态:执行一下initRewardUI。</font>
411   -
412   - 4、给三个按钮都注册事件:onReward
413   - ```javascript
414   - // DiamondDoublePopwin.ts文件
415   - export default class DiamondDoublePopwin extends BaseView {
416   - protected addEvent() {
417   - super.addEvent();
418   - // 免费领取双倍(应对微信审核,审核分享不能开放时候使用)
419   - this.btnFree.on(Laya.Event.CLICK, this, this.onReward);
420   - // 分享双倍
421   - this.btnShare.on(Laya.Event.CLICK, this, this.onReward);
422   - // 视频双倍
423   - this.btnVideo.on(Laya.Event.CLICK, this, this.onReward);
424   - // PCSDK.event.add注册监听SDK发送的消息:tactic.update,更新获得奖励按钮ui
425   - PCSDK.event.add('tactic.update', this.initRewardUI, this);
426   - }
427   -
428   - protected removeEvent() {
429   - super.removeEvent();
430   - this.btnFree.off(Laya.Event.CLICK, this, this.onReward);
431   - this.btnShare.off(Laya.Event.CLICK, this, this.onReward);
432   - this.btnVideo.off(Laya.Event.CLICK, this, this.onReward);
433   - // PCSDK.event.remove移除监听SDK发送的消息:tactic.update
434   - PCSDK.event.remove('tactic.update', this.initRewardUI, this);
435   - }
436   -
437   - // 每次打开此popwin执行onOpen
438   - protected onOpen(){
439   - super.onOpen();
440   - // 界面打开
441   - this.initRewardUI();
442   - }
443   -
444   - // 领取奖励操作
445   - private onReward(){
446   - PCSDK.shareVideo.dispatch( ShareVideoKeys.DiamondDouble.toString(), {
447   - success: this.handleReward,
448   - context: this
449   - } );
450   - }
451   -
452   - // 分享/视频成功后回调处理函数:发奖励
453   - private handleReward(from: ShareVideoFrom, ret: any | null){
454   - // 分享成功、视频成功、无视频无分享
455   - }
456   -
457   - // 分享/视频失败后回调处理函数:弹出提示
458   - private handleError(from: ShareVideoFrom, error: any | null){
459   - // 返回错误,处理错误msg信息,自定义处理
460   - if( error ){
461   - wx.showToast({
462   - title: error.msg
463   - });
464   - }
465   - }
466   -
467   - // 初始化/更新获得奖励按钮ui
468   - private initRewardUI() {
469   - let shareVideoType: ShareType = PCSDK.shareVideo.getShareVideoType(ShareVideoKeys.DiamondDouble.toString());
470   - switch (shareVideoType) {
471   - case ShareVideoType.Share: // 同步分享
472   - case ShareVideoType.ShareAysnc: // 异步分享
473   - case ShareVideoType.ShareIntegral: // 分享积分
474   - // 分享ui状态
475   - this.stat_share.play(0,false);
476   - // 等同于
477   - // this.btnFree.visible = false;
478   - // this.btnShare.visible = true;
479   - // this.btnVideo.visible = false;
480   - break;
481   -
482   - case ShareVideoType.Video: // 视频
483   - case ShareVideoType.VideoToShare: // 无视频则分享
484   - // 视频ui状态
485   - this.stat_video.play(0,false);
486   - // 等同于
487   - // this.btnFree.visible = false;
488   - // this.btnShare.visible = false;
489   - // this.btnVideo.visible = true;
490   - break;
491   -
492   - default: // 无视频和无分享
493   - // 既不显示分享ui又不显示视频ui,直接领奖ui状态
494   - this.stat_free.play(0,false);
495   - // 等同于
496   - // this.btnFree.visible = true;
497   - // this.btnShare.visible = false;
498   - // this.btnVideo.visible = false;
499   - break;
500   - }
501   - }
502   - }
503   -
504   - // Enums.ts文件
505   - // 分享视频类型(与后台一一对应)
506   - export enum ShareVideoType {
507   - None = -1, // -1无分享无视频
508   - Share = 0, // 0同步分享
509   - ShareAysnc = 1, // 1异步分享
510   - ShareIntegral = 5, // 5分享积分
511   - Video = 2, // 2看视频
512   - VideoToShare = 3, // 3无视频则分享
513   - VideoAndShare = 4, // 4视频和分享(控制分享和视频两个按钮的显示)
514   - }
515   -
516   - // 分享视频key枚举,每个key表示一个功能点
517   - enum ShareVideoKeys {
518   - // 钻石双倍获取
519   - DiamondDouble = 'diamond_double',
520   - // 失败获得双倍奖励
521   - FailRewardDouble = 'fail_reward_double'
522   - }
523   -
524   - // 分享视频功能点最终推送类型
525   - enum ShareVideoFrom{
526   - None = 0, // 无视频无分享
527   - Share = 1, // 分享
528   - ShareAsync = 2, // 异步分享
529   - Video = 3, // 看视频
530   - }
531   - ```
532   -
533   -
534   -
535   -#### **终章:**
536   -
537   -这个模块的内容点比较多,接入的注意事项也比较多,望接入者细度使用说明和理解示例意图。
538   -
539   -<font color="#FF0000">噗嗤游戏的小伙伴在开发公司内部游戏中使用此模块,简单封装了SDK分享视频模块的几个通用方法,提供开发者参考,</font>**[点击下载](https://dep.miso-lab.com/sdkword/tools/sdk-share-tools-1.0.0.zip)**。
... ... @@ -1,255 +0,0 @@
1   -# 启动注册打点
2   -
3   -------
4   -
5   -#### **简介**
6   -
7   -启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。
8   -
9   -
10   -
11   -#### **后台使用**
12   -
13   -完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息:
14   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png)
15   -
16   -点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息:
17   -
18   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png)
19   -
20   -
21   -
22   -
23   -
24   -#### **接入API:**
25   -
26   -| **名称** | **功能说明** |
27   -| ------------------------ | ------------------------------------------------------------ |
28   -| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 |
29   -| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) |
30   -| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 |
31   -
32   -
33   -
34   -接入流程图:
35   -
36   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png)
37   -
38   -1. **setLoginInfo**
39   - <div id="stat_login"></div>
40   - ```javascript
41   - PCSDK.stat.setLoginInfo( data: object ): void
42   - ```
43   -
44   - 定义:游戏成功登录到服务器,获取到openId和用户信息:<font color="#FF0000">openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息</font>
45   -
46   - 参数:
47   -
48   - ```javascript
49   - data: object
50   -{
51   - openId: string 必传,openId
52   - regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒)
53   - }
54   - ```
55   - 返回值:
56   -
57   - ```javascript
58   - 无
59   - ```
60   -
61   - 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。
62   - 该示例,只是模拟使用环境。
63   -
64   - ```javascript
65   - // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。
66   - Api.login().then( data => {
67   - let { user_openid, user_reg_time } = data;
68   - PCSDK.stat.setLogind({
69   - openId: user_openid, // openId
70   - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
71   - });
72   - });
73   - ```
74   -
75   -2. **loadingFinish**
76   -
77   - ```javascript
78   - PCSDK.stat.loadingFinish(): Promise<any>
79   - ```
80   -
81   - 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成)
82   -
83   - 参数:
84   -
85   - ```
86   - 无
87   - ```
88   - 返回值:
89   -
90   - ```javascript
91   - Promise<any>
92   - Promise resolve 加载打点成功完成回调
93   - ```
94   -
95   - 示例:
96   -
97   - ```javascript
98   - private async initEnv() {
99   - await SDKTools.env(Const.VERSION);
100   - this.loadRes();
101   - this.loadLogin();
102   - }
103   -
104   - // 开始加载资源
105   - private loadRes() {
106   - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
107   - }
108   -
109   - // 资源加载完成
110   - private onLoadedMain() {
111   - // 打点:loadingFinish
112   - PCSDK.stat.loadingFinish();
113   - }
114   -
115   - // 更新资源加载进度条
116   - private onProgressMain(ret) {
117   - let progress = ret.data;
118   - this.skin.txtProgress.text = Math.floor(progress * 100) + '%';
119   - }
120   - ```
121   -
122   -3. **active**
123   -
124   - ```javascript
125   - PCSDK.stat.active(): void
126   - ```
127   -
128   - 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式:
129   - 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。
130   -
131   - 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。
132   -
133   - 参数:
134   -
135   - ```javascript
136   - 无
137   - ```
138   - 返回值:
139   -
140   - ```javascript
141   - void
142   - 无
143   - ```
144   -
145   - 示例:
146   -
147   - ```javascript
148   - // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active
149   - // 资源加载loading界面
150   - class LoadingScene(){
151   - constructor(){
152   - // 登录
153   - this.login();
154   - // 加载资源
155   - this.loadResouce();
156   - }
157   -
158   - /**
159   - * 登录
160   - */
161   - private login(){
162   - Api.login().then( data => {
163   - let { user_openid, user_reg_time } = data;
164   - // 打点:设置用户信息
165   - PCSDK.stat.setLoginInfo({
166   - openId: user_openid, // openId
167   - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
168   - });
169   - });
170   - }
171   -
172   - /**
173   - * 加载资源
174   - */
175   - private loadResouce(){
176   - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
177   - }
178   -
179   - /**
180   - * 加载资源完成回调监听
181   - */
182   - private onLoadedMain(){
183   - // 打点:加载资源完成
184   - PCSDK.stat.loadingFinish().then( () => {
185   - // 打点:用户活跃注册打点
186   - PCSDK.stat.active();
187   -
188   - // 进入home主页场景
189   - SceneManager.I.switchScene(HomeScene);
190   - });
191   - }
192   - }
193   -
194   - // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。
195   - // 资源加载loading界面
196   - class LoadingScene(){
197   - constructor(){
198   - // 登录
199   - this.login();
200   - // 加载资源
201   - this.loadResouce();
202   - }
203   -
204   - /**
205   - * 登录
206   - */
207   - private login(){
208   - Api.login().then( data => {
209   - let { user_openid, user_reg_time } = data;
210   - // 打点:设置用户信息
211   - PCSDK.stat.setLoginInfo({
212   - openId: user_openid, // openId
213   - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
214   - });
215   - });
216   - }
217   -
218   - /**
219   - * 加载资源
220   - */
221   - private loadResouce(){
222   - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
223   - }
224   -
225   - /**
226   - * 加载资源完成回调监听
227   - */
228   - private onLoadedMain(){
229   - // 打点:加载资源完成
230   - PCSDK.stat.loadingFinish().then( () => {
231   - // 进入home主页场景
232   - SceneManager.I.switchScene(HomeScene);
233   - });
234   - }
235   - }
236   -
237   - // Home页面
238   - class HomeScene(){
239   - constructor(){
240   - this.btnStarGame.on('click', this.onGame, this);
241   - }
242   -
243   - /**
244   - * 按钮点击开始游戏
245   - */
246   - private onGame(){
247   - // 打点:用户活跃注册打点
248   - PCSDK.stat.active();
249   -
250   - // 进入游戏页面
251   - SceneManager.I.switchScene(GameScene);
252   - }
253   - }
254   -
255   - ```
256 0 \ No newline at end of file
stat_active.md
... ... @@ -1,255 +0,0 @@
1   -# 启动注册打点
2   -
3   -------
4   -
5   -#### **简介**
6   -
7   -启动注册打点上报用户注册活跃数据,噗嗤管理后台为游戏提供用户数据统计:实时获取活跃、新增用户数、打开次数、在线时长......;注册转化统计。
8   -
9   -
10   -
11   -#### **后台使用**
12   -
13   -完成启动注册打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【实时数据】即可实时查看用户活跃、新增等信息:
14   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_008.png)
15   -
16   -点击【注册转化】可查看列表式显示新增、注册、加载完成等详细信息:
17   -
18   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_009.png)
19   -
20   -
21   -
22   -
23   -
24   -#### **接入API:**
25   -
26   -| **名称** | **功能说明** |
27   -| ------------------------ | ------------------------------------------------------------ |
28   -| PCSDK.stat.setLoginInfo | 设置SDK必须要使用的openId、第一次创建角色的注册时间(时间戳转换,单位秒),游戏接入方登录游戏服务器后调用 |
29   -| PCSDK.stat.loadingFinish | 加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成) |
30   -| PCSDK.stat.active | 用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常 |
31   -
32   -
33   -
34   -接入流程图:
35   -
36   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_028.png)
37   -
38   -1. **setLoginInfo**
39   - <div id="stat_login"></div>
40   - ```javascript
41   - PCSDK.stat.setLoginInfo( data: object ): void
42   - ```
43   -
44   - 定义:游戏成功登录到服务器,获取到openId和用户信息:<font color="#FF0000">openId和用户第一次注册的时间(时间戳转换,单位秒),设置SDK必需的用户信息</font>
45   -
46   - 参数:
47   -
48   - ```javascript
49   - data: object
50   -{
51   - openId: string 必传,openId
52   - regTime: number 必传,用户第一次创建角色的注册时间(时间戳转换,单位秒)
53   - }
54   - ```
55   - 返回值:
56   -
57   - ```javascript
58   - 无
59   - ```
60   -
61   - 示例:游戏登录游戏服务器后,获取到用户openId和用户第一次创建角色的注册时间。
62   - 该示例,只是模拟使用环境。
63   -
64   - ```javascript
65   - // 发起登录请求成功后,得到用户信息:user_openid、user_reg_time,调用setLoginInfo设置SDK必需的用户信息。
66   - Api.login().then( data => {
67   - let { user_openid, user_reg_time } = data;
68   - PCSDK.stat.setLogind({
69   - openId: user_openid, // openId
70   - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
71   - });
72   - });
73   - ```
74   -
75   -2. **loadingFinish**
76   -
77   - ```javascript
78   - PCSDK.stat.loadingFinish(): Promise<any>
79   - ```
80   -
81   - 定义:加载游戏资源完成时打点,例如:游戏加载完成游戏ui界面图、json资源等(不是微信代码包白屏加载完成)
82   -
83   - 参数:
84   -
85   - ```
86   - 无
87   - ```
88   - 返回值:
89   -
90   - ```javascript
91   - Promise<any>
92   - Promise resolve 加载打点成功完成回调
93   - ```
94   -
95   - 示例:
96   -
97   - ```javascript
98   - private async initEnv() {
99   - await SDKTools.env(Const.VERSION);
100   - this.loadRes();
101   - this.loadLogin();
102   - }
103   -
104   - // 开始加载资源
105   - private loadRes() {
106   - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
107   - }
108   -
109   - // 资源加载完成
110   - private onLoadedMain() {
111   - // 打点:loadingFinish
112   - PCSDK.stat.loadingFinish();
113   - }
114   -
115   - // 更新资源加载进度条
116   - private onProgressMain(ret) {
117   - let progress = ret.data;
118   - this.skin.txtProgress.text = Math.floor(progress * 100) + '%';
119   - }
120   - ```
121   -
122   -3. **active**
123   -
124   - ```javascript
125   - PCSDK.stat.active(): void
126   - ```
127   -
128   - 定义:用户活跃/新增注册上报,切记在loadingFinish完成后调用,不然会导致新增注册数据统计异常。active有两种使用方式:
129   - 1)、loadingFinish完成后,立即调用active,适用于轻度、休闲游戏。
130   -
131   - 2)、loadingFinish,不调用active,在其他界面开始游戏 or 创建角色完成后再调用,适用于重度游戏。
132   -
133   - 参数:
134   -
135   - ```javascript
136   - 无
137   - ```
138   - 返回值:
139   -
140   - ```javascript
141   - void
142   - 无
143   - ```
144   -
145   - 示例:
146   -
147   - ```javascript
148   - // 使用场景1:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,立即调用active
149   - // 资源加载loading界面
150   - class LoadingScene(){
151   - constructor(){
152   - // 登录
153   - this.login();
154   - // 加载资源
155   - this.loadResouce();
156   - }
157   -
158   - /**
159   - * 登录
160   - */
161   - private login(){
162   - Api.login().then( data => {
163   - let { user_openid, user_reg_time } = data;
164   - // 打点:设置用户信息
165   - PCSDK.stat.setLoginInfo({
166   - openId: user_openid, // openId
167   - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
168   - });
169   - });
170   - }
171   -
172   - /**
173   - * 加载资源
174   - */
175   - private loadResouce(){
176   - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
177   - }
178   -
179   - /**
180   - * 加载资源完成回调监听
181   - */
182   - private onLoadedMain(){
183   - // 打点:加载资源完成
184   - PCSDK.stat.loadingFinish().then( () => {
185   - // 打点:用户活跃注册打点
186   - PCSDK.stat.active();
187   -
188   - // 进入home主页场景
189   - SceneManager.I.switchScene(HomeScene);
190   - });
191   - }
192   - }
193   -
194   - // 使用场景2:发起登录请求,得到用户数据信息,资源加载完成后跳转到其他界面,在其他界面"开始游戏"调用active。
195   - // 资源加载loading界面
196   - class LoadingScene(){
197   - constructor(){
198   - // 登录
199   - this.login();
200   - // 加载资源
201   - this.loadResouce();
202   - }
203   -
204   - /**
205   - * 登录
206   - */
207   - private login(){
208   - Api.login().then( data => {
209   - let { user_openid, user_reg_time } = data;
210   - // 打点:设置用户信息
211   - PCSDK.stat.setLoginInfo({
212   - openId: user_openid, // openId
213   - regTime: user_reg_time // 用户第一次注册时间,时间戳,单位秒
214   - });
215   - });
216   - }
217   -
218   - /**
219   - * 加载资源
220   - */
221   - private loadResouce(){
222   - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
223   - }
224   -
225   - /**
226   - * 加载资源完成回调监听
227   - */
228   - private onLoadedMain(){
229   - // 打点:加载资源完成
230   - PCSDK.stat.loadingFinish().then( () => {
231   - // 进入home主页场景
232   - SceneManager.I.switchScene(HomeScene);
233   - });
234   - }
235   - }
236   -
237   - // Home页面
238   - class HomeScene(){
239   - constructor(){
240   - this.btnStarGame.on('click', this.onGame, this);
241   - }
242   -
243   - /**
244   - * 按钮点击开始游戏
245   - */
246   - private onGame(){
247   - // 打点:用户活跃注册打点
248   - PCSDK.stat.active();
249   -
250   - // 进入游戏页面
251   - SceneManager.I.switchScene(GameScene);
252   - }
253   - }
254   -
255   - ```
256 0 \ No newline at end of file
stat_ads.md
... ... @@ -1,530 +0,0 @@
1   -# 交叉推广位
2   -
3   -------
4   -
5   -#### **简介**
6   -
7   -交叉推广位是在游戏中展示其他游戏,用户点击某个游戏跳转进入游戏,达到共享用户的目的。
8   -
9   -噗嗤游戏提供了3种类型的交叉推广位,后台可对交叉推广位进行配置管理,对交叉推广位各项指标分析查看。
10   -
11   -**3种广告类型:悬浮框交叉推广位、抽屉式交叉推广位、猜你喜欢交叉推广位,对应类型值为:40、70、50**
12   -
13   -1. 悬浮框交叉推广位,推荐位置:首页、结算页
14   -
15   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_013.png "🔍点击查看大图")
16   -
17   -2. 抽屉式交叉推广位,推荐位置:首页、结算页
18   -
19   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_014.png "🔍点击查看大图")
20   -
21   -3. 猜你喜欢交叉推广位,推荐位置:结算页
22   -
23   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_015.png "🔍点击查看大图")
24   -
25   -
26   -
27   -
28   -
29   -#### **后台使用**
30   -
31   -完成接入交叉推广位后,登录后台->头部tab切换到【游戏数据】->【流量分析】->【广告导出】即可查看推广位的各项数据信息(需要后台管理人员添加权限):
32   -
33   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_012.png "🔍点击查看大图")
34   -
35   -
36   -
37   -#### **接入必读**
38   -
39   -- 由于微信对每个游戏可跳转其他游戏有10个限制,可跳转的其它游戏需要在小游戏根目录下的全局配置文件game.json中进行添加配置:navigateToMiniProgramAppIdList,该参数定义请详读[小程序全局配置](https://developers.weixin.qq.com/minigame/dev/reference/configuration/app.html)。
40   -
41   -- **接入3种交叉推广位后,为了防止微信审核被拒(被拒理由:微信认定游戏跳转到其他游戏太多,判断游戏是一个游戏盒子,拒绝审核通过),为了防范被拒,在[数据模块](data.md)提供了三个数据获取api:PCSDK.data.IsCross、PCSDK.data.IsDrawer、PCSDK.data.IsGuessLike,控制3种推广位广告的显示隐藏,开发者在游戏中对三种广告控制显示隐藏状态。[详请请阅读数据api](data.md#ad_cross)。**
42   -
43   -- 噗嗤游戏为了方便开发者接入调试交叉推广位,后台已经配置测试使用的3种类型推广位,提供以下10个推广位appid,开发者复制下面的navigateToMiniProgramAppIdList json数据,配置到game.json的navigateToMiniProgramAppIdList参数:
44   -
45   - 水果爆破 :"wx26822126b4d99eda",
46   -
47   - 球球涂涂涂:"wxac0750884d5bed0c",
48   -
49   - 狂野漂移3D:"wx019a09df638e6683",
50   -
51   - 星星爱消消:"wx9ff47d13a88e5511",
52   -
53   - 土耳其方块消消乐:"wx89efb2282d65a2d0",
54   -
55   - 成语小才子:"wxd4d478c7d331ce80",
56   -
57   - 球球蹦蹦蹦:"wxabee9afe62d0b114",
58   -
59   - 俄罗斯方块连连消:"wx4cd087f19f4cb7c3",
60   -
61   - 球球爆爆爆:"wxae33d68413f40641",
62   -
63   - 疯狂水果一刀切:"wxdf26a04c53d6f1e9"
64   -
65   - ```javascript
66   - "navigateToMiniProgramAppIdList": [
67   - "wx26822126b4d99eda",
68   - "wxac0750884d5bed0c",
69   - "wx019a09df638e6683",
70   - "wx9ff47d13a88e5511",
71   - "wx89efb2282d65a2d0",
72   - "wxd4d478c7d331ce80",
73   - "wxabee9afe62d0b114",
74   - "wx4cd087f19f4cb7c3",
75   - "wxae33d68413f40641",
76   - "wxdf26a04c53d6f1e9"
77   - ]
78   - ```
79   -
80   - ![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_010.png "🔍点击查看大图")
81   -
82   -
83   -
84   -
85   -#### **接入API:**
86   -
87   -| **名称** | **功能说明** |
88   -| --------------------------- | ------------------------------------------------------------ |
89   -| PCSDK.stat.bannerList | 根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型:40(悬浮框交叉推广位)、70(抽屉式交叉推广位)、50(猜你喜欢交叉推广位) |
90   -| PCSDK.stat.bannerNavigateTo | 交叉推广位点击跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram) |
91   -| PCSDK.stat.addExposure | 交叉推广位一条或者多条广告展示,添加曝光数据,SDK内部会在onHide时候上报数据到后台 |
92   -
93   -
94   -
95   -1. ##### **bannerList**
96   -
97   - ```javascript
98   - PCSDK.stat.loadingFinish(banner_type): Promise<any>
99   - ```
100   -
101   - 定义:根据类型获取对应类型交叉推广位列表,目前SDK支持3种类型
102   -
103   - 参数:
104   -
105   - ```
106   - banner_type: number 必填 目前支持三种广告类型:40、50、70
107   - ```
108   -
109   - 返回值:Promise<any>
110   -
111   - 返回的是Promise类型,Promise resolve成功回调数据结构为:
112   -
113   - ```json
114   - {
115   - "banner_list": [
116   - {
117   - "banner_id": "3568",
118   - "banner_name": "土耳其方块",
119   - "banner_type": "40",
120   - "banner_location": "100",
121   - "banner_ad_id": "50",
122   - "banner_launch_appid": "",
123   - "banner_launch_path": "",
124   - "banner_appid": "wx89efb2282d65a2d0",
125   - "banner_path": "?channel_id=20361",
126   - "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CB97RK.png",
127   - "banner_user_num": "0",
128   - "banner_exposure_num": "0",
129   - "banner_sort": "1",
130   - "banner_game_id": "1000053",
131   - "banner_qqgame": "0",
132   - "banner_qqgame_id": "0",
133   - "banner_game_type": 0,
134   - "banner_bone": "0",
135   - "banner_system": "0",
136   - "banner_online": "1",
137   - "banner_reddot": "0",
138   - "banner_gender": "0",
139   - "banner_resident": "0",
140   - "banner_qrcode": "0",
141   - "banner_qrcode_img": "",
142   - "banner_bone_info": false,
143   - "banner_img_info": {
144   - "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CB97RK.png"
145   - }
146   - },
147   - {
148   - "banner_id": "3571",
149   - "banner_name": "水果一刀切",
150   - "banner_type": "40",
151   - "banner_location": "100",
152   - "banner_ad_id": "99",
153   - "banner_launch_appid": "",
154   - "banner_launch_path": "",
155   - "banner_appid": "wxdf26a04c53d6f1e9",
156   - "banner_path": "?channel_id=20361",
157   - "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CBACTt.png",
158   - "banner_user_num": "0",
159   - "banner_exposure_num": "0",
160   - "banner_sort": "1",
161   - "banner_game_id": "1000053",
162   - "banner_qqgame": "0",
163   - "banner_qqgame_id": "0",
164   - "banner_game_type": 0,
165   - "banner_bone": "0",
166   - "banner_system": "0",
167   - "banner_online": "1",
168   - "banner_reddot": "0",
169   - "banner_gender": "0",
170   - "banner_resident": "0",
171   - "banner_qrcode": "0",
172   - "banner_qrcode_img": "",
173   - "banner_bone_info": false,
174   - "banner_img_info": {
175   - "banner_icon": "https://dep.miso-lab.com/data_analysis/games/res/5D42CBACTt.png"
176   - }
177   - }
178   - ]
179   - }
180   -
181   - ```
182   -
183   - > **返回的数据banner_list列表解析为 Array< BannerData >,BannerData是banner_list每一项数据实体,下面的bannerNavigateTo与addExposure接口api参数banner_data属于此BannerData结构**。
184   -
185   - 示例:
186   -
187   - ```javascript
188   - /**
189   - * 演示交叉推广位使用示例
190   - */
191   - export default class TestBannerSample {
192   - constructor() {
193   - // 示例:加载悬浮框交叉推广位
194   - this.loadBannerList(BannerType.TYPE_CROSS)
195   - .then((dataList: Array<BannerData>) => {
196   - // 渲染广告位数据
197   - this.renderAdCrossList(dataList);
198   - }).catch(err => {
199   - // bannerList不存在获取请求拉取失败
200   - });
201   - }
202   -
203   - /**
204   - * 渲染广告位列表
205   - * @param dataList 广告位列表
206   - */
207   - private renderAdCrossList(dataList: Array<BannerData>) {
208   - // ...
209   - }
210   -
211   - /**
212   - * 根据类型获取交叉推广位列表
213   - * @param banner_type 广告位类型
214   - */
215   - private loadBannerList(banner_type: BannerType): Promise<any> {
216   - return new Promise((resolve, reject) => {
217   - PCSDK.stat.bannerList(banner_type)
218   - .then(data => {
219   - let bannerList: Array<BannerData> = data.banner_list || [];
220   - if (bannerList.length) {
221   - // 处理bannerList数据列表
222   - resolve(bannerList);
223   - } else {
224   - // 处理数据为空情况
225   - reject(null);
226   - }
227   - }).catch(err => {
228   - // 请求接口报错情况
229   - reject(err);
230   - });
231   - });
232   - }
233   - }
234   -
235   - // 广告位类型的枚举
236   - enum BannerType {
237   - TYPE_CROSS = 40, // 悬浮框交叉推广位
238   - TYPE_LIKE = 50, // 猜你喜欢交叉推广位
239   - TYPE_LIST = 70, // 抽屉式交叉推广位
240   - }
241   -
242   - /*
243   - * banner数据实体结构
244   - */
245   - class BannerData {
246   - public banner_id: string;
247   - public banner_appid: string;
248   - public banner_diamond: number;
249   - public banner_type: string;
250   - public banner_icon: string;
251   - public banner_name: string;
252   - public banner_resident: string; // 是否常驻
253   - }
254   - ```
255   -
256   -2. ##### **bannerNavigateTo**
257   -
258   - ```javascript
259   - PCSDK.stat.bannerNavigateTo( location:number, banner_data: any, opts?: { extraData?: string; envVersion?: string }): Promise<any>
260   - ```
261   -
262   - 定义:交叉推广位点击游戏跳转到对应appid的游戏,该接口封装了小游戏的跳转功能(navigateToMiniProgram), 第三个参数配置可参考[wx.navigateToMiniProgram extraData、envVersion配置信息](https://developers.weixin.qq.com/minigame/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html)
263   -
264   - 参数:
265   -
266   - ```javascript
267   - location: number 必传,统一传递为:100
268   -
269   - banner_data:any 必传,点击跳转项对应数据,该数据的结构为BannerData,为bannerList获取的Array<BannerData>的单元实体项
270   -
271   - opts: object 选传,调试阶段可参照[wx.navigateToMiniProgram(Object object) extraData配置信息]进行裴旭
272   - {
273   - extraData: string 选传, 需要传递给目标小程序的数据,目标小程序可在 App.onLaunch,App.onShow 中获取到这份数据
274   - envVersion: string 选传,要打开的小程序版本,合法值:develop、trial、release
275   - }
276   - ```
277   -
278   - 示例:获取猜你喜欢交叉推广位,以列表的形式显示在界面上,点击任意一项游戏跳转其他游戏
279   -
280   - ```javascript
281   - // 发起登录请求,得到登录数据信息,调用setLogind设置SDK用户信息
282   - /**
283   - * 演示交叉推广位使用示例
284   - */
285   - export default class TestBannerSample extends ui.shop.ShopPopwinUI {
286   - private list: Laya.List;
287   -
288   - constructor() {
289   - super();
290   -
291   - // 创建List ui
292   - this.list = new Laya.List();
293   - this.list.itemRender = AdItem;
294   - this.list.vScrollBarSkin = "";
295   - this.list.scrollBar.elasticBackTime = 500;
296   - this.list.scrollBar.elasticDistance = 350;
297   - this.list.x = 0;
298   - this.list.y = 0;
299   - this.list.spaceY = 10;
300   - this.list.height = 1000;
301   - this.list.renderHandler = new Laya.Handler(this, this.renderAdItem);
302   - this.boxList.addChild(this.list);
303   -
304   - // 示例:加载猜你喜欢交叉推广位数据列表
305   - this.loadBannerList(BannerType.TYPE_LIKE)
306   - .then((dataList: Array<BannerData>) => {
307   - this.renderAdLikeList(dataList);
308   - }).catch(err => {
309   - // bannerList不存在获取请求拉取失败
310   - });
311   - }
312   -
313   - /**
314   - * 渲染单个广告位ui
315   - * @param cell
316   - */
317   - private renderAdItem(cell: AdItem) {
318   - cell.init();
319   - }
320   -
321   - /**
322   - * 渲染广告位列表
323   - * @param dataList 广告位列表
324   - */
325   - private renderAdLikeList(dataList: Array<BannerData>) {
326   - this.list.array = dataList;
327   - }
328   -
329   - /**
330   - * 根据类型获取交叉推广位列表
331   - * @param banner_type 广告位类型
332   - */
333   - private loadBannerList(banner_type: BannerType): Promise<any> {
334   - return new Promise((resolve, reject) => {
335   - PCSDK.stat.bannerList(banner_type)
336   - .then(data => {
337   - let bannerList: Array<BannerData> = data.banner_list || [];
338   - if (bannerList.length) {
339   - // 处理bannerList数据列表
340   - resolve(bannerList);
341   - } else {
342   - // 处理数据为空情况
343   - reject(null);
344   - }
345   - }).catch(err => {
346   - // 请求接口报错情况
347   - reject(err);
348   - });
349   - });
350   - }
351   - }
352   -
353   - class AdItem extends ui.ads.GameIconUI {
354   - constructor() {
355   - super();
356   - this.on(Laya.Event.CLICK, this, this.onJumpGame);
357   - }
358   -
359   - init() {
360   - let { banner_icon, banner_name, banner_reddot } = this.dataSource;
361   - this.iconTex.skin = banner_icon;
362   - this.nametxt.text = banner_name;
363   - this.hot.visible = banner_reddot + '' === '1';
364   - }
365   -
366   - private onJumpGame(ev: Laya.Event) {
367   - PCSDK.stat.bannerNavigateTo(100, { ...this.dataSource }).catch(err => {
368   - // 跳转游戏微信弹出二次确认框,点击取消执行此处
369   - });
370   - }
371   - }
372   -
373   - // 广告位类型的枚举
374   - enum BannerType {
375   - TYPE_CROSS = 40, // 悬浮框交叉推广位
376   - TYPE_LIKE = 50, // 猜你喜欢交叉推广位
377   - TYPE_LIST = 70, // 抽屉式交叉推广位
378   - }
379   -
380   - /*
381   - * banner数据实体结构
382   - */
383   - class BannerData {
384   - public banner_id: string;
385   - public banner_appid: string;
386   - public banner_diamond: number;
387   - public banner_type: string;
388   - public banner_icon: string;
389   - public banner_name: string;
390   - public banner_resident: string; // 是否常驻
391   - }
392   - ```
393   -
394   -
395   -3. ##### **addExposure**
396   -
397   - ```javascript
398   - PCSDK.stat.addExposure( location: number, banner_data: Array< any > | any ): void
399   - ```
400   -
401   - 定义:对一个或者多个展示的推广位添加曝光,SDK在onHide时候上报曝光数据到后台,后台进行统计查阅
402   -
403   - 参数:
404   -
405   - ```javascript
406   - location: number 必传,统一传递为:100
407   -
408   - banner_data:any 必传,添加展推广位曝光数据,可添加一个或者多个曝光数据,banner_data参数数据结构为上面bannerList api返回的列表数据的项BannerData实体结构:Array<BannerData> | BannerData
409   -
410   - ```
411   -
412   - > 提示:
413   - >
414   - > 展示猜你喜欢/抽屉式交叉推广位:获取到9个推广位数据,展示了其中5个,调用曝光接口传入推广位数据为展示的5个,剩余的4个需在其展示的时候再调用曝光api接口传入。
415   - >
416   - > 展示悬浮框交叉推广位:展示一个,将此推广位传入曝光接口,点击展示下一个,则把这个最新的数据传入曝光api
417   -
418   - 示例:根据悬浮框交叉推广位类型调用PCSDK.stat.bannnerList接口获取悬浮框交叉推广位列表,显示第一个,每隔4秒切换到下一个,点击一个切换下一个展示。此示例没有使用定时器方式,采用的是监听动画帧实现。
419   - ```javascript
420   - /**
421   - * 演示交叉推广位使用示例
422   - */
423   -export default class TestBannerSample extends ui.ads.ADbtnUI {
424   - private data;
425   - private count: number;
426   - private adList: Array<BannerData>;
427   -
428   - constructor() {
429   - super();
430   - this.count = 0;
431   - this.adList = [];
432   - this.on(Laya.Event.CLICK, this, this.onJumpGame);
433   - }
434   -
435   - // 初始化显示悬浮框交叉推广位
436   - init(isFirst: boolean) {
437   - isFirst && (this.count = 0);
438   - this.anim_entice.play(0, true);
439   - this.anim_entice.addLabel('refresh', 38);
440   - // 交叉悬浮框动画执行到第38帧,自动更新下一个,开发者可根据实际使用定时器实现切换下一个
441   - this.anim_entice.on(Laya.Event.LABEL, this, this.handleAutoRrefresh);
442   - // 第一次
443   - this.refresh();
444   - }
445   -
446   - // 清理悬浮框交叉推广位
447   - clear() {
448   - this.anim_entice.gotoAndStop(0);
449   - this.anim_entice.removeLabel('refresh');
450   - this.anim_entice.off(Laya.Event.LABEL, this, this.handleAutoRrefresh);
451   - }
452   -
453   - private refresh() {
454   - let list = this.adList;
455   - if (!list || !list.length) {
456   - this.loadBannerList(BannerType.TYPE_CROSS).then(() => this.refresh());
457   - return;
458   - }
459   - let data = list.pop();
460   - this.renderAdui(data);
461   - this.data = data;
462   - // 添加曝光数据
463   - PCSDK.stat.addExposure(100, data);
464   - // 也可以采用传递多个方式
465   - // PCSDK.stat.addExposure(100, [{...data}]);
466   - }
467   -
468   - private renderAdui(data) {
469   - let { banner_bone_info, banner_img_info } = data;
470   - if (banner_bone_info) {
471   - this.imgIcon.visible = false;
472   - } else {
473   - this.imgIcon.visible = true;
474   - this.imgIcon.skin = banner_img_info.banner_icon;
475   - }
476   - this.imgHot.visible = data.banner_reddot + '' === '1';
477   - }
478   -
479   - private onJumpGame(ev: Laya.Event) {
480   - this.anim_entice.gotoAndStop(39);
481   - this.anim_entice.play(39, true);
482   - // 切换下一个
483   - this.refresh();
484   - PCSDK.stat.bannerNavigateTo(100, { ...this.data }).catch(err => {
485   - // 跳转游戏微信弹出二次确认框,点击取消执行此处
486   - });
487   - }
488   -
489   - /**
490   - * 处理自动切换下一个
491   - * @param name
492   - */
493   - private handleAutoRrefresh(name) {
494   - if (name === 'refresh' && this.count !== 0) {
495   - this.refresh();
496   - }
497   - this.count++;
498   - }
499   -
500   - /**
501   - * 根据类型获取交叉推广位列表
502   - * @param banner_type 广告位类型
503   - */
504   - private loadBannerList(banner_type: BannerType): Promise<any> {
505   - return new Promise((resolve, reject) => {
506   - PCSDK.stat.bannerList(banner_type)
507   - .then(data => {
508   - let bannerList: Array<BannerData> = data.banner_list || [];
509   - if (bannerList.length) {
510   - // 处理bannerList数据列表
511   - resolve(bannerList);
512   - } else {
513   - // 处理数据为空情况
514   - reject(null);
515   - }
516   - }).catch(err => {
517   - // 请求接口报错情况
518   - reject(err);
519   - });
520   - });
521   - }
522   - }
523   -
524   - // 广告位类型的枚举
525   - enum BannerType {
526   - TYPE_CROSS = 40, // 悬浮框交叉推广位
527   - TYPE_LIKE = 50, // 猜你喜欢交叉推广位
528   - TYPE_LIST = 70, // 抽屉式交叉推广位
529   - }
530   - ```
531 0 \ No newline at end of file
stat_event.md
... ... @@ -1,153 +0,0 @@
1   -# 自定义事件打点
2   -
3   -------
4   -
5   -#### **简介**
6   -
7   -自定义事件是噗嗤游戏为开发者提供的自助分析功能:事件触发去重人数、次数等信息。游戏的任意位置需要统计触达人数、次数等都可以使用事件来实现,后台提供分析数据可查看,并不局限于用户的行为事件。
8   -
9   -#### **后台使用**
10   -
11   -接入自定义事件打点后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】可查看自定义事件次数、去重人数等详细信息(此功能需要管理员添加权限):
12   -
13   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_018.png "🔍点击查看大图")
14   -
15   -
16   -
17   -#### **接入必读**
18   -
19   -接入自定义事件打点前,请[前往后台](https://data.d3games.com/index.html#/login)进行添加自定义事件的key:登录后台->头部tab切换到【游戏数据】->【产品分析】->【事件分析】->点击【新增】添加自定义事件(事件key可语义化的自定义,推荐_连接)。
20   -
21   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_016.png "🔍点击查看大图")
22   -
23   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_017.png "🔍点击查看大图")
24   -
25   -> 提示:游戏新增自定义事件如果很多,一个个复制可能比较繁琐,进入噗嗤后台【事件列表】后,chrome浏览器打开【开发者工具】,在console栏下方输入下面的命令后,可自动生成自定义事件key的枚举(如果事件很多出现翻页,则每一页都执行后,手动合并为一个枚举),复制到项目中使用,枚举key生成规则为事件key转换为大驼峰式,枚举value为事件key:
26   -
27   -```javascript
28   -// 第1个参数表示生成枚举的名字:EventKeys
29   -// 第2个参数表示事件key所在列索引(第2列):1
30   -// 第3个参数表示事件key注释所在列索引(第3列):2
31   -// 最后一个参数选填,any传递false表示枚举字符串不带any转换
32   -PCPlugins.transform('EventKeys', 1 , 2 , { any: false});
33   -```
34   -
35   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_019.png "🔍点击查看大图")
36   -
37   -
38   -
39   -示例:使用PCPlugins.transform('EventKeys', 1 , 2 , { any: false}); 生成的自定义事件key枚举
40   -
41   -```javascript
42   -enum EventKeys {
43   - // 关卡7进入,
44   - Level7Enter = 'level7_enter',
45   - // 关卡6进入,
46   - Level6Enter = 'level6_enter',
47   - // 关卡5进入,
48   - Level5Enter = 'level5_enter',
49   - // 关卡4进入,
50   - Level4Enter = 'level4_enter',
51   - // 关卡3进入,
52   - Level3Enter = 'level3_enter',
53   - // 关卡2进入,
54   - Level2Enter = 'level2_enter',
55   - // 关卡1进入,
56   - Level1Enter = 'level1_enter',
57   - // 关卡失败双倍奖励,
58   - MapFailDouble = 'map_fail_double',
59   - // 引导10-主界面再次进入游戏,
60   - Guide109 = 'guide_109',
61   - // 引导9-合成确认,
62   - Guide108 = 'guide_108',
63   - // 引导8-合成成功后,
64   - Guide107 = 'guide_107',
65   - // 引导7-合成,
66   - Guide106 = 'guide_106',
67   - // 引导6-第二次购买,
68   - Guide105 = 'guide_105',
69   - // 引导5-第一次购买,
70   - Guide104 = 'guide_104',
71   - // 引导4-结算引导,
72   - Guide103 = 'guide_103',
73   - // 引导3-开始射击,
74   - Guide102 = 'guide_102',
75   - // 引导2-开始游戏,
76   - Guide101 = 'guide_101',
77   - // 引导1-欢迎,
78   - Guide100 = 'guide_100',
79   - // 金币加速,关闭,
80   - SpeedUpClose = 'speed_up_close',
81   - // 金币加速,免费领取,
82   - SpeedUpFree = 'speed_up_free'
83   -}
84   -```
85   -
86   -
87   -
88   -
89   -
90   -#### **接入API**:
91   -
92   -| **名称** | **功能说明** |
93   -| ---------------- | ------------------------------------------------------------ |
94   -| PCSDK.stat.event | 自定义事件打点,使用前请[前往后台](https://data.d3games.com/index.html#/login)进行添加自定义事件key |
95   -
96   -
97   -
98   -1. **event**
99   -
100   - ```javascript
101   - PCSDK.stat.event(event_key: string , event_source: string , opts?: { ext_val?: string | number} ): Promise<any>
102   - ```
103   -
104   - 定义:自定义事件打点,可在游戏任何位置定义事件打点
105   -
106   - 参数:
107   -
108   - ```
109   - event_key: string 必传,后台配置的事件key
110   -
111   - event_source: string 必传,触发该事件所在页面位置,例如:结算页面、排行榜界面、签到页面。。。
112   -
113   - opts?: object 选传,自定义扩展参数,一些特定的事件想传递更多信息,此参数使用请咨询相关对接人员目前只支持对象一个key(evt_val),多个扩展参数使用'|'连接
114   - {
115   - ext_val: '100|1000'
116   - }
117   - ```
118   - 示例:
119   -
120   - ```javascript
121   - // 签到功能
122   - private onSign() {
123   - // 事件上报:签到页面打开
124   - PCSDK.stat.event(EventKeys.FunctionSign, '主界面');
125   - PopwinMananger.I.openWin(SignPopwin);
126   - }
127   -
128   - // 开始加载资源
129   - private loadRes() {
130   - // 事件上报:开始加载资源
131   - PCSDK.stat.event(EventKeys.LoadingExhibition, '加载界面');
132   - LoaderManager.I.setCallback(this.onLoadedMain, this.onProgressMain, null, this).loadMain();
133   - }
134   -
135   - // 升级领奖
136   - private onReward(e: Laya.Event) {
137   - // 事件上报:发起升级领奖
138   - PCSDK.stat.event(EventKeys.LvUpRewards, '升级界面');
139   - SDKTools.shareDispatch(ShareKey.LevelUpDiamond, {
140   - success: this.handleDoubleReward,
141   - context: this
142   - });
143   - }
144   -
145   - export enum EventKeys {
146   - // 升级奖励,
147   - LvUpRewards = 'lv_up_rewards',
148   - // 点击主界面-签到,
149   - FunctionSign = 'function_sign',
150   - // 加载,
151   - LoadingExhibition = 'loading_exhibition'
152   - }
153   - ```
stat_level.md
... ... @@ -1,297 +0,0 @@
1   -# 关卡分析打点
2   -
3   -------
4   -
5   -#### **简介**
6   -
7   -关卡分析,为开发者提供小游戏详细的关卡数据,分析各关卡玩家的通关状况,帮助开发者从数据角度衡量游戏设计的合理性,调节难易度,观察各关卡道具使用情况和奖励获取状况,对比分析各个指标,通过量化玩家数据,提高游戏体验。
8   -
9   -#### **后台使用**
10   -
11   -接入关卡分析接口后,登录后台->头部tab切换到【游戏数据】->【产品分析】->【关卡分析】可查看关卡进入用户数据、失败次数、失败率、平均完成时间等):
12   -
13   -![sdk文件目录结构](https://dep.miso-lab.com/sdkword/sdk_020.png "🔍点击查看大图")
14   -
15   -
16   -
17   -#### **接入API**:
18   -
19   -| **名称** | **功能说明** |
20   -| ---------------- | ------------------------------------------------------------ |
21   -| PCSDK.stat.logLevelRelive | 游戏关卡复活上报 |
22   -| PCSDK.stat.logLevelHide | 游戏关卡onHide上报,在游戏界面注册wx.onHide事件,判断不属于复活、失败、成功状态下上报此数据 |
23   -| PCSDK.stat.logLevelFail | 游戏关卡失败上报 |
24   -| PCSDK.stat.logLevelWin | 游戏关卡成功上报 |
25   -| PCSDK.stat.logMerge | 游戏二合一合成最高等级上报 |
26   -
27   -
28   -
29   -1. #### **logLevelRelive**
30   -
31   - ```javascript
32   - PCSDK.stat.logLevelRelive(levelId: string | number , params?: { attr?: number, ext?: any } ): void
33   - ```
34   -
35   - 定义:关卡复活成功数据上报
36   -
37   - 参数:
38   -
39   - ```
40   - levelId: string | number 必传,游戏关卡id
41   -
42   - params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext
43   - {
44   - attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
45   - ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
46   - }
47   - ```
48   -
49   - [点此查看完整示例](stat_level.md#sample)如何添加关卡复活成功打点代码
50   -
51   -2. #### **logLevelHide**
52   -
53   - ```javascript
54   - PCSDK.stat.logLevelHide(levelId: string | number , params?: { attr?: number, ext?: any } ): void
55   - ```
56   - 定义:监听游戏战斗界面onHide时上报关卡的数据。什么是界面onHide?[请详读微信小游戏wx.onHide](https://developers.weixin.qq.com/minigame/dev/api/base/app/life-cycle/wx.onHide.html)
57   - 注意事项:
58   -
59   - > <font color="red">1)游戏战斗界面监听平台的onHide事件,使用此api上报关卡onHide打点。</font>
60   - >
61   - >
62   -
63   - > <font color="red">2)游戏战斗界面退出后,要移除onHide事件监听,避免在其他界面下,onHide时候执行此次上报。</font>
64   - >
65   - >
66   -
67   - > <font color="red">3)一定要屏蔽游戏复活中、游戏失败、游戏通过成功状态,这三种状态下避免上报此打点,详看下面示例。</font>
68   -
69   - 参数:
70   -
71   - ```
72   - levelId: string | number 必传,游戏关卡id
73   -
74   - params: object 选传,关卡需要的其他参数,目前只支持传递2个属性: attr、ext
75   - {
76   - attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
77   - ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
78   - }
79   - ```
80   - [点此查看完整示例](stat_level.md#sample)如何添加关卡onHide打点代码
81   -
82   -3. #### **logLevelFail**
83   -
84   - ```javascript
85   - PCSDK.stat.logLevelFail(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void
86   - ```
87   -
88   - 定义:关卡失败数据上报
89   -
90   - 参数:
91   -
92   - ```
93   - levelId: string | number 必传,游戏关卡id
94   -
95   - params: object 必传,关卡需要的其他参数
96   - {
97   - ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒
98   - first: number 必传 是否第一次体验关卡,1是,0否
99   - attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
100   - ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
101   - }
102   - ```
103   - [点此查看完整示例](stat_level.md#sample)如何添加关卡失败打点代码
104   -
105   -4. #### **logLevelWin**
106   -
107   - ```javascript
108   - PCSDK.stat.logLevelWin(levelId: string | number , params: { ctime: number, first: number, attr?: number, ext?: any } ): void
109   - ```
110   -
111   - 定义:关卡成功通关数据上报
112   -
113   - 参数:
114   -
115   - ```
116   - levelId: string | number 必传,游戏关卡id
117   -
118   - params: object 必传,关卡需要的其他参数
119   - {
120   - ctime: number 必传 关卡耗时 = 当前时间-关卡进入时间,单位秒
121   - first: number 必传 是否第一次体验关卡,1是,0否
122   - attr: number 选传 战斗属性(例如:关卡战斗中所使用的枪支等级)
123   - ext: object 选传 扩展参数:{ key1:val1, key2:val2 }的格式
124   - }
125   - ```
126   - <div id="sample"></div> 完整示例,以上四个接口使用场景:
127   -> SDK中监听了onHide事件,当游戏onHide时,SDK会发送事件名为'app.hide'的自定义事件,开发者可在代码中使用PCSDK.event.bindEvent监听该事件,使用PCSDK.event.removeEvent移除对应监听事件,[详细文档event模块文档请阅读event事件模块](evennt.md)。
128   -
129   - ```javascript
130   - /**
131   - * 游戏界面
132   - **/
133   - exports class GameScene extends BaseView{
134   - // 关卡id
135   - private missionId: number;
136   - // 当前选中使用的枪支等级
137   - private currSelectGun: number;
138   - // 游戏状态机
139   - private gameState: GameState;
140   - // 关卡开始时间
141   - private enterTime: number;
142   -
143   - constructor(){
144   - this.gameState = GameState.Idle;
145   - }
146   -
147   - // 游戏界面打开
148   - open(){
149   - super.open();
150   - this.gameState = GameState.Idle;
151   - this.enterTime = new Date().getTime();
152   - this.addEvent();
153   - }
154   -
155   - // 游戏界面关闭
156   - close(){
157   - super.close();
158   - this.removeEvent();
159   - }
160   -
161   - // 添加游戏事件监听
162   - private addEvent(){
163   - // 监听SDK中app.hide事件事件消息
164   - PCSDK.event.bindEvent( 'app.hide', this.handleHide, this);
165   - // 监听游戏中level.relive事件消息
166   - EventCenter.I.add('level.relive', this, this.handleLevelRelive);
167   - }
168   -
169   - // 移除游戏事件监听
170   - private removeEvent(){
171   - PCSDK.event.removeEvent( 'app.hide', this.handleHide, this);
172   - EventCenter.I.remove('level.relive', this, this.handleLevelRelive);
173   - }
174   -
175   - // 游戏复活中
176   - private doGameRelive(){
177   - this.setState(GameState.Relive);
178   - }
179   -
180   - // 游戏通关失败
181   - private doGameFail(){
182   - this.setState(GameState.Fail);
183   - }
184   -
185   - // 游戏通关成功
186   - private doGameWin(){
187   - this.setState(GameState.Win);
188   - }
189   -
190   - // SDK发出的app.hide事件监听
191   - private handleHide() {
192   - // 战斗界面onHide上报logLevelHide(游戏通关成功、游戏通关失败、游戏复活中不进行上报logLevelHide打点)
193   - if(!(this.isState(GameState.Win) || this.isState(GameState.Fail) || this.isState(GameState.Relive)))
194   - PCSDK.stat.logLevelHide(this.missionId, {
195   - attr: this.currSelectGun
196   - });
197   - }
198   -
199   - // 监听关卡复活成功消息
200   - private handleLevelRelive(){
201   - // 关卡复活成功上报
202   - PCSDK.stat.logLevelRelive(this.missionId, {
203   - attr: this.currSelectGun
204   - });
205   - }
206   -
207   - private isState(state: GameState) {
208   - return this.state === state;
209   - }
210   -
211   - // 设置状态机
212   - private setState(state: GameState) {
213   - if (this.isState(state)) return;
214   -
215   - this.state = state;
216   - let costTime: number; // 关卡消耗时间
217   - let failNum: number; // 关卡失败次数
218   - switch (state) {
219   - case GameState.Win: // 处理成功
220   - // 关卡成功上报
221   - costTime = new Date().getTime() - this.enterTime;
222   - failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId);
223   - PCSDK.stat.logLevelWin(this.missionId, {
224   - ctime: costTime,
225   - first: failNum ? 0 : 1,
226   - attr: this.currSelectGun,
227   - ext: {
228   - currHp: 100000
229   - }
230   - });
231   - break;
232   -
233   - case GameState.Fail: // 处理失败
234   - // 关卡失败上报
235   - costTime = new Date().getTime() - this.enterTime;
236   - failNum = DataManager.I.LocalModel.getMissionFailNum(this.missionId);
237   - PCSDK.stat.logLevelFail(this.missionId, {
238   - ctime: costTime,
239   - first: failNum ? 0 : 1,
240   - attr: this.currSelectGun
241   - });
242   - break;
243   -
244   - case GameState.Relive:// 处理复活中
245   - // 弹出复活操作界面
246   - PopWinManager.I.openPopwin(RelivePopwinn);
247   - break;
248   - }
249   - }
250   - }
251   -
252   - /**
253   - * 复活界面
254   - **/
255   - exports class RelivePopwinn extends BaseView{
256   - // 复活界面关闭
257   - close(){
258   - super.close();
259   - // 关闭模拟:复活成功,发送复活成功消息
260   - EventCenter.I.emit('level.relive');
261   - }
262   - }
263   -
264   - // 游戏状态状态机
265   - enum GameState{
266   - Idle, // 初始状态
267   - Fail, // 失败状态
268   - Win, // 成功通关状态
269   - Relive // 正在复活状态
270   - }
271   - ```
272   -
273   -5. #### **logMerge**
274   -
275   - ```javascript
276   - PCSDK.stat.logMerge(mergeLv: number): void
277   - ```
278   -
279   - 定义:游戏二合一合成最高等级上报
280   -
281   - 参数:
282   -
283   - ```
284   - mergeLv: number 必传,二合一合成最高等级
285   - ```
286   -
287   - 示例:二合一部分,合成最高等级时候上报
288   -
289   - ```javascript
290   - // 合成最新等级合成
291   - private handleMergeLastestLv(lastestLv: number){
292   - // 合成最新等级上报
293   - PCSDK.stat.logMerge( lastestLv );
294   - }
295   - ```
296   -
297   -
298 0 \ No newline at end of file
stat_pay.md
... ... @@ -1,112 +0,0 @@
1   -# 支付结果打点
2   -
3   -------
4   -
5   -#### **简介**
6   -
7   -支付上报,是开发者使用米大师或者第三方其他支付(比如H5支付),支付回调后把支付结果(失败支付、成功支付、取消支付)上报到后台。
8   -
9   -#### **注意事项**
10   -
11   -{% em %} 使用api,需在[config.js中配置MidasPay](install.md#configJs)信息。 {% endem %}
12   -
13   -**MidasPay( object )配置:**米大师虚拟支付配置,请注意下面规则
14   -
15   - OfferId:在米大师申请的应用id,没有接入米大师,默认为"0"
16   -
17   - ZoneId:分区ID,默认:"1"
18   -
19   - Mode:支付的类型,不同的支付类型有各自额外要传的附加参数,默认:"game"
20   -
21   - CurrencyType:币种,默认:"CNY"
22   -
23   - Platform:申请接入时的平台,platform与OfferId(米大师申请的应用id)有关。
24   -
25   - 1)接入了米大师,填写"android"(ios暂时没有开放)
26   -
27   - 2)未接入米大师,使用其他支付,如果只支持android,则填写"android";
28   -
29   - 3)未接入米大师,使用其他支付,如果只支持ios,则填写"ios";
30   -
31   - 4)未接入米大师,使用其他支付,如果支持ios和android,则填写为"",sdk会根据手机识别android还是ios
32   -
33   -
34   -
35   -#### **接入API:**
36   -
37   -| **名称** | **功能说明** |
38   -| ------------------------ | ------------------------------------------------------------ |
39   -| PCSDK.stat.logPay | 开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付) |
40   -
41   -
42   -1. **logPay**
43   -
44   - ```javascript
45   - PCSDK.stat.logPay( params: object ): void
46   - ```
47   -
48   - 定义:开发者游戏充值完成后,上报支付结果打点,支付结果类型:0(支付失败),1(支付成功),-1(取消支付)。该api需在[config.js中配置MidasPay](install.md#configJs)信息。
49   -
50   - 参数:
51   -
52   - ```
53   - params object 必传 打点参数
54   - {
55   - type: number 必传 支付类型:0(支付失败),1(支付成功),-1(取消支付);
56   - source: string 必传 游戏服务商生成的订单号,没有则为空字符串
57   - amount: number 必传 实际支付金额,单位分
58   - buy_id: string | number; 必传 商品ID
59   - buy_name: string; 必传 商品名称
60   - item_info: string 必传 获得的道具内容:道具id及数量,逗号分隔,多项使用分号分隔 => 1,1;2,10;3,100
61   - }
62   - ```
63   - 返回值:
64   -
65   - ```
66   - void
67   - 无
68   - ```
69   -
70   - 示例:客户端游戏支付完成后上报支付打点,下例只是演示logPay用法
71   -
72   - ```javascript
73   - private reqPay() {
74   - // 模拟的支付,开发者需更加实际接入支付
75   - Api.I.pay().then( ret => {
76   - switch(ret.code){
77   - case 1: // 支付成功回调处理
78   - PCSDK.stat.logPay({
79   - type: 1, // 成功支付
80   - source: "10000400", // 订单号,没有则为空字符串
81   - amount: 10 * 100, // 10元
82   - buy_id: 58, // 支付的商品id
83   - buy_name: "钻石*152,金币*188888888",
84   - item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90
85   - });
86   - break;
87   -
88   - case 0: // 支付失败回调处理
89   - PCSDK.stat.logPay({
90   - type: 0, // 失败支付
91   - source: "10000400", // 订单号,没有则为空字符串
92   - amount: 10 * 100, // 10元
93   - buy_id: 58, // 支付的商品id
94   - buy_name: "钻石*152,金币*188888888",
95   - item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90
96   - });
97   - break;
98   -
99   - case -1: // 支付取消回调处理
100   - PCSDK.stat.logPay({
101   - type: -1, // 取消支付
102   - source: "10000400", // 订单号,没有则为空字符串
103   - amount: 10 * 100, // 10元
104   - buy_id: 58, // 支付的商品id
105   - buy_name: "钻石*152,金币*188888888",
106   - item_info: "40,152;90,188888888" // 例如 钻石id:40 金币id:90
107   - });
108   - break;
109   - }
110   - });
111   - }
112   - ```
113 0 \ No newline at end of file
styles/website.css
... ... @@ -1,68 +0,0 @@
1   -/* CSS for website */
2   -h1 , h2{
3   - border-bottom: 1px solid #EFEAEA;
4   - padding-bottom: 3px;
5   -}
6   -.markdown-section>:first-child {
7   - margin-top: 0!important;
8   -}
9   -.page-wrapper {
10   - margin-top: -1.275em;
11   -}
12   -.book .book-body .page-wrapper .page-inner section.normal {
13   - min-height:350px;
14   - margin-bottom: 30px;
15   -}
16   -
17   -.book .book-body .page-wrapper .page-inner section.normal hr {
18   - height: 0px;
19   - padding: 0;
20   - margin: 1.7em 0;
21   - overflow: hidden;
22   - background-color: #e7e7e7;
23   - border-bottom: 1px dotted #e7e7e7;
24   -}
25   -
26   -.video-js {
27   - width:100%;
28   - height: 100%;
29   -}
30   -
31   -pre[class*="language-"] {
32   - border: none;
33   - background-color: #f7f7f7;
34   - /* font-size: 1em; */
35   - line-height: 1.2em;
36   -}
37   -
38   -.book .book-body .page-wrapper .page-inner section.normal {
39   - font-size: 16px;
40   - font-family: "ubuntu", "Tahoma", "Microsoft YaHei", arial, sans-serif;
41   -}
42   -
43   -.aceCode {
44   - font-size: 14px !important;
45   -}
46   -
47   -input[type=checkbox]{
48   - margin-left: -2em;
49   -}
50   -
51   -.page-footer span{
52   - font-size: 12px;
53   -}
54   -
55   -.page-footer .copyright {
56   - float: left;
57   -}
58   -
59   -.body, html {
60   - overflow-y: hidden;
61   -}
62   -
63   -.versions-select select {
64   - height: 2em;
65   - line-height: 2em;
66   - border-radius: 4px;
67   - background: #efefef;
68   -}