@chiyou/minigame-framework 1.3.1 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chiyou/minigame-framework",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "基于 Cocos Creator 3.x 的小游戏开发框架,支持多平台发布",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",
@@ -0,0 +1,77 @@
1
+ /**
2
+ * AnalyticsDefinition.ts
3
+ * 统计分析模块类型定义
4
+ */
5
+
6
+ import { PlatformID } from "./SystemDefinition";
7
+
8
+ // ==================== 基础类型 ====================
9
+
10
+ /** 事件参数类型 */
11
+ export type EventParams = Record<string, string | number | boolean> | string;
12
+
13
+ // ==================== 配置接口 ====================
14
+
15
+ /** 友盟 SDK 配置 */
16
+ export interface UmengConfig {
17
+ /** 各平台 appKey 映射(必填) */
18
+ appKeyMap: Map<PlatformID, string>;
19
+ /** 是否使用 openid 进行统计 @default false */
20
+ useOpenid?: boolean;
21
+ /** 是否自动获取 openid @default false */
22
+ autoGetOpenid?: boolean;
23
+ /** 是否开启调试模式 @default false */
24
+ debug?: boolean;
25
+ }
26
+
27
+ // ==================== 用户相关 ====================
28
+
29
+ /** 用户属性 */
30
+ export interface UserProperties {
31
+ userId?: string;
32
+ provider?: string;
33
+ nickName?: string;
34
+ avatarUrl?: string;
35
+ gender?: number;
36
+ country?: string;
37
+ province?: string;
38
+ city?: string;
39
+ [key: string]: any;
40
+ }
41
+
42
+ // ==================== 预定义事件 ID ====================
43
+
44
+ /** 预定义事件 ID */
45
+ export enum AnalyticsEventId {
46
+ LevelStart = 'level_start',
47
+ LevelComplete = 'level_complete',
48
+ LevelFail = 'level_fail',
49
+ AdShow = 'ad_show',
50
+ AdClick = 'ad_click',
51
+ AdComplete = 'ad_complete',
52
+ AdSkip = 'ad_skip',
53
+ AdError = 'ad_error',
54
+ Purchase = 'purchase',
55
+ Share = 'share',
56
+ Login = 'login',
57
+ GameLaunch = 'game_launch',
58
+ GameError = 'game_error',
59
+ }
60
+
61
+ /** 事件参数键名 */
62
+ export enum AnalyticsParamKey {
63
+ Level = 'level',
64
+ Score = 'score',
65
+ Duration = 'duration',
66
+ Reason = 'reason',
67
+ AdType = 'ad_type',
68
+ AdId = 'ad_id',
69
+ ItemId = 'item_id',
70
+ ItemName = 'item_name',
71
+ Price = 'price',
72
+ Currency = 'currency',
73
+ ShareType = 'share_type',
74
+ ShareContent = 'share_content',
75
+ ErrorCode = 'error_code',
76
+ ErrorMsg = 'error_msg',
77
+ }
@@ -21,5 +21,7 @@ export class FrameworkBase {
21
21
  static readonly Message = class {
22
22
  static readonly LifeCycle_onGameHide: string = "LifeCycle_onGameHide";
23
23
  static readonly LifeCycle_onGameShow: string = "LifeCycle_onGameShow";
24
+
25
+ static readonly UserMgr_PlatformOpenId_Ready: string = "UserMgr_PlatformOpenId_Ready";
24
26
  }
25
27
  }
@@ -110,7 +110,16 @@ export namespace FwkErrorCode {
110
110
  export const ComponentNotFound = 13001; // 13001 - 节点缺少必要组件
111
111
  }
112
112
 
113
- // 14-50预留给Mgr使用
113
+ // 统计分析模块错误码(14xxx)
114
+ export namespace Analytics {
115
+ export const NotInit = 14001; // 14001 - 统计模块未初始化
116
+ export const ConfigError = 14002; // 14002 - 统计配置错误
117
+ export const SDKInitFailed = 14003; // 14003 - SDK初始化失败
118
+ export const SDKCallFailed = 14004; // 14004 - SDK接口调用失败
119
+ export const PlatformNotSupported = 14005; // 14005 - 平台不支持统计
120
+ }
121
+
122
+ // 15-50预留给Mgr使用
114
123
 
115
124
  // DesktopBrowser平台错误码
116
125
  export namespace DesktopBrowser_Pt {
@@ -329,7 +338,14 @@ export const ErrorDescription: Record<number, string> = {
329
338
  // 输入模块(13xxx)
330
339
  [FwkErrorCode.Input.ComponentNotFound]: "节点缺少必要组件",
331
340
 
332
- // 14-50预留给Mgr使用
341
+ // 统计分析模块(14xxx)
342
+ [FwkErrorCode.Analytics.NotInit]: "统计模块未初始化",
343
+ [FwkErrorCode.Analytics.ConfigError]: "统计配置错误",
344
+ [FwkErrorCode.Analytics.SDKInitFailed]: "SDK初始化失败",
345
+ [FwkErrorCode.Analytics.SDKCallFailed]: "SDK接口调用失败",
346
+ [FwkErrorCode.Analytics.PlatformNotSupported]: "平台不支持统计",
347
+
348
+ // 15-50预留给Mgr使用
333
349
 
334
350
  // DesktopBrowser平台
335
351
  // 51xxx: DesktopBrowser_Pt
@@ -76,16 +76,4 @@ export enum UpdateUserDataResult {
76
76
  Result_NoNeed = -1,
77
77
  Result_Success = 0,
78
78
  Result_Fail = 1,
79
- }
80
-
81
- export enum LoginResultType {
82
- Type_SessionAvailable = 0,
83
- Type_LoginSuccess_Auth_Code = 1,
84
- Type_LoginSuccess_Auth_AccountID = 2,
85
- Type_LoginFail_ContinueGame = 3,
86
- Type_LoginFail_ExitGame = 4,
87
- }
88
-
89
- export type LoginResult = {
90
- type: LoginResultType;
91
79
  }
@@ -0,0 +1,368 @@
1
+ import { BaseMgr } from "./BaseMgr";
2
+ import { LogUtils } from "../Utils/LogUtils";
3
+ import { ServiceLocator } from "../Utils/ServiceLocator";
4
+ import { FwkErrorCode } from "../Definition/FwkErrorDefinition";
5
+ import { PlatformID } from "../Definition/SystemDefinition";
6
+ import { UmengConfig, EventParams, UserProperties, AnalyticsEventId, AnalyticsParamKey } from "../Definition/AnalyticsDefinition";
7
+ import { UmaInitConfig, UmaSDK, uma as wxUma } from "../SDK/Umeng/umtrack-wx-game";
8
+ import { EventMgr } from "./EventMgr";
9
+ import { FrameworkBase } from "../Definition/FrameworkBase";
10
+ // 后续新增平台 SDK 在此导入,例如:
11
+ // import { uma as ttUma } from "../SDK/Umeng/umtrack-tt-game";
12
+
13
+ export class AnalyticsMgr extends BaseMgr {
14
+ /** 单例实例 */
15
+ public static Instance: AnalyticsMgr = null;
16
+ /** 日志标签 */
17
+ static TAG: string = "AnalyticsMgr";
18
+
19
+ /** 是否已初始化 */
20
+ private _isInited: boolean = false;
21
+ /** 是否启用统计 */
22
+ private _isEnabled: boolean = false;
23
+ /** 友盟配置 */
24
+ private _umengConfig: UmengConfig = null;
25
+ /** 当前平台的 appKey */
26
+ private _appKey: string = "";
27
+ /** 当前平台对应的 SDK 实例 */
28
+ private _sdk: UmaSDK = null;
29
+ /** 当前页面名称(用于 trackPageStart/End 配对) */
30
+ private _currentPage: string = "";
31
+
32
+ /**
33
+ * 平台 → SDK 实例映射
34
+ * 新增平台时:
35
+ * 1. 在 SDK/Umeng/ 下添加对应的 SDK 文件
36
+ * 2. 在顶部 import 并在此注册
37
+ */
38
+ private static _sdkMap: Map<PlatformID, UmaSDK> = new Map([
39
+ [PlatformID.ID_MiniGame_WeiXin, wxUma],
40
+ // 新增平台示例:
41
+ // [PlatformID.ID_MiniGame_DouYin, ttUma],
42
+ ]);
43
+
44
+ onLoad(): void {
45
+ super.onLoad();
46
+
47
+ if (AnalyticsMgr.Instance === null) {
48
+ AnalyticsMgr.Instance = this;
49
+ } else {
50
+ this.destroy();
51
+ return;
52
+ }
53
+
54
+ ServiceLocator.Instance.register("AnalyticsMgr", this);
55
+
56
+ // 注意:SDK 内部已注册 wx.onShow/onHide 自动调用 resume/pause
57
+ // 无需在 AnalyticsMgr 监听生命周期事件
58
+
59
+ EventMgr.Instance.on(FrameworkBase.Message.UserMgr_PlatformOpenId_Ready, this._onPlatformOpenIdReady, this);
60
+ }
61
+
62
+ onDestroy(): void {
63
+ EventMgr.Instance.off(FrameworkBase.Message.UserMgr_PlatformOpenId_Ready, this._onPlatformOpenIdReady, this);
64
+
65
+ super.onDestroy();
66
+ }
67
+
68
+ /**
69
+ * 初始化统计管理器
70
+ * @param umengConfig 友盟 SDK 配置
71
+ *
72
+ * 自动判断当前平台是否在 appKeyMap 中配置了 appKey:
73
+ * - 有配置 → 启用统计并初始化 SDK
74
+ * - 无配置 → 禁用统计,跳过初始化
75
+ */
76
+ public init(umengConfig: UmengConfig): void {
77
+ if (this._isInited) {
78
+ LogUtils.Instance.warn(AnalyticsMgr.TAG, "重复初始化");
79
+ return;
80
+ }
81
+
82
+ if (!umengConfig) {
83
+ LogUtils.Instance.error(AnalyticsMgr.TAG, FwkErrorCode.Analytics.ConfigError, {
84
+ operation: "init",
85
+ reason: "友盟配置缺失",
86
+ });
87
+ this._isInited = true;
88
+ return;
89
+ }
90
+
91
+ this._umengConfig = umengConfig;
92
+
93
+ // 根据当前平台是否配置了 appKey 和 SDK 来决定是否启用
94
+ const platformID: PlatformID = BaseMgr.Instance.getCurrentPlatformID();
95
+ const appKey = umengConfig.appKeyMap.get(platformID);
96
+ const sdk = AnalyticsMgr._sdkMap.get(platformID);
97
+
98
+ if (appKey && sdk) {
99
+ this._appKey = appKey;
100
+ this._sdk = sdk;
101
+ this._isEnabled = this._initUmeng();
102
+ } else {
103
+ this._isEnabled = false;
104
+ if (!sdk) {
105
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "当前平台无友盟SDK,统计功能已禁用", {
106
+ platformID: PlatformID[platformID],
107
+ });
108
+ } else {
109
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "当前平台未配置友盟appKey,统计功能已禁用", {
110
+ platformID: PlatformID[platformID],
111
+ });
112
+ }
113
+ }
114
+
115
+ this._isInited = true;
116
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "初始化完成", {
117
+ enabled: this._isEnabled,
118
+ platformID: PlatformID[platformID],
119
+ });
120
+ }
121
+
122
+ private _onPlatformOpenIdReady(platformOpenId: string): void {
123
+ if (!this._isEnabled) return;
124
+
125
+ if (this._umengConfig && this._umengConfig.useOpenid && !this._umengConfig.autoGetOpenid) {
126
+ this.setOpenId(platformOpenId);
127
+ }
128
+ }
129
+
130
+ // ==================== 生命周期 ====================
131
+ // 注意:SDK 内部已自动处理 wx.onShow/onHide 的 resume/pause 调用
132
+
133
+ // ==================== 事件上报 ====================
134
+
135
+ /**
136
+ * 上报自定义事件
137
+ * @param eventId 事件 ID
138
+ * @param params 事件参数
139
+ */
140
+ public trackEvent(eventId: string | AnalyticsEventId, params?: EventParams): void {
141
+ if (!this._isEnabled) return;
142
+ try {
143
+ this._sdk.trackEvent(eventId, params);
144
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "事件上报", {
145
+ eventId: eventId,
146
+ });
147
+ } catch (e) {
148
+ LogUtils.Instance.error(AnalyticsMgr.TAG, FwkErrorCode.Analytics.SDKCallFailed, {
149
+ operation: "trackEvent",
150
+ reason: String(e),
151
+ eventId: eventId,
152
+ });
153
+ }
154
+ }
155
+
156
+ /**
157
+ * 页面开始追踪
158
+ * @param pageName 页面名称
159
+ */
160
+ public trackPageStart(pageName: string): void {
161
+ if (!this._isEnabled) return;
162
+ try {
163
+ this._sdk.trackPageStart(pageName);
164
+ this._currentPage = pageName;
165
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "页面开始", {
166
+ pageName: pageName,
167
+ });
168
+ } catch (e) {
169
+ LogUtils.Instance.error(AnalyticsMgr.TAG, FwkErrorCode.Analytics.SDKCallFailed, {
170
+ operation: "trackPageStart",
171
+ reason: String(e),
172
+ pageName: pageName,
173
+ });
174
+ }
175
+ }
176
+
177
+ /**
178
+ * 页面结束追踪
179
+ * @param pageName 页面名称
180
+ */
181
+ public trackPageEnd(pageName: string): void {
182
+ if (!this._isEnabled) return;
183
+ try {
184
+ this._sdk.trackPageEnd(pageName);
185
+ this._currentPage = "";
186
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "页面结束", {
187
+ pageName: pageName,
188
+ });
189
+ } catch (e) {
190
+ LogUtils.Instance.error(AnalyticsMgr.TAG, FwkErrorCode.Analytics.SDKCallFailed, {
191
+ operation: "trackPageEnd",
192
+ reason: String(e),
193
+ pageName: pageName,
194
+ });
195
+ }
196
+ }
197
+
198
+ // ==================== 用户追踪 ====================
199
+
200
+ /**
201
+ * 设置用户 ID
202
+ * @param userId 用户 ID
203
+ * @param provider 提供商
204
+ */
205
+ public setUserId(userId: string, provider?: string): void {
206
+ if (!this._isEnabled) return;
207
+ try {
208
+ this._sdk.setUserid(userId, provider);
209
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "设置用户ID", {
210
+ userId: userId,
211
+ provider: provider,
212
+ });
213
+ } catch (e) {
214
+ LogUtils.Instance.error(AnalyticsMgr.TAG, FwkErrorCode.Analytics.SDKCallFailed, {
215
+ operation: "setUserId",
216
+ reason: String(e),
217
+ });
218
+ }
219
+ }
220
+
221
+ /**
222
+ * 设置 OpenID
223
+ * @param openid 微信 openid
224
+ */
225
+ public setOpenId(openid: string): void {
226
+ if (!this._isEnabled) return;
227
+ try {
228
+ this._sdk.setOpenid(openid);
229
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "设置OpenID");
230
+ } catch (e) {
231
+ LogUtils.Instance.error(AnalyticsMgr.TAG, FwkErrorCode.Analytics.SDKCallFailed, {
232
+ operation: "setOpenId",
233
+ reason: String(e),
234
+ });
235
+ }
236
+ }
237
+
238
+ /**
239
+ * 设置用户属性
240
+ * @param properties 用户属性
241
+ */
242
+ public setUserProperties(properties: UserProperties): void {
243
+ if (!this._isEnabled) return;
244
+ try {
245
+ this._sdk.setUserInfo(properties);
246
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "设置用户属性");
247
+ } catch (e) {
248
+ LogUtils.Instance.error(AnalyticsMgr.TAG, FwkErrorCode.Analytics.SDKCallFailed, {
249
+ operation: "setUserProperties",
250
+ reason: String(e),
251
+ });
252
+ }
253
+ }
254
+
255
+ // ==================== 游戏特定事件 ====================
256
+
257
+ /** 关卡开始 */
258
+ public trackLevelStart(level: string | number, extraParams?: EventParams): void {
259
+ const params: Record<string, any> = {
260
+ [AnalyticsParamKey.Level]: level,
261
+ ...this._flattenParams(extraParams),
262
+ };
263
+ this.trackEvent(AnalyticsEventId.LevelStart, params);
264
+ }
265
+
266
+ /** 关卡完成 */
267
+ public trackLevelComplete(level: string | number, score?: number, duration?: number, extraParams?: EventParams): void {
268
+ const params: Record<string, any> = {
269
+ [AnalyticsParamKey.Level]: level,
270
+ ...(score !== undefined ? { [AnalyticsParamKey.Score]: score } : {}),
271
+ ...(duration !== undefined ? { [AnalyticsParamKey.Duration]: duration } : {}),
272
+ ...this._flattenParams(extraParams),
273
+ };
274
+ this.trackEvent(AnalyticsEventId.LevelComplete, params);
275
+ }
276
+
277
+ /** 关卡失败 */
278
+ public trackLevelFail(level: string | number, reason?: string, extraParams?: EventParams): void {
279
+ const params: Record<string, any> = {
280
+ [AnalyticsParamKey.Level]: level,
281
+ ...(reason ? { [AnalyticsParamKey.Reason]: reason } : {}),
282
+ ...this._flattenParams(extraParams),
283
+ };
284
+ this.trackEvent(AnalyticsEventId.LevelFail, params);
285
+ }
286
+
287
+ /** 广告展示 */
288
+ public trackAdShow(adType: string, adId: string, extraParams?: EventParams): void {
289
+ const params: Record<string, any> = {
290
+ [AnalyticsParamKey.AdType]: adType,
291
+ [AnalyticsParamKey.AdId]: adId,
292
+ ...this._flattenParams(extraParams),
293
+ };
294
+ this.trackEvent(AnalyticsEventId.AdShow, params);
295
+ }
296
+
297
+ /** 广告点击 */
298
+ public trackAdClick(adType: string, adId: string, extraParams?: EventParams): void {
299
+ const params: Record<string, any> = {
300
+ [AnalyticsParamKey.AdType]: adType,
301
+ [AnalyticsParamKey.AdId]: adId,
302
+ ...this._flattenParams(extraParams),
303
+ };
304
+ this.trackEvent(AnalyticsEventId.AdClick, params);
305
+ }
306
+
307
+ /** 分享 */
308
+ public trackShare(shareType: string, shareContent?: string): void {
309
+ const params: Record<string, any> = {
310
+ [AnalyticsParamKey.ShareType]: shareType,
311
+ ...(shareContent ? { [AnalyticsParamKey.ShareContent]: shareContent } : {}),
312
+ };
313
+ this.trackEvent(AnalyticsEventId.Share, params);
314
+ }
315
+
316
+ // ==================== 状态查询 ====================
317
+
318
+ /** 是否已初始化 */
319
+ public get isInited(): boolean {
320
+ return this._isInited;
321
+ }
322
+
323
+ /** 是否启用 */
324
+ public get isEnabled(): boolean {
325
+ return this._isEnabled;
326
+ }
327
+
328
+ /** 当前页面 */
329
+
330
+ // ==================== 私有方法 ====================
331
+
332
+ /** 初始化友盟 SDK */
333
+ private _initUmeng(): boolean {
334
+ try {
335
+ const sdkConfig: UmaInitConfig = {
336
+ appKey: this._appKey,
337
+ useOpenid: this._umengConfig.useOpenid,
338
+ autoGetOpenid: this._umengConfig.autoGetOpenid,
339
+ debug: this._umengConfig.debug,
340
+ };
341
+ this._sdk.init(sdkConfig);
342
+ LogUtils.Instance.info(AnalyticsMgr.TAG, "友盟SDK初始化成功", {
343
+ appKey: this._appKey,
344
+ useOpenid: sdkConfig.useOpenid,
345
+ debug: sdkConfig.debug,
346
+ });
347
+
348
+ return true;
349
+ } catch (e) {
350
+ LogUtils.Instance.error(AnalyticsMgr.TAG, FwkErrorCode.Analytics.SDKInitFailed, {
351
+ operation: "_initUmeng",
352
+ reason: String(e),
353
+ appKey: this._appKey,
354
+ });
355
+
356
+ return false;
357
+ }
358
+ }
359
+
360
+
361
+
362
+ /** 展开 EventParams 为普通对象 */
363
+ private _flattenParams(params?: EventParams): Record<string, any> {
364
+ if (!params) return {};
365
+ if (typeof params === 'string') return { value: params };
366
+ return params as Record<string, any>;
367
+ }
368
+ }
@@ -1,5 +1,5 @@
1
1
  import { FrameworkBase } from "../Definition/FrameworkBase";
2
- import { EnhanceLoginResult, LocalLoginResult, LoginResult, LoginResultType, ServerGetUserDataResult, ServerLoginResult, ServerUpdateUserDataResult, UpdateUserDataResult, UserBehaviorPlatformInfo, UserDataCategory, UserDataInfo, UserDataKey, UserDataType } from "../Definition/UserDefinition";
2
+ import { EnhanceLoginResult, LocalLoginResult, ServerGetUserDataResult, ServerLoginResult, ServerUpdateUserDataResult, UpdateUserDataResult, UserBehaviorPlatformInfo, UserDataCategory, UserDataInfo, UserDataKey, UserDataType } from "../Definition/UserDefinition";
3
3
  import { FwkErrorCode } from "../Definition/FwkErrorDefinition";
4
4
  import { LogUtils } from "../Utils/LogUtils";
5
5
  import { BaseMgr } from "./BaseMgr";
@@ -240,150 +240,6 @@ export class UserMgr extends BaseMgr {
240
240
  }
241
241
  }
242
242
 
243
- /**
244
- * 登录
245
- * @param needForceLogin 是否强制登录
246
- * @param callback 登录回调
247
- */
248
- public login(needForceLogin: boolean, callback: Function): void {
249
- if (callback === null) {
250
- LogUtils.Instance.error(UserMgr.TAG, FwkErrorCode.User.InvalidData, {
251
- operation: "login",
252
- reason: "回调函数为空"
253
- });
254
- return;
255
- }
256
-
257
- if (this.currentPlatformAdapter === null) {
258
- LogUtils.Instance.error(UserMgr.TAG, FwkErrorCode.User.NotInit, {
259
- operation: "login",
260
- reason: "平台适配器未初始化"
261
- });
262
- callback({
263
- type: LoginResultType.Type_LoginFail_ContinueGame,
264
- });
265
- return;
266
- }
267
-
268
- if (this.currentPlatformId === PlatformID.ID_H5_DesktopBrowser ||
269
- this.currentPlatformId === PlatformID.ID_MiniGame_ZhiFuBao ||
270
- this.currentPlatformId === PlatformID.ID_QuickGame_HuaWei ||
271
- this.currentPlatformId === PlatformID.ID_QuickGame_Honor ||
272
- this.currentPlatformId === PlatformID.ID_QuickGame_Vivo ||
273
- this.currentPlatformId === PlatformID.ID_QuickGame_XiaoMi ||
274
- this.currentPlatformId === PlatformID.ID_QuickGame_Oppo
275
- ) {
276
- needForceLogin = true;
277
- }
278
-
279
- LogUtils.Instance.info(UserMgr.TAG, "开始登录", {
280
- needForceLogin: needForceLogin,
281
- });
282
-
283
- if (!needForceLogin) {
284
- this._checkSession().then((loginResult: LoginResult) => {
285
- callback(loginResult);
286
- }).catch(() => {
287
- this._login().then((loginResult: LoginResult) => {
288
- callback(loginResult);
289
- }).catch((loginResult: LoginResult) => {
290
- LogUtils.Instance.info(UserMgr.TAG, "用户登录失败(Session检查失败后重试登录)", {
291
- resultType: loginResult.type,
292
- canContinue: loginResult.type === LoginResultType.Type_LoginFail_ContinueGame,
293
- });
294
- callback(loginResult);
295
- });
296
- });
297
- } else {
298
- this._login().then((loginResult: LoginResult) => {
299
- callback(loginResult);
300
- }).catch((loginResult: LoginResult) => {
301
- LogUtils.Instance.info(UserMgr.TAG, "用户登录失败(强制登录模式)", {
302
- resultType: loginResult.type,
303
- canContinue: loginResult.type === LoginResultType.Type_LoginFail_ContinueGame
304
- });
305
- callback(loginResult);
306
- });
307
- }
308
- }
309
-
310
- /** 检查 Session(内部方法) */
311
- private _checkSession(): Promise<LoginResult> {
312
- return new Promise((resolve, reject) => {
313
- if (this.currentPlatformAdapter === null) {
314
- reject();
315
- return;
316
- }
317
-
318
- this.currentPlatformAdapter.checkSession(
319
- (isValid: boolean) => {
320
- LogUtils.Instance.info(UserMgr.TAG, "_checkSession()结果", {
321
- isValid: isValid,
322
- });
323
-
324
- if (isValid) {
325
- resolve({
326
- type: LoginResultType.Type_SessionAvailable,
327
- });
328
- } else {
329
- reject();
330
- }
331
- });
332
- });
333
- }
334
-
335
- /** 登录(内部方法) */
336
- private _login(): Promise<LoginResult> {
337
- return new Promise((resolve, reject) => {
338
- if (this.currentPlatformAdapter === null) {
339
- reject("");
340
- return;
341
- }
342
-
343
- this.currentPlatformAdapter.login(
344
- (res) => {
345
- // 华为:playerId
346
- // 小米:appAccountId
347
- // 其他平台:code
348
- LogUtils.Instance.info(UserMgr.TAG, "_login()成功", {
349
- res: res,
350
- });
351
-
352
- if (res) {
353
- if (res.code) {
354
- resolve({
355
- type: LoginResultType.Type_LoginSuccess_Auth_Code,
356
- });
357
- } else if (res.playerId || res.appAccountId) {
358
- resolve({
359
- type: LoginResultType.Type_LoginSuccess_Auth_AccountID,
360
- });
361
- } else {
362
- reject({
363
- type: LoginResultType.Type_LoginFail_ContinueGame,
364
- });
365
- }
366
- } else {
367
- reject({
368
- type: LoginResultType.Type_LoginFail_ContinueGame,
369
- });
370
- }
371
- }, () => {
372
- LogUtils.Instance.info(UserMgr.TAG, "_login()失败", {});
373
-
374
- if (this.currentPlatformId === PlatformID.ID_QuickGame_HuaWei) {
375
- reject({
376
- type: LoginResultType.Type_LoginFail_ExitGame,
377
- });
378
- } else {
379
- reject({
380
- type: LoginResultType.Type_LoginFail_ContinueGame,
381
- });
382
- }
383
- });
384
- });
385
- }
386
-
387
243
  public async enhanceLogin(
388
244
  loginCallbackFunc: (result: EnhanceLoginResult) => void,
389
245
  ): Promise<void> {
@@ -468,6 +324,10 @@ export class UserMgr extends BaseMgr {
468
324
  }
469
325
  }
470
326
 
327
+ if (this.platformOpenId !== "") {
328
+ EventMgr.Instance.emit(FrameworkBase.Message.UserMgr_PlatformOpenId_Ready, this.platformOpenId);
329
+ }
330
+
471
331
  let needServerUserData: boolean = false;
472
332
  if (this.uid !== "" && this.userBehaviorPlatformInfo.supportServerUserData) {
473
333
  needServerUserData = true;
@@ -0,0 +1,107 @@
1
+ /**
2
+ * 友盟+ 微信小程序游戏版 SDK
3
+ * 由 umtrack-wx-game.js 转换而来,适配 Cocos Creator 3.x TypeScript 环境
4
+ * 采用直接执行方案,不使用 new Function() 沙箱
5
+ * @version 2.8.2
6
+ */
7
+
8
+ // @ts-nocheck
9
+ // 禁用 TypeScript 检查,因为 SDK 是压缩后的 JS 代码
10
+
11
+ // ============================================
12
+ // SDK 内部实现(直接执行,非沙箱)
13
+ // ============================================
14
+
15
+ var e="[UMENG] -- ",t=function(){var t=null,n=!1;function i(){this.setDebug=function(e){n=e};this.d=function(){if(n)try{"string"==typeof arguments[0]&&(arguments[0]=e+arguments[0]);console.debug.apply(console,arguments)}catch(e){}};this.i=function(){try{if(n)try{"string"==typeof arguments[0]&&(arguments[0]=e+arguments[0]);console.info.apply(console,arguments)}catch(e){}}catch(e){}};this.e=function(){if(n)try{"string"==typeof arguments[0]&&(arguments[0]=e+arguments[0]);console.error.apply(console,arguments)}catch(e){}};this.w=function(){if(n)try{"string"==typeof arguments[0]&&(arguments[0]=e+arguments[0]);console.warn.apply(console,arguments)}catch(e){}};this.v=function(){if(n)try{"string"==typeof arguments[0]&&(arguments[0]=e+arguments[0]);console.log.apply(console,arguments)}catch(e){}};this.t=function(){if(n)try{console.table.apply(console,arguments)}catch(e){}};this.tip=function(){try{"string"==typeof arguments[0]&&(arguments[0]=e+arguments[0]);console.log.apply(console,arguments)}catch(e){}};this.tip_w=function(t){try{console.log("%c "+e+t,"background:red; padding: 4px; padding-right: 8px; border-radius: 4px; color: #fff;")}catch(e){}};this.err=function(){try{"string"==typeof arguments[0]&&(arguments[0]=e+arguments[0]);console.error.apply(console,arguments)}catch(e){}};this.repeat=function(e){for(var t=e;t.length<86;)t+=e;return t}}return function(){null===t&&(t=new i);return t}}(),n=function(){var e=null;function t(){var e={};this.useOpenid=function(){return!!e.useOpenid};this.useSwanid=function(){return!!e.useSwanid};this.autoGetOpenid=function(){return!!e.autoGetOpenid};this.appKey=function(){return e.appKey};this.uploadUserInfo=function(){return e.uploadUserInfo};this.enableVerify=function(){return e.enableVerify};this.set=function(t){e=t};this.get=function(){return e};this.setItem=function(t,n){e[t]=n};this.getItem=function(t){return e[t]}}return function(){e||(e=new t);return e}}();function i(){}i.prototype={on:function(e,t,n){var i=this.e||(this.e={});(i[e]||(i[e]=[])).push({fn:t,ctx:n});return this},once:function(e,t,n){var i=this;function r(){i.off(e,r);t.apply(n,arguments)}r._=t;return this.on(e,r,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),i=0,r=n.length;i<r;i++)n[i].fn.apply(n[i].ctx,t);return this},off:function(e,t){var n=this.e||(this.e={}),i=n[e],r=[];if(i&&t)for(var o=0,s=i.length;o<s;o++)i[o].fn!==t&&i[o].fn._!==t&&r.push(i[o]);r.length?n[e]=r:delete n[e];return this}};var r=new i;r.messageType={CONFIG_LOADED:0,UMA_LIB_INITED:1};var o=function(e,t){o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return o(e,t)};function s(e,t){o(e,t);function n(){this.constructor=e}e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=new(function(e){s(n,e);function n(){return null!==e&&e.apply(this,arguments)||this}n.prototype.getSdkType=function(){return"wxgamemp"};n.prototype.getUserInfo=function(e){var n={fail:function(){e&&e()},success:function(t){if(t&&t.userInfo){var n=t.userInfo;e&&e({avatar:n.avatarUrl,nickName:n.nickName,gender:n.gender,country:n.country,province:n.province,city:n.city,language:n.language})}}};try{wx.getSetting({success:function(e){e.authSetting["scope.userInfo"]&&wx.getUserInfo(n)},fail:function(){e()}})}catch(e){t.e("getUserInfo error",e)}};return n}(function(){function e(){}e.prototype.setStorage=function(e,t,n){wx.setStorage({key:e,data:t,success:function(){"function"==typeof n&&n(!0)},fail:function(){"function"==typeof n&&n(!1)}})};e.prototype.getStorage=function(e,n){wx.getStorage({key:e,success:function(e){"function"==typeof n&&n(e.data)},fail:function(i){t().w(e+": "+i.errMsg);"function"==typeof n&&n()}})};e.prototype.removeStorage=function(e,t){wx.removeStorage({key:e,success:function(){"function"==typeof t&&t(!0)},fail:function(){"function"==typeof t&&t(!1)}})};e.prototype.getSystemInfo=function(e){wx.getSystemInfo({success:function(t){t.safeArea=t.safeArea||{};var n="";t.host&&"string"==typeof t.host.env&&(n=t.host.env);var i={model:t.model,brand:t.brand,pixelRatio:t.pixelRatio,screenWidth:t.screenWidth,screenHeight:t.screenHeight,fontSizeSetting:t.fontSizeSetting,platform:t.platform,platformVersion:t.version,platformSDKVersion:t.SDKVersion,language:t.language,deviceName:t.model,OSVersion:t.system,resolution:"",theme:t.theme,benchmarkLevel:t.benchmarkLevel,safeArea:{width:t.safeArea.width,height:t.safeArea.height,top:t.safeArea.top,left:t.safeArea.left,bottom:t.safeArea.bottom,right:t.safeArea.right},statusBarHeight:t.statusBarHeight,host:n},r=t.system.split(" ");Array.isArray(r)&&(i.OS=r[0]);var o=Math.round(t.screenWidth*t.pixelRatio),s=Math.round(t.screenHeight*t.pixelRatio);i.resolution=o>s?o+"*"+s:s+"*"+o;"function"==typeof e&&e(i)},fail:function(){"function"==typeof e&&e()}})};e.prototype.getDeviceInfo=function(e){"function"==typeof e&&e("")};e.prototype.checkNetworkAvailable=function(e){wx.getNetworkType({success:function(t){"function"==typeof e&&e(t&&"none"!==t.networkType)},fail:function(){"function"==typeof e&&e(!1)}})};e.prototype.getNetworkInfo=function(e){wx.getNetworkType({success:function(t){"function"==typeof e&&e({networkAvailable:"none"!==t.networkType,networkType:t.networkType})},fail:function(){"function"==typeof e&&e()}})};e.prototype.getDeviceId=function(e){e("")};e.prototype.getAdvertisingId=function(e){"function"==typeof e&&e("")};e.prototype.onNetworkStatusChange=function(e){wx.onNetworkStatusChange((function(t){"function"==typeof e&&e(t.isConnected)}))};e.prototype.request=function(e){var t=e.success,n=e.fail,i=!1,r=null;e.success=function(e){if(!i){r&&clearTimeout(r);"function"==typeof t&&t(e)}};e.fail=function(){if(!i){r&&clearTimeout(r);"function"==typeof n&&n(!1)}};wx.request(e);r=setTimeout((function(){r&&clearTimeout(r);i=!0;"function"==typeof n&&n(i)}),e.timeout||5e3)};e.prototype.getSdkType=function(){return"wxmp"};e.prototype.getPlatform=function(){return"wx"};e.prototype.getUserInfo=function(e){e()};e.prototype.getAppInfoSync=function(){if(wx.getAccountInfoSync){var e=wx.getAccountInfoSync(),t=e&&e.miniProgram?e.miniProgram:{};return{appId:t.appId,appEnv:t.envVersion,appVersion:t.version}}return{}};e.prototype.onShareAppMessage=function(e){wx.onShareAppMessage(e)};e.prototype.shareAppMessage=function(e){wx.shareAppMessage(e)};e.prototype.getLaunchOptionsSync=function(){var e=null;if(e)return e;if(!wx.getLaunchOptionsSync)return{};try{e=wx.getLaunchOptionsSync()}catch(t){e=null}return e||{}};return e}())),u={SESSION_INTERVAL:3e4,LOG_URL:"/wxm_logs",GET_OPENID_URL:"/uminiprogram_logs/wx/getuut",USERINFO_URL:"/uminiprogram_logs/comm/uif",ENDPOINT:"https://umini.shujupie.com",ENDPOINTB:"https://ulogs.umeng.com",DEVICE_INFO_KEY:"device_info",ADVERTISING_ID:"mobile_ad_id",ANDROID_ID:"android_id",CURRENT_SESSION:"current_session",SESSION_PAUSE_TIME:"session_pause_time",EVENT_SEND_DEFAULT_INTERVAL:15e3,EVENT_LAST_SEND_TIME:"last_send_time",MAX_EVENTID_LENGTH:128,MAX_PROPERTY_KEY_LENGTH:256,MAX_PROPERTY_KEYS_COUNT:100,REPORT_POLICY:"report_policy",REPORT_INTERVAL_TIME:"report_interval_time",REPORT_POLICY_START_SEND:"1",REPORT_POLICY_INTERVAL:"6",IMPRINT:"imprint",SEED_VERSION:"1.0.0",IMPL_VERSION:"2.8.2",ALIPAY_AVAILABLE_VERSION:"10.1.52",SHARE_PATH:"um_share_path",SHARES:"shares",REQUESTS:"requests",UUID:"um_uuid",UUID_SUFFIX:"ud",OPENID:"um_od",UNIONID:"um_unid",ALIPAYID:"um_alipayid",USERID:"um_userid",PROVIDER:"um_provider",SWANID:"um_swanid",ANONYMOUSID:"um_anonymousid",LAUNCH_OPTIONS:"LAUNCH_OPTIONS",UM_SSRC:"_um_ssrc",USER_INFO:"user_info",IS_ALIYUN:!1};var c,f={isNumber:function(e){return!Number.isNaN(parseInt(e,10))},compareVersion:function(e,t){for(var n=String(e).split("."),i=String(t).split("."),r=0;r<Math.max(n.length,i.length);r++){var o=parseInt(n[r]||0,10),s=parseInt(i[r]||0,10);if(o>s)return 1;if(o<s)return-1}return 0},getRandomStr:function(e){for(var t="",n=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],i=0;i<Number(e);i++){t+=n[Math.round(Math.random()*(n.length-1))]}return t},clone:function(e){return JSON.parse(JSON.stringify(e))},startsWith:function(e,t){return!(!e||!t||0===t.length||t.length>e.length)&&e.substr(0,t.length)===t},endsWith:function(e,t){return!(!t||0===e.length||t.length>e.length)&&e.substring(e.length-t.length)===t},assign:function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),n=1;n<arguments.length;n++){var i=arguments[n];if(i)for(var r in i)Object.prototype.hasOwnProperty.call(i,r)&&(t[r]=i[r])}return t},deepEqual:function e(t,n){if(t===n)return!0;if(t&&"object"==typeof t&&n&&"object"==typeof n){if(Object.keys(t).length!==Object.keys(n).length)return!1;for(var i in t){if(Object.prototype.hasOwnProperty.call(n,i))return!1;if(!e(t[i],n[i]))return!1}return!0}return!1},trimStart:function(e,t){if(!e)return"";if("string"==typeof t&&t.length){var n=new RegExp("^"+t+"*");e=e.replace(n,"")}else e=e.replace(/^s*/,"");return e},trimEnd:function(e,t){if(!e)return"";var n,i;if("string"==typeof t&&t.length){n=new RegExp(t);i=e.length;for(;n.test(e.charAt(i));)i-=1;return e.slice(0,i+1)}n=/s/;i=e.length-1;for(;n.test(e.charAt(i));)i-=1;return e.slice(0,i+1)},isFunction:function(e){return"function"==typeof e}},p=function(e){s(n,e);function n(){return null!==e&&e.apply(this,arguments)||this}n.prototype.getOpenIdAsync=function(e,n){var i=this;wx.login({success:function(r){r.code?a.request({url:u.ENDPOINT+u.GET_OPENID_URL,method:"GET",data:{key:e,code:r.code},success:function(e){if(e&&200===e.statusCode&&e.data&&e.data.data){var t=e.data.data;i.setOpenid(t.oid);i.setUnionid(t.uid);return n&&n(!0)}n&&n()},fail:function(e){t().v("wx request failed...",e);n&&n()}}):n&&n()},fail:function(){n&&n()}})};return n}(function(e){s(n,e);function n(){var t=null!==e&&e.apply(this,arguments)||this;t._openid="";t._unionid="";t._useOpenid=!1;return t}n.prototype.initID=function(e){var n=this;n._idType=n._useOpenid?"openid":"uuid";t().v("id type: ",n._idType);a.getStorage(u.UNIONID,(function(e){n._unionid=e}));this._useOpenid?a.getStorage(u.OPENID,(function(t){n._openid=t;e&&e()})):e&&e()};n.prototype.setUseOpenid=function(e){this._useOpenid=e};n.prototype.setOpenid=function(e){if(!this._openid&&e){this._openid=e;a.setStorage(u.OPENID,e)}};n.prototype.setUnionid=function(e){if(!this._unionid&&e){this._unionid=e;a.setStorage(u.UNIONID,e)}};n.prototype.getIdTracking=function(){var t=e.prototype.getIdTracking.call(this);this._openid&&(t.openid=this._openid);this._unionid&&(t.unionid=this._unionid);this._userid&&(t.userid=this._userid);return t};n.prototype.getId=function(){return this._useOpenid?this._openid:this._uuid};return n}(function(){function e(){this._uuid="";this._userid="";this._provider="";this._idType=""}e.prototype.createUUID=function(){return f.getRandomStr(10)+Date.now()+f.getRandomStr(7)+u.UUID_SUFFIX};e.prototype.initUUID=function(e){var t=this;a.getStorage(u.UUID,(function(n){if(n)t._uuid=n;else{t._uuid=t.createUUID();a.setStorage(u.UUID,t._uuid)}e&&e(n)}))};e.prototype.initUserid=function(){var e=this;a.getStorage(u.USERID,(function(n){if(!e._userid&&n){e._userid=n;t().v("userId is ",n)}}));a.getStorage(u.PROVIDER,(function(n){if(!e._provider&&n){e._provider=n;t().v("provider is ",n)}}))};e.prototype.init=function(e){var t=this;t.initUUID((function(){t.initUserid();t.initID(e)}))};e.prototype.setUserid=function(e,t){if(!this._userid&&e){this._userid=e;this._provider=t;a.setStorage(u.USERID,e);a.setStorage(u.PROVIDER,t)}};e.prototype.removeUserid=function(){this._userid=void 0;this._provider=void 0;a.removeStorageSync(u.USERID);a.removeStorageSync(u.PROVIDER)};e.prototype.getUserId=function(){return this._userid};e.prototype.getProvider=function(){return this._provider};e.prototype.getIdType=function(){return this._idType};e.prototype.getIdTracking=function(){var e={};this._uuid&&(e.uuid=this._uuid);this._userid&&(e.userid=this._userid);return e};return e}())),l=(c=null,function(){c||(c=new p);return c}),d=function(){var e=null;function t(){var e=!1,t=null,n=[];this.addPageStart=function(n){if(n&&!e){t={ts:Date.now(),path:n,page_name:n};e=!0}};this.addPageEnd=function(i){if(e&&i&&t&&i===t.page_name){var r=Date.now()-t.ts;t.duration=Math.abs(r);n.push(t);t=null;e=!1}};this.get=function(){return n};this.getCurrentPage=function(){return t};this.clear=function(){n.length=0}}return function(){e||(e=new t);return e}}(),h={};var g=function(){var e=null,n=[],i="";function r(){return{add:function(e,r){t().v("share origin: %o",e);var o={title:e&&e.title,path:e&&e.path&&e.path.split("?")[0],_um_sts:Date.now()};o.path&&o.path.length>1&&f.startsWith(o.path,"/")&&(o.path=f.trimStart(o.path,"/"));var s=e.path||"",a=l().getId();if(a){var u=i.split(","),c=(u=u.filter((function(e){return e.length>0}))).indexOf(a);c>=0&&(u=u.slice(0,c));u.length<3&&u.push(a);var p=u.join(",");-1!==s.indexOf("?")?s+="&_um_ssrc="+p:s+="?_um_ssrc="+p;var d=Date.now();s+="&_um_sts="+d;if(r){var g=function(e){var t=[];for(var n in e)"_um_ssrc"!==n&&"_um_sts"!==n&&t.push(n+"="+e[n]);return t.join("&")}(h),v=g?g+"&_um_ssrc="+p+"&_um_sts="+d:"_um_ssrc="+p+"&_um_sts="+d;e.query=e.query?e.query+"&_um_ssrc="+p+"&_um_sts="+d:v}else e.path=s;o._um_ssrc=p;o._um_sts=d}n.push(o);t().v("share: %o",e);return e},setShareSource:function(e){i=e},clear:function(){n.length=0},get:function(){return n}}}return function(){e||(e=new r);return e}}(),v=function(e){if(e)try{return JSON.stringify(e)}catch(e){}return""},_=function(e){if(e)try{return JSON.parse(e)}catch(e){}return null},y=function(){var e=null,t="",i=null,r=!1;function o(){this.load=function(e){if(i){a.removeStorage(t);e()}else{t="um_cache_"+n().appKey();a.getStorage(t,(function(n){i=_(n)||{};r=!0;a.removeStorage(t);e()}))}};this.save=function(){i&&a.setStorage(t,v(i))};this.set=function(e,t){i&&(i[e]=t)};this.get=function(e){return(i||{})[e]};this.remove=function(e){i&&i[e]&&delete i[e]};this.getAll=function(){return i};this.clear=function(){i=null};this.has=function(e){return!!this.get(e)};this.isLoaded=function(){return r}}return function(){e||(e=new o);return e}}(),m="ekvs",S=function(){var e,n,i=[],r=[];function o(){if(i.length){var e=y().get(m);if(function(e){var t=0;for(var n in e)Array.isArray(e[n])&&(t+=e[n].length);return t}(e)+i.length<=1e4){e=s(e,i);y().set(m,e)}}}function s(e,t){var i=(e=e||{})[n];Array.isArray(i)&&i.length?e[n]=i.concat(t):e[n]=[].concat(t);return e}return function(){e||(e={addEvent:function(e){if(n){i.unshift(e);if(i.length>1){o();i.length=0}}else{t().w("session id is null: ",n);r.unshift(e)}},setSessionId:function(e){n=e;t().v("setSessionId: ",n);if(Array.isArray(r)&&r.length&&n){for(var i=0;i<r.length;i++)this.addEvent(r[i]);r.length=0}},getEkvs:function(){var e=y().get(m);i&&i.length&&(e=s(e,i));return e},clear:function(){y().remove(m);i.length=0}});return e}}(),I="2g",E="3g",O="4g",A="half_session",N="close_session",T="ekv",w=["access","access_subtype"],k=function(){var e=null;function t(){var e=!1,t={};function i(e){var i=y().get(u.IMPRINT);i&&(t.imprint=i);t.device_type="Phone";t.sdk_version=u.IMPL_VERSION;t.appkey=n().appKey();a.getDeviceInfo((function(e){t.device_info=e||""}));var r=a.getAppInfoSync();t.appid=r.appId;t.app_env=r.appEnv;t.app_version=r.appVersion;a.getSystemInfo((function(n){a.getNetworkInfo((function(i){var r=function(e,t){var n={};e=e||{};e.safeArea=e.safeArea||{};t=t||{};var i=t.networkType;"none"===i&&(i="unknown");var r=e.model||"",o=e.platform||"",s=e.brand||"",u=s.toLowerCase();n.sdk_type=a.getSdkType();n.platform=a.getPlatform();n.platform_sdk_version=e.platformSDKVersion;n.platform_version=e.platformVersion;n.resolution=e.resolution;n.pixel_ratio=e.pixelRatio;n.os=o;n.font_size_setting=e.fontSizeSetting;n.device_model=r;n.device_brand=s;n.device_manufacturer=u;n.device_manuid=r;n.device_name=r;n.os_version=e.OSVersion;n.language=e.language;n.theme=e.theme;n.benchmark_level=e.benchmarkLevel;n.status_bar_height=e.statusBarHeight;n.safe_area_top=e.safeArea.top;n.safe_area_left=e.safeArea.left;n.safe_area_right=e.safeArea.right;n.safe_area_bottom=e.safeArea.bottom;n.safe_area_height=e.safeArea.height;n.safe_area_width=e.safeArea.width;n.storage=e.storage;n.screen_width=e.screenWidth;n.screen_height=e.screenHeight;n.host=e.host;switch(i=i?i.toLowerCase():""){case O:n.access_subtype="LTE";n.access="4G";break;case E:n.access_subtype="CDMA";n.access="3G";break;case I:n.access_subtype="GRPS";n.access="2G";break;default:n.access=i;delete n.access_subtype}return n}(n,i);f.assign(t,r);e&&e()}))}))}return{init:function(){i((function(){e=!0}))},isLoaded:function(){return e},get:function(){return t},getRealtimeFields:function(){var e={};w.forEach((function(n){e[n]=t[n]}));return e},setIdTracking:function(e){this.setItem("id_tracking",e)},setIdType:function(e){this.setItem("id_type",e)},setAppVersion:function(e){this.setItem("app_version",e)},setSuperProperty:function(e){t.sp||(t.sp={});t.sp.isv=e},getSuperProperty:function(){return t&&t.sp?t.sp.isv:""},setItem:function(e,n){t[e]=n},getItem:function(e){return t[e]}}}return{instance:function(){e||(e=t());return e}}}(),b=function(){var e=null,n=null,i=null;function r(){return{resume:function(e){var r=!1;i||(i=y().get(u.CURRENT_SESSION));var o=new Date;n=o.getTime();if(!i||!i.end_time||n-i.end_time>u.SESSION_INTERVAL){r=!0;!function(e){try{var n=(i||{}).options||{},r=f.assign({},function(e){var n={};for(var i in e)0===i.indexOf("_um_")&&(n[i]=e[i]);t().v("query: ",e);t().v("_um_params: ",n);return n}(e.query));r.path=e.path||n.path;"gaode"!==a.getPlatform()&&(r.scene=e.scene?a.getPlatform()+"_"+e.scene:n.scene);var o=e.referrerInfo;o&&(r.referrerAppId=o.appId);t().v("session options: ",r);var s=r[u.UM_SSRC];s&&g().setShareSource(s);var c=Date.now();i={id:f.getRandomStr(10)+c,start_time:c,options:r}}catch(e){t().e("生成新session失败: ",e)}}(e);t().v("开始新的session(%s): ",i.id,i)}else t().v("延续上一次session(%s): %s ",i.id,o.toLocaleTimeString(),i);return r},pause:function(){!function(){if(i){var e=new Date;i.end_time=e.getTime();"number"!=typeof i.duration&&(i.duration=0);i.duration=i.end_time-n;y().set(u.CURRENT_SESSION,i);t().v("退出会话(%s): %s ",i.id,e.toLocaleTimeString(),i)}}()},getCurrentSessionId:function(){return(i||{}).id},getCurrentSession:function(){return i},cloneCurrentSession:function(){return f.clone(i)}}}return function(){e||(e=r());return e}}();function D(e){var t=null;switch(e){case A:t=function(){var e=null,t=b().cloneCurrentSession();t&&(e={header:{st:"1"},analytics:{sessions:[t]}});return e}();break;case N:t=function(){var e=null,t={},n=b().cloneCurrentSession();if(n){var i=d().get(),r=g().get();Array.isArray(i)&&i.length&&(n.pages=f.clone(i));Array.isArray(r)&&r.length&&(n.shares=f.clone(r));d().clear();g().clear();t.sessions=[n]}var o=S().getEkvs();if(o){t.ekvs=f.clone(o);S().clear()}(t.sessions||t.ekvs)&&(e={analytics:t});return e}();break;case T:t=function(){var e=null,t=S().getEkvs();if(t){e={analytics:{ekvs:f.clone(t)}};S().clear()}return e}()}return t}var R={sessions:"sn",ekvs:"e",active_user:"active_user"},U={sdk_type:"sdt",access:"ac",access_subtype:"acs",device_model:"dm",language:"lang",device_type:"dt",device_manufacturer:"dmf",device_name:"dn",platform_version:"pv",id_type:"it",font_size_setting:"fss",os_version:"ov",device_manuid:"did",platform_sdk_version:"psv",device_brand:"db",appkey:"ak",_id:"id",id_tracking:"itr",imprint:"imp",sdk_version:"sv",resolution:"rl",testToken:"ttn",theme:"t5",benchmark_level:"bml",screen_width:"sw",screen_height:"sh",status_bar_height:"sbh",safe_area_top:"sat",safe_area_left:"sal",safe_area_right:"sar",safe_area_bottom:"sab",safe_area_height:"sah",safe_area_width:"saw",pixel_ratio:"pr",storage:"s7",host:"hs"},P={uuid:"ud",unionid:"und",openid:"od",anonymousid:"nd",alipay_id:"ad",device_id:"dd",userid:"puid"};function L(e,t){var n=C(e,t);e&&e.id_tracking&&(n[t.id_tracking||"id_tracking"]=C(e.id_tracking,P));return n}function C(e,t){var n={};for(var i in e)t[i]?n[t[i]]=e[i]:n[i]=e[i];return n}function M(e,t){var n={};if(e)for(var i in e)e[i]&&(n[t[i]]=e[i]);return n}var x="";function V(){return x}var j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",G=function(e){for(var t={},n=0,i=e.length;n<i;n++)t[e.charAt(n)]=n;return t}(j),K=String.fromCharCode,F=function(e){if(e.length<2){return(t=e.charCodeAt(0))<128?e:t<2048?K(192|t>>>6)+K(128|63&t):K(224|t>>>12&15)+K(128|t>>>6&63)+K(128|63&t)}var t=65536+1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320);return K(240|t>>>18&7)+K(128|t>>>12&63)+K(128|t>>>6&63)+K(128|63&t)},q=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,H=function(e){var t=[0,2,1][e.length%3],n=e.charCodeAt(0)<<16|(e.length>1?e.charCodeAt(1):0)<<8|(e.length>2?e.charCodeAt(2):0);return[j.charAt(n>>>18),j.charAt(n>>>12&63),t>=2?"=":j.charAt(n>>>6&63),t>=1?"=":j.charAt(63&n)].join("")},B=function(e){return t=function(e){return e.replace(q,F)}(e),t.replace(/[\s\S]{1,3}/g,H);var t},Y=new RegExp(["[À-ß][€-¿]","[à-ï][€-¿]{2}","[ð-÷][€-¿]{3}"].join("|"),"g"),W=function(e){switch(e.length){case 4:var t=((7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3))-65536;return K(55296+(t>>>10))+K(56320+(1023&t));case 3:return K((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return K((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}},J=function(e){var t=e.length,n=t%4,i=(t>0?G[e.charAt(0)]<<18:0)|(t>1?G[e.charAt(1)]<<12:0)|(t>2?G[e.charAt(2)]<<6:0)|(t>3?G[e.charAt(3)]:0),r=[K(i>>>16),K(i>>>8&255),K(255&i)];r.length-=[0,0,2,1][n];return r.join("")},X=function(e){return t=function(e){return e.replace(/[\s\S]{1,4}/g,J)}(e),t.replace(Y,W);var t},z=function(e,t){return t?B(String(e)).replace(/[+\/]/g,(function(e){return"+"==e?"-":"_"})).replace(/=/g,""):B(String(e))},Q=function(e){return X(String(e).replace(/[-_]/g,(function(e){return"-"==e?"+":"/"})).replace(/[^A-Za-z0-9\+\/]/g,""))};var Z=new function(){var e="",t=this;this.set=function(t){e=t};this.get=function(){return e};this.getImpObj=function(){return _(Q(e))};this.getItem=function(e){var n=t.getImpObj();return n&&n[e]||""};this.load=function(){e=y().get(u.IMPRINT)};this.save=function(){e&&y().set(u.IMPRINT,e)}};function $(e,n,i,r){k.instance().setIdType(l().getIdType());k.instance().setIdTracking(l().getIdTracking());var o=l().getUserId();o&&e.analytics&&(e.analytics.active_user={puid:o,provider:l().getProvider()});var s=f.clone(k.instance().get());e.header=f.assign(s,e.header,{ts:Date.now(),testToken:V(),traceId:f.getRandomStr(10)+Date.now()+f.getRandomStr(9)});var c,p=function(e){return{h:L(e.header,U),a:M(e.analytics,R)}}(e),d=v(p);c=p;var h={url:u.ENDPOINT+u.LOG_URL,method:"POST",data:c,success:function(r){var o=r.code||r.status||r.statusCode;if(200===o||413===o){t().i("数据发送成功: ",e,d);!function(e){if(e){k.instance().setItem(u.IMPRINT,e);Z.set(e);Z.save();t().v("imprint: ",Z.getImpObj());Z.getItem("ttn_invalid")&&(x="")}}((r.data||{}).imprint);"function"==typeof n&&n(r)}else{t().w("数据发送失败: ",d);"function"==typeof i&&i()}},fail:function(e){t().w("超时: ",d);"function"==typeof i&&i()},complete:function(){"function"==typeof r&&r()}};a.request(f.assign(h,{header:{"Msg-Type":a.getSdkType()+"/json","disable-base64":"Y","content-type":"application/json"}}))}function ee(e){var t=e,n=[];this.enqueue=function(e){"number"==typeof t&&this.size()>=t&&this.dequeue();n.push(e)};this.dequeue=function(){return n.shift()};this.front=function(){return n[0]};this.isEmpty=function(){return 0===n.length};this.clear=function(){n.length=0};this.size=function(){return n.length};this.items=function(){return n};this.print=function(){console.log(n.toString())}}var te=function(){var e=null,n=!1,i=[],r=new ee(50);function o(e,t,n){if(k.instance().isLoaded()){t=t||{};var i=D(e);if(i){var s=k.instance().getRealtimeFields();i.header=f.assign({},i.header,s);i.noCache=t.noCache;r.enqueue(i)}"function"==typeof n&&n()}else setTimeout((function(){o(e,t,n)}),100)}function s(e){var t=r.front();if(t)$(t,(function(){r.dequeue();s(e)}),(function(){var t=r.dequeue();t&&!t.noCache&&i.push(t);s(e)}));else{!function(){i.forEach((function(e){r.enqueue(e)}));i.length=0}();e()}}function a(e){if(l().getId())if(n)t().i("队列正在发送中");else{n=!0;s((function(){n=!1;"function"==typeof e&&e()}))}else{t().i("获取id标识失败,暂缓发送");"function"==typeof e&&e()}}function c(){this.send=function(e,t,n){e?this.add(e,t,(function(){a(n)})):a(n)};this.add=function(e,t,n){o(e,t,n)};this.load=function(){var e=y().get(u.REQUESTS);e&&e.length&&e.forEach((function(e){r.enqueue(e)}));y().remove(u.REQUESTS)};this.save=function(){y().set(u.REQUESTS,f.clone(r.items()));r.clear()}}return function(){e||(e=new c);return e}}(),ne=function(){var e=null,i=null;function r(){this.setUserInfo=function(e){i=e};this.update=function(){e(i)||a.getUserInfo((function(t){e(t)}))};function e(e){if(e&&"object"==typeof e){var i=y().get(u.USER_INFO);i&&f.deepEqual(e,i)||function(e,i){var r=n().appKey(),o=a.getSdkType(),s=l().getId(),c=l().getIdType();if(!(r&&o&&s&&c))return;var f={ak:n().appKey(),sdt:a.getSdkType(),uin:e.nickName,uia:e.avatar||e.avatarUrl,uig:e.gender,uit:e.country,uip:e.province,uic:e.city,uil:e.language,id:l().getId(),it:l().getIdType(),age:e.age,cln:e.constellation},p=JSON.stringify(f);p=z(p);a.request({url:u.ENDPOINT+u.USERINFO_URL,method:"POST",header:{"content-type":"application/x-www-form-urlencoded"},data:"ui="+p,success:function(n){t().v("用户信息上传成功: ",e);i&&i(n&&n.data&&200===n.data.code)},fail:function(){t().e("用户信息上传失败: ",e);i&&i(!1)}})}(e,(function(t){t&&y().set(u.USER_INFO,e)}));return!0}return!1}}return function(){e||(e=new r);return e}}();function ie(e,t){this.id=e;this.ts=Date.now();var n=typeof t;if("string"===n&&t)this[e]=t;else if("object"===n)for(var i in t)({}).hasOwnProperty.call(t,i)&&(this[i]=t[i])}function re(){var e=!1,i=!1,r=0;this.init=function(i){t().v("sdk version: "+u.IMPL_VERSION);e?t().v("Lib重复实例化"):y().load((function(){t().v("cache初始化成功: ",y().getAll());!function(){l().setUseOpenid&&l().setUseOpenid(n().useOpenid());l().init((function(){k.instance().init();t().v("Header初始化成功")}))}();e=!0;"function"==typeof i&&i();t().tip("SDK集成成功")}))};this.resume=function(r){if(e&&!i){t().v("showOptions: ",r);var o;i=!0;n().enableVerify()&&r&&r.query&&(o=r.query._ttn,x=o||x);this._resume(r)}};this._resume=function(e){te().load();var i=b().resume(e),r=b().getCurrentSessionId();S().setSessionId(r);i&&te().add(A,{},(function(){l().setUseOpenid&&l().setUseOpenid(n().useOpenid());if(n().useOpenid()&&n().autoGetOpenid()&&!l().getId()){t().v("get id async");o(10,3e3)}else{t().v("session auto send");te().send()}}));function o(e,i){l().getId()||e<=0||l().getOpenIdAsync(n().appKey(),(function(n){if(n){t().v("获取id成功");te().send()}else{t().v("获取openid失败,启动重试,剩余可用次数",e-1);setTimeout((function(){o(e-1,i)}),i)}}))}};this.pause=function(o){if(e){i=!1;r=0;b().pause();n().uploadUserInfo()&&ne().update();te().send(N,{},(function(){te().save();y().save();t().v("cache save success");"function"==typeof o&&o()}))}};this.setOpenid=function(e){t().v("setOpenId: %s",e);l().setOpenid(e);te().send()};this.setUnionid=function(e){t().v("setUnionid: %s",e);l().setUnionid(e)};this.setUserid=function(e,n){t().v("setUserid: %s",e,n);l().setUserid(e,n)};this.removeUserid=function(){t().v("removeUserid");l().removeUserid()};this.setUserInfo=function(e){t().v("setUserInfo: %s",e);ne().setUserInfo(e)};this.setAnonymousid=function(e){t().v("setAnonymousId: %s",e);l().setAnonymousid(e);te().send()};this.setAppVersion=function(e){e&&"string"!=typeof e?t().w("setAppVersion方法只接受字符串类型参数"):k.instance().setAppVersion(e)};this.setAlipayUserid=function(e){if(e&&"string"!=typeof e)t().w("setAlipayUserid方法只接受字符串类型参数");else{t().v("setAlipayUserid: %s",e);l().setAlipayUserid(e)}};this.setDeviceId=function(e){if("string"==typeof e){l().setDeviceId(e);return e}};this.setSuperProperty=function(e){if(e&&"string"!=typeof e)t().w("超级属性只支持字符串类型");else{var n=this;if(k.instance().getSuperProperty()!==e){k.instance().setSuperProperty(e);n.pause((function(){n.resume()}))}}};this.trackEvent=function(n,i){if(e){t().v("event: ",n,i);if(function(e,n){if(!e||"string"!=typeof e){t().e('please check trackEvent id. id should be "string" and not null');return!1}var i=["id","ts","du"],r={};i.forEach((function(e){r[e]=1}));if(r[e]){t().e("eventId不能与以下保留字冲突: "+i.join(","));return!1}if(e.length>u.MAX_EVENTID_LENGTH){t().e("The maximum length of event id shall not exceed "+u.MAX_EVENTID_LENGTH);return!1}if(n&&("object"!=typeof n||Array.isArray(n))&&"string"!=typeof n){t().e("please check trackEvent properties. properties should be string or object(not include Array)");return!1}if("object"==typeof n){var o=0;for(var s in n)if({}.hasOwnProperty.call(n,s)){if(s.length>u.MAX_PROPERTY_KEY_LENGTH){t().e("The maximum length of property key shall not exceed "+u.MAX_PROPERTY_KEY_LENGTH);return!1}if(o>=u.MAX_PROPERTY_KEYS_COUNT){t().e("The maximum count of properties shall not exceed "+u.MAX_PROPERTY_KEYS_COUNT);return!1}if(r[s]){t().e("属性中的key不能与以下保留字冲突: "+i.join(","));return!1}o+=1}}return!0}(n,i)){var o=new ie(n,i);S().addEvent(o);var s=!!V(),a=s?0:u.EVENT_SEND_DEFAULT_INTERVAL,c=Date.now();if(function(e,t){return"number"!=typeof r||"number"!=typeof t||r<=0||e-r>t}(c,a)){r=c;te().send(T,{noCache:s},(function(){}))}}}};this.trackShare=function(n){if(e)try{if(a.getSdkType().indexOf("game")>-1){n=g().add(n,!0);t().v("shareQuery: ",n)}else{n=g().add(n,!1);t().v("sharePath: ",n.path)}}catch(e){t().v("shareAppMessage: ",e)}return n};this.trackPageStart=function(t){e&&d().addPageStart(t)};this.trackPageEnd=function(t){e&&d().addPageEnd(t)};this.onShareAppMessage=function(e){var t=this;a.onShareAppMessage((function(){return t.trackShare(e())}))};this.shareAppMessage=function(e){this.trackShare(e);a.shareAppMessage(e)}}var oe=[];function se(){}se.prototype={createMethod:function(e,n,i){try{e[n]=i&&i[n]?function(){return i[n].apply(i,arguments)}:function(){oe.push([n,[].slice.call(arguments)])}}catch(e){t().v("create method errror: ",e)}},installApi:function(e,n){try{var i,r,o="resume,pause,trackEvent,trackPageStart,trackPageEnd,trackShare,setUserid,setOpenid,setUnionid,onShareAppMessage,shareAppMessage".split(",");for(i=0,r=o.length;i<r;i++)this.createMethod(e,o[i],n);if(n)for(i=0,r=oe.length;i<r;i++){var s=oe[i];try{n[s[0]].apply(n,s[1])}catch(e){t().v("impl[v[0]].apply error: ",s[0],e)}}}catch(e){t().v("install api errror: ",e)}}};var ae=[u.ENDPOINT,u.ENDPOINTB];function ue(e,n){var i,r;0===e||1===e&&n?i=u.ENDPOINT:2===e&&n?i=u.ENDPOINTB:n&&(i=ae[e]);if(e>=ae.length||n){n&&(r=i,u.ENDPOINT=r);n&&t().v("命中可用服务",i);!n&&t().tip_w("未命中可用服务");return!1}a.request({url:u.ENDPOINT+"/uminiprogram_logs/ckdh",success:function(t){200===(t.code||t.status||t.statusCode)&&t.data&&200===t.data.code?ue(e+1,!0):ue(e+1,!1)},fail:function(){ue(e+1,!1)}})}var ce={init:function(e){u.ENDPOINTB&&setTimeout((function(){ue(0,!1)}),e)}},fe=new se,pe={_inited:!1,_log:t(),preinit:function(e){if(e&&"object"==typeof e)for(var t in e)u[t]=e[t];return u},use:function(e,t){e&&f.isFunction(e.install)?e.install(pe,t):f.isFunction(e)&&e(pe,t);return pe},messager:r,init:function(e){if(this._inited)t().v("已经实例过,请避免重复初始化");else if(e)if(e.appKey){"boolean"!=typeof e.useOpenid&&(e.useOpenid=!0);n().set(e);t().setDebug(e.debug);this._inited=!0;var i=this;r.emit(r.messageType.CONFIG_LOADED,e);try{var o=new re;t().v("成功创建Lib对象");0;o.init((function(){t().v("Lib对象初始化成功");fe.installApi(i,o);t().v("安装Lib接口成功");r.emit(r.messageType.UMA_LIB_INITED,e)}));ce.init(3e3)}catch(e){t().w("创建Lib对象异常: "+e)}}else t().err("请确保传入正确的appkey");else t().err("请正确设置相关信息!")}};try{fe.installApi(pe,null)}catch(e){t().w("uma赋值异常: ",e)}var le={FETCH_URL:"https://ucc.umeng.com/v1/mini/fetch",ABLOG_URL:"https://pslog.umeng.com/mini_ablog",SDK_VERSION:"2.8.2",MOBILE_NETWORK_NONE:"none",MOBILE_NETWORK_2G:"2g",MOBILE_NETWORK_3G:"3g",MOBILE_NETWORK_4G:"4g",MOBILE_NETWORK_5G:"5g",MOBILE_NETWORK_WIFI:"wifi",IMPRINT:"imprint"},de={},he=Array.isArray;de.isArray=he||function(e){return"[object Array]"===toString.call(e)};de.isObject=function(e){return e===Object(e)&&!de.isArray(e)};de.isEmptyObject=function(e){if(de.isObject(e)){for(var t in e)if(hasOwnProperty.call(e,t))return!1;return!0}return!1};de.isUndefined=function(e){return void 0===e};de.isString=function(e){return"[object String]"===toString.call(e)};de.isDate=function(e){return"[object Date]"===toString.call(e)};de.isNumber=function(e){return"[object Number]"===toString.call(e)};de.each=function(e,t,n){if(null!=e){var i={},r=Array.prototype.forEach;if(r&&e.forEach===r)e.forEach(t,n);else if(e.length===+e.length){for(var o=0,s=e.length;o<s;o++)if(o in e&&t.call(n,e[o],o,e)===i)return}else for(var a in e)if(hasOwnProperty.call(e,a)&&t.call(n,e[a],a,e)===i)return}};de.buildQuery=function(e,t){var n,i,r=[];void 0===t&&(t="&");de.each(e,(function(e,t){n=encodeURIComponent(e.toString());i=encodeURIComponent(t);r[r.length]=i+"="+n}));return r.join(t)};de.JSONDecode=function(e){if(e){try{return JSON.parse(e)}catch(e){console.error("JSONDecode error",e)}return null}};de.JSONEncode=function(e){try{return JSON.stringify(e)}catch(e){console.error("JSONEncode error",e)}};var ge=Object.create(null);function ve(e){t().v("开始构建 fetch body");a.getSystemInfo((function(t){a.getNetworkInfo((function(i){var r=(i=i||{}).networkType;r=r===le.MOBILE_NETWORK_NONE?"unknown":r.toUpperCase();ge.access=r;!function(e,t){var i=e.brand||"";ge.deviceType="Phone";ge.sdkVersion=le.SDK_VERSION;ge.appkey=n().appKey();ge.sdkType=a.getSdkType();ge.umid=l().getId();if(e){ge.language=e.language||"";ge.os=e.OS;ge.osVersion=e.OSVersion;ge.deviceName=e.deviceName;ge.platformVersion=e.platformVersion;ge.platformSdkVersion=e.platformSDKVersion;ge.deviceBrand=i;var r=e.resolution.split("*");if(de.isArray(r)){ge.resolutionHeight=Number(r[0]);ge.resolutionWidth=Number(r[1])}}!function(e){if(e){ge.installTime=e.install_datetime&&Date.parse(e.install_datetime);ge.scene=e.install_scene;ge.channel=e.install_channel;ge.campaign=e.install_campaign}}(Z.getImpObj());t&&t(ge)}(t,e)}))}))}var _e=Object.create(null),ye=null,me=!1,Se={minFetchIntervalSeconds:43200};function Ie(e){e&&de.each(e,(function(e){_e[e.k]=e}))}function Ee(){var e=this;this.STORAGE_NAME=null;r.once(r.messageType.CONFIG_LOADED,(function(n){t().v("云配初始化开始...");e.init(n)}))}Ee.prototype={setDefaultValues:function(e){me&&de.isObject(e)&&de.each(e,(function(e,t){_e[t]&&_e[t].v||(_e[t]={v:e})}))},getValue:function(e){t().v("从配置项中读取 value, 当前配置为: ",_e);t().v("待读取的 key : ",e);try{if(!me)return;var i=_e[e]||{};t().v("读取相应配置ing..., 结果为: ",i);if(de.isNumber(i.e)&&de.isNumber(i.g)){t().v("读取到相应配置, 开始数据上报...");!function(e){var i={appkey:n().appKey(),sdkType:a.getSdkType(),expId:e&&e.e,groupId:e&&e.g,clientTs:Date.now(),key:e&&e.k,value:e&&e.v,umid:l().getId()};try{a.request({url:le.ABLOG_URL,method:"POST",data:[i],success:function(e){e&&200===e.statusCode?t().v("上传数据成功",i):t().w("ablog 请求成功, 返回结果异常 ",e)},fail:function(e){t().w("ablog 请求数据错误 ",i,e)}})}catch(e){t().w("urequest 调用错误",e)}}(i)}return i.v}catch(n){t().w("getValue error, key: ",e)}},active:function(e){try{if(!me)return;var n,i;e&&e.params&&(n=e.params);e&&e.callback&&(i=e.callback);t().v("激活配置项: ",n);if(n){t().v("本地已缓存的配置项: ",_e);Ie(n);t().v("合并后的配置项: ",_e);i&&i(_e);t().v("active 结束")}else{t().v("配置项为空!! 读取本地配置...");a.getStorage(this.STORAGE_NAME,(function(e){if(e){Ie((e=de.JSONDecode(e)||{}).params);t().v("当前本地配置项为: ",_e);i&&i(_e);t().v("active 结束")}else t().v("当前本地配置项为空, 退出激活")}))}}catch(e){t().w("SDK active 错误",e)}},init:function(e){if(e.appKey){ye=e.appKey;this.STORAGE_NAME="um_remote_config_{{"+ye+"}}"}if(ye)if(me)t().w("SDK 已经初始化, 请避免重复初始化");else{me=!0;this.setOptions(e);this.active()}else t().err("请检查您的小程序 appKey, appKey 不能为空")},setOptions:function(e){if(de.isObject(e)){var t=e.minFetchIntervalSeconds;de.isNumber(t)&&(Se.minFetchIntervalSeconds=Math.max(t,5))}},fetch:function(e){if(me&&this.STORAGE_NAME){var n,i;e&&e.active&&(n=e.active);e&&e.callback&&(i=e.callback);var r=this;a.getStorage(this.STORAGE_NAME,(function(e){t().v("开始读缓存 data is ",e);if((e=de.JSONDecode(e)||{}).params&&e.ts&&Date.now()-e.ts<1e3*Se.minFetchIntervalSeconds){t().v("缓存数据存在, 并且本次触发时间距离上次fetch触发时间未超过 fetch 时间间隔, 无需 fetch");i&&i(e.params)}else ve((function(e){t().v("缓存数据不存在, 构建 fetch body :",e);try{a.request({url:le.FETCH_URL,method:"POST",data:e,success:function(e){if(e&&200===e.statusCode&&e.data&&e.data.cc){t().v("fetch 请求成功, 响应数据: ",e.data);var o=Object.create(null);de.each(e.data.cc,(function(e){o[e.k]=e}));var s={ts:Date.now(),params:o};t().v("开始缓存 fetch 请求的云配置结果...");a.setStorage(r.STORAGE_NAME,de.JSONEncode(s),(function(e){t().v("缓存云配置成功, 缓存数据为: ",s);t().v("缓存云配置成功, 成功消息为: ",e);t().v("云配拉取数据是否自动激活: ",n);if(e&&n){t().v("激活云配置...");r.active({params:o,callback:i})}}))}else{t().w("fetch 请求成功,返回结果异常 ",e.data);i&&i()}},fail:function(n){t().w("fetch请求数据错误 ",e,n);i&&i()}})}catch(e){t().w("urequest调用错误",e)}}))}))}}};var Oe={install:function(e,t){e.rc||(e.rc=new Ee);e.messager.once(e.messager.messageType.CONFIG_LOADED,(function(){e._log.v("plugin rc installed")}));return e.rc}},Ae=".",Ne="_um",Te="revenue",we="stage",ke="level",be="running",De="end",Re="init",Ue="set",Pe=[Ne,we,"start"].join(Ae);function Le(e){var t={};for(var n in e){var i=e[n];if("object"==typeof i)for(var r in i)t[n+Ae+r]=i[r];else t[n]=i}return t}var Ce={install:function(e,t){e.revenue=function(t){e.trackEvent([Ne,Te,t.group].join(Ae),Le(t))};var n=0;e.stage={onStart:function(t){n=Date.now();e.trackEvent(Pe,Le(t))},onEnd:function(t){"number"!=typeof t._um_sdu&&(t._um_sdu=0!==n?Date.now()-n:0);e.trackEvent([Ne,we,De,t.event].join(Ae),Le(t))},onRunning:function(t){e.trackEvent([Ne,we,be,t.event].join(Ae),Le(t))}};e.level={onInitLevel:function(t){e.trackEvent([Ne,ke,Re].join(Ae),Le(t))},onSetLevel:function(t){e.trackEvent([Ne,ke,Ue].join(Ae),Le(t))}};e.messager.once(e.messager.messageType.CONFIG_LOADED,(function(){e._log.v("plugin game-ext installed")}));return e}};(typeof wx!=="undefined")&&wx.onShow((function(e){t().v("game onShow: ",e);n=e.query,h=n;var n;pe.resume(e,!0)}));(typeof wx!=="undefined")&&wx.onHide((function(){t().v("game onHide");pe.pause()}));var Me=pe.init;pe.init=function(e){if(e&&e.useOpenid){t().tip_w(t().repeat("!"));t().tip_w("您选择了使用openid进行统计,请确保使用setOpenid回传openid或通过设置autoGetOpenid为true,并在友盟后台设置secret由友盟帮您获取");t().tip_w(t().repeat("!"))}Me.call(pe,e)};pe.use(Oe);pe.use(Ce);(typeof wx!=="undefined")&&(wx.uma=pe)
16
+
17
+ // ============================================
18
+ // TypeScript 类型声明
19
+ // ============================================
20
+
21
+ /**
22
+ * 友盟初始化配置(官网接口)
23
+ */
24
+ export interface UmaInitConfig {
25
+ /** 应用 appKey(必填) */
26
+ appKey: string;
27
+ /** 是否使用 openid 统计,默认 true */
28
+ useOpenid?: boolean;
29
+ /** 是否自动获取 openid,需在友盟后台配置 secret */
30
+ autoGetOpenid?: boolean;
31
+ /** 是否开启调试模式 */
32
+ debug?: boolean;
33
+ }
34
+
35
+ /**
36
+ * 用户信息
37
+ */
38
+ export interface UmaUserInfo {
39
+ nickName?: string;
40
+ avatarUrl?: string;
41
+ gender?: number;
42
+ country?: string;
43
+ province?: string;
44
+ city?: string;
45
+ language?: string;
46
+ age?: number;
47
+ constellation?: string;
48
+ }
49
+
50
+ /**
51
+ * 友盟 SDK 接口定义
52
+ */
53
+ export interface UmaSDK {
54
+ /** 初始化 */
55
+ init(config: UmaInitConfig): void;
56
+ /** 恢复会话(onShow 时调用) */
57
+ resume(options?: any): void;
58
+ /** 暂停会话(onHide 时调用) */
59
+ pause(): void;
60
+ /** 上报自定义事件 */
61
+ trackEvent(eventName: string, params?: object | string): void;
62
+ /** 上报分享 */
63
+ trackShare(shareOptions: object): object;
64
+ /** 页面开始 */
65
+ trackPageStart(pageName: string): void;
66
+ /** 页面结束 */
67
+ trackPageEnd(pageName: string): void;
68
+ /** 设置 openid */
69
+ setOpenid(openid: string): void;
70
+ /** 设置 unionid */
71
+ setUnionid(unionid: string): void;
72
+ /** 设置用户 ID */
73
+ setUserid(userid: string, provider?: string): void;
74
+ /** 移除用户 ID */
75
+ removeUserid(): void;
76
+ /** 设置用户信息 */
77
+ setUserInfo(userInfo: UmaUserInfo): void;
78
+ /** 设置匿名 ID */
79
+ setAnonymousid(anonymousid: string): void;
80
+ /** 设置应用版本 */
81
+ setAppVersion(version: string): void;
82
+ /** 设置超级属性 */
83
+ setSuperProperty(property: string): void;
84
+ /** 注册分享回调 */
85
+ onShareAppMessage(callback: () => object): void;
86
+ /** 调用分享 */
87
+ shareAppMessage(options: object): void;
88
+ /** 收入事件 */
89
+ revenue?: (params: { group: string; [key: string]: any }) => void;
90
+ /** 关卡事件 */
91
+ stage?: {
92
+ onStart: (params: { [key: string]: any }) => void;
93
+ onEnd: (params: { event: string; [key: string]: any }) => void;
94
+ onRunning: (params: { event: string; [key: string]: any }) => void;
95
+ };
96
+ /** 等级事件 */
97
+ level?: {
98
+ onInitLevel: (params: { [key: string]: any }) => void;
99
+ onSetLevel: (params: { [key: string]: any }) => void;
100
+ };
101
+ }
102
+
103
+ // ============================================
104
+ // 导出
105
+ // ============================================
106
+
107
+ export const uma: UmaSDK = pe as any;
package/src/index.ts CHANGED
@@ -20,6 +20,7 @@ export { PrivacyMgr } from './Framework/Manager/PrivacyMgr';
20
20
  export { LifeCycleMgr } from './Framework/Manager/LifeCycleMgr';
21
21
  export { BaseMgr } from './Framework/Manager/BaseMgr';
22
22
  export { NodePoolMgr } from './Framework/Manager/NodePoolMgr';
23
+ export { AnalyticsMgr } from './Framework/Manager/AnalyticsMgr';
23
24
 
24
25
  // Utils 模块
25
26
  export { LogUtils } from './Framework/Utils/LogUtils';
@@ -55,3 +56,4 @@ export * from './Framework/Definition/UIDefinition';
55
56
  export * from './Framework/Definition/EventDefinition';
56
57
  export * from './Framework/Definition/TimerDefinition';
57
58
  export * from './Framework/Definition/FrameworkBase';
59
+ export * from './Framework/Definition/AnalyticsDefinition';