gio-miniprogram-sdk 4.4.2 → 4.4.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/dist/alipay.js +1 -1
- package/dist/baidu.js +1 -1
- package/dist/bytedance.js +1 -1
- package/dist/jingdong.js +1 -1
- package/dist/kuaishou.js +1 -1
- package/dist/plugins/gioABTest.js +1 -1
- package/dist/plugins/gioCompress.js +1 -1
- package/dist/plugins/gioEventAutoTracking.js +1 -1
- package/dist/plugins/gioImpressionTracking.js +1 -1
- package/dist/plugins/gioMultipleInstances.js +1 -1
- package/dist/plugins/gioPerformance.js +1 -1
- package/dist/qq.js +1 -1
- package/dist/quickapp.js +1 -1
- package/dist/taobao.js +1 -1
- package/dist/taro.js +1 -1
- package/dist/uniapp.js +1 -1
- package/dist/wechat.js +1 -1
- package/dist/xiaohongshu.js +1 -1
- package/package.json +7 -1
- package/.eslintignore +0 -11
- package/.eslintrc.js +0 -120
- package/.github/workflows/greetings.yml +0 -13
- package/.github/workflows/publish.yml +0 -45
- package/.prettierignore +0 -19
- package/.prettierrc.js +0 -9
- package/babel.config.js +0 -6
- package/rollup.config.js +0 -100
- package/rollup.plugins.config.js +0 -84
- package/src/adapters/gioTaobaoAdapter.ts +0 -202
- package/src/adapters/gioTaroAdapter.ts +0 -467
- package/src/adapters/gioUniAppAdapter.ts +0 -431
- package/src/constants/config.ts +0 -170
- package/src/constants/emitMsg.ts +0 -24
- package/src/constants/regex.ts +0 -18
- package/src/core/dataStore/eventContextBuilder.ts +0 -95
- package/src/core/dataStore/eventHooks/appEffects.ts +0 -218
- package/src/core/dataStore/eventHooks/index.ts +0 -468
- package/src/core/dataStore/eventHooks/minipPage.ts +0 -221
- package/src/core/dataStore/eventHooks/pageEffects.ts +0 -189
- package/src/core/dataStore/index.ts +0 -661
- package/src/core/growingIO.ts +0 -637
- package/src/core/pluginsInstance/base.ts +0 -157
- package/src/core/pluginsInstance/taro.ts +0 -15
- package/src/core/pluginsInstance/tb.ts +0 -15
- package/src/core/pluginsInstance/uniapp.ts +0 -15
- package/src/core/uploader.ts +0 -272
- package/src/core/userStore.ts +0 -267
- package/src/index.ts +0 -77
- package/src/minipInstance/base.ts +0 -352
- package/src/minipInstance/framework.ts +0 -24
- package/src/minipInstance/jd.ts +0 -11
- package/src/minipInstance/ks.ts +0 -12
- package/src/minipInstance/my.ts +0 -131
- package/src/minipInstance/qq.ts +0 -12
- package/src/minipInstance/quickapp.ts +0 -233
- package/src/minipInstance/swan.ts +0 -20
- package/src/minipInstance/tb.ts +0 -58
- package/src/minipInstance/tt.ts +0 -12
- package/src/minipInstance/wx.ts +0 -27
- package/src/minipInstance/xhs.ts +0 -20
- package/src/platformConfig/base.ts +0 -82
- package/src/platformConfig/framework.ts +0 -31
- package/src/platformConfig/jd.ts +0 -11
- package/src/platformConfig/ks.ts +0 -11
- package/src/platformConfig/my.ts +0 -16
- package/src/platformConfig/qq.ts +0 -13
- package/src/platformConfig/quickapp.ts +0 -48
- package/src/platformConfig/swan.ts +0 -11
- package/src/platformConfig/tb.ts +0 -29
- package/src/platformConfig/tt.ts +0 -11
- package/src/platformConfig/wx.ts +0 -20
- package/src/platformConfig/xhs.ts +0 -27
- package/src/plugins/gioABTest.ts +0 -348
- package/src/plugins/gioCompress.ts +0 -253
- package/src/plugins/gioEventAutoTracking.ts +0 -310
- package/src/plugins/gioImpressionTracking.ts +0 -386
- package/src/plugins/gioMultipleInstances.ts +0 -189
- package/src/plugins/gioPerformance/exception.ts +0 -152
- package/src/plugins/gioPerformance/monitor.ts +0 -284
- package/src/plugins/gioPerformance/network.ts +0 -197
- package/src/plugins/gioPerformance.ts +0 -131
- package/src/types/base.ts +0 -167
- package/src/types/dataStore.ts +0 -62
- package/src/types/eventHooks.ts +0 -146
- package/src/types/gioCustomTracking.ts +0 -9
- package/src/types/gioEventTracking.ts +0 -10
- package/src/types/gioPerformance.ts +0 -8
- package/src/types/growingIO.ts +0 -137
- package/src/types/minipInstance.ts +0 -133
- package/src/types/platforms.ts +0 -64
- package/src/types/plugins.ts +0 -24
- package/src/types/uploader.ts +0 -30
- package/src/types/userStore.ts +0 -28
- package/src/utils/glodash.ts +0 -430
- package/src/utils/tools.ts +0 -511
- package/src/utils/verifiers.ts +0 -52
- package/tsconfig.json +0 -32
- package/typings/global.d.ts +0 -105
package/src/core/userStore.ts
DELETED
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
import { batchGetStorageSync, batchSetStorageSync, guid } from '@@/utils/tools';
|
|
2
|
-
import { GrowingIOType } from '@@/types/growingIO';
|
|
3
|
-
import { isNil } from '@@/utils/glodash';
|
|
4
|
-
import { StringObject } from '@@/types/base';
|
|
5
|
-
import { UserStoreType } from '@@/types/userStore';
|
|
6
|
-
import EMIT_MSG from '@@/constants/emitMsg';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* 代码中与3.0测量协议字段对应关系
|
|
10
|
-
* 代码定义 | 3.0测量协议定义 | 字段解释
|
|
11
|
-
* ---------------------------------------------------
|
|
12
|
-
* sessionId | sessionId | 访问会话id
|
|
13
|
-
* uid | deviceId | 访问用户id(持久化)
|
|
14
|
-
* userId | userId | 登录用户id(持久化)
|
|
15
|
-
* gioId | gioId | 上一个非空的登录用户id(持久化)
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
class UserStore implements UserStoreType {
|
|
19
|
-
// 访问用户id/设备id(系统设置持久性存储)
|
|
20
|
-
public _uid: string;
|
|
21
|
-
// 用户访问会话id
|
|
22
|
-
public _sessionId: StringObject;
|
|
23
|
-
// 登录用户id(客户设置持久性存储)
|
|
24
|
-
public _userId: StringObject;
|
|
25
|
-
// 登录用户key(客户设置持久性存储)
|
|
26
|
-
public _userKey: StringObject;
|
|
27
|
-
// 最后一次登录用户id(持久性存储)
|
|
28
|
-
public _gioId: StringObject;
|
|
29
|
-
// 设置了session有效期以后判断用的session失效时间
|
|
30
|
-
public _sessionExpires: number;
|
|
31
|
-
constructor(public growingIO: GrowingIOType) {
|
|
32
|
-
this._uid = undefined;
|
|
33
|
-
this._sessionId = {};
|
|
34
|
-
this._userId = {};
|
|
35
|
-
this._userKey = {};
|
|
36
|
-
this._gioId = {};
|
|
37
|
-
this._sessionExpires = -1;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// 获取sessionId存储key
|
|
41
|
-
_getUidKey = () =>
|
|
42
|
-
this.growingIO.inPlugin ? '_growing_plugin_uid_' : '_growing_uid_';
|
|
43
|
-
|
|
44
|
-
// 获取设备Id
|
|
45
|
-
getUid = () => {
|
|
46
|
-
const { minipInstance } = this.growingIO;
|
|
47
|
-
// 内存中拿不到尝试从存储中拿
|
|
48
|
-
if (!this._uid) {
|
|
49
|
-
this._uid = minipInstance.getStorageSync(this._getUidKey());
|
|
50
|
-
}
|
|
51
|
-
// 存储中拿不到尝试设新值
|
|
52
|
-
if (!this._uid) {
|
|
53
|
-
this.setUid(guid());
|
|
54
|
-
}
|
|
55
|
-
return this._uid;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
// 设置设备Id
|
|
59
|
-
setUid = (id: string) => {
|
|
60
|
-
const prevId = this._uid;
|
|
61
|
-
this._uid = id;
|
|
62
|
-
if (prevId !== this._uid) {
|
|
63
|
-
this.growingIO.minipInstance.setStorage(this._getUidKey(), this._uid);
|
|
64
|
-
// 广播通知访问用户Id变更
|
|
65
|
-
this.growingIO.emitter.emit(EMIT_MSG.UID_UPDATE, {
|
|
66
|
-
newUId: id,
|
|
67
|
-
oldUId: prevId
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
// 获取sessionId
|
|
73
|
-
getSessionId = (trackingId: string) => {
|
|
74
|
-
// 设置了session时长,就需要检查session是否过期
|
|
75
|
-
const {
|
|
76
|
-
vdsConfig: { sessionExpires },
|
|
77
|
-
dataStore: { trackersExecute }
|
|
78
|
-
} = this.growingIO;
|
|
79
|
-
// 不存在sessionId(即新进)要设一个新的sessionId
|
|
80
|
-
if (!this._sessionId[trackingId]) {
|
|
81
|
-
this.setSessionId(trackingId);
|
|
82
|
-
}
|
|
83
|
-
// 设置了session时长且过期
|
|
84
|
-
if (sessionExpires > -1) {
|
|
85
|
-
// 只要有一个session超时,所有实例都要重设sessionId
|
|
86
|
-
if (Date.now() > this._sessionExpires) {
|
|
87
|
-
trackersExecute((id: string) => {
|
|
88
|
-
this.setSessionId(id);
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
// 每次获取session后要更新过期时间
|
|
92
|
-
this._sessionExpires = Date.now() + 1000 * 60 * sessionExpires;
|
|
93
|
-
}
|
|
94
|
-
return this._sessionId[trackingId];
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
// 设置sessionId
|
|
98
|
-
setSessionId = (trackingId: string, id?: string) => {
|
|
99
|
-
const prevId = this._sessionId[trackingId];
|
|
100
|
-
if (!id) {
|
|
101
|
-
id = guid();
|
|
102
|
-
}
|
|
103
|
-
// 小程序中sessionId只需要在内存中存储就可以,不需要持久化存储
|
|
104
|
-
this._sessionId[trackingId] = id;
|
|
105
|
-
// 设置了session时长,就需要更新过期时间
|
|
106
|
-
const { sessionExpires } = this.growingIO.vdsConfig;
|
|
107
|
-
if (sessionExpires > -1) {
|
|
108
|
-
this._sessionExpires = Date.now() + 1000 * 60 * sessionExpires;
|
|
109
|
-
}
|
|
110
|
-
// 广播通知登录sessionId变更
|
|
111
|
-
if (prevId !== id) {
|
|
112
|
-
this.growingIO.emitter.emit(EMIT_MSG.SESSIONID_UPDATE, {
|
|
113
|
-
trackingId,
|
|
114
|
-
newSessionId: id,
|
|
115
|
-
oldSessionId: prevId
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
// 获取userId存储key
|
|
121
|
-
_getUserIdKey = (trackingId: string) =>
|
|
122
|
-
this.growingIO.dataStore.getStorageKey(trackingId, 'userId');
|
|
123
|
-
|
|
124
|
-
// 获取userId
|
|
125
|
-
getUserId = (trackingId: string) => {
|
|
126
|
-
const { minipInstance } = this.growingIO;
|
|
127
|
-
// 内存中拿不到尝试从存储中拿
|
|
128
|
-
if (!this._userId[trackingId]) {
|
|
129
|
-
this._userId[trackingId] = minipInstance.getStorageSync(
|
|
130
|
-
this._getUserIdKey(trackingId)
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
return this._userId[trackingId];
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
// 设置userId
|
|
137
|
-
setUserId = (trackingId: string, id: string) => {
|
|
138
|
-
const prevId = this._userId[trackingId];
|
|
139
|
-
this._userId[trackingId] = isNil(id) ? '' : id;
|
|
140
|
-
if (prevId !== this._userId[trackingId]) {
|
|
141
|
-
this.growingIO.minipInstance.setStorage(
|
|
142
|
-
this._getUserIdKey(trackingId),
|
|
143
|
-
this._userId[trackingId]
|
|
144
|
-
);
|
|
145
|
-
// 广播通知登录用户Id变更
|
|
146
|
-
this.growingIO.emitter.emit(EMIT_MSG.USERID_UPDATE, {
|
|
147
|
-
newUserId: id,
|
|
148
|
-
oldUserId: prevId
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
if (id) this.setGioId(trackingId, id);
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
// 获取userKey存储key
|
|
155
|
-
_getUserKeyKey = (trackingId: string) =>
|
|
156
|
-
this.growingIO.dataStore.getStorageKey(trackingId, 'userKey');
|
|
157
|
-
|
|
158
|
-
// 获取userKey
|
|
159
|
-
getUserKey = (trackingId: string) => {
|
|
160
|
-
const { minipInstance } = this.growingIO;
|
|
161
|
-
// 内存中拿不到尝试从存储中拿
|
|
162
|
-
if (!this._userKey[trackingId]) {
|
|
163
|
-
this._userKey[trackingId] = minipInstance.getStorageSync(
|
|
164
|
-
this._getUserKeyKey(trackingId)
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
return this._userKey[trackingId];
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
// 设置userKey
|
|
171
|
-
setUserKey = (trackingId: string, key: string) => {
|
|
172
|
-
const prevKey = this._userKey[trackingId];
|
|
173
|
-
this._userKey[trackingId] = isNil(key) ? '' : key;
|
|
174
|
-
if (prevKey !== this._userKey[trackingId]) {
|
|
175
|
-
this.growingIO.minipInstance.setStorage(
|
|
176
|
-
this._getUserKeyKey(trackingId),
|
|
177
|
-
this._userKey[trackingId]
|
|
178
|
-
);
|
|
179
|
-
// 广播通知登录用户key变更
|
|
180
|
-
this.growingIO.emitter.emit(EMIT_MSG.USERKEY_UPDATE, {
|
|
181
|
-
newUserKey: key,
|
|
182
|
-
oldUserKey: prevKey
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
// 获取gioId存储key
|
|
188
|
-
_getGioIdKey = (trackingId: string) =>
|
|
189
|
-
this.growingIO.dataStore.getStorageKey(trackingId, 'gioId');
|
|
190
|
-
|
|
191
|
-
// 获取gioId
|
|
192
|
-
getGioId = (trackingId: string) => {
|
|
193
|
-
const { minipInstance } = this.growingIO;
|
|
194
|
-
// 内存中拿不到尝试从存储中拿
|
|
195
|
-
if (!this._gioId[trackingId]) {
|
|
196
|
-
this._gioId[trackingId] = minipInstance.getStorageSync(
|
|
197
|
-
this._getGioIdKey(trackingId)
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
return this._gioId[trackingId];
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
// 设置gioId
|
|
204
|
-
setGioId = (trackingId: string, gioId: string) => {
|
|
205
|
-
const prevId = this._gioId[trackingId];
|
|
206
|
-
this._gioId[trackingId] = isNil(gioId) ? '' : gioId;
|
|
207
|
-
if (prevId !== this._gioId[trackingId]) {
|
|
208
|
-
this.growingIO.minipInstance.setStorage(
|
|
209
|
-
this._getGioIdKey(trackingId),
|
|
210
|
-
this._gioId[trackingId]
|
|
211
|
-
);
|
|
212
|
-
// 广播通知登录用户Id变更
|
|
213
|
-
this.growingIO.emitter.emit(EMIT_MSG.GIOID_UPDATE, {
|
|
214
|
-
newGioId: gioId,
|
|
215
|
-
oldGioId: prevId
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
// 初始化用户信息
|
|
221
|
-
initUserInfo = (trackingId: string) => {
|
|
222
|
-
const { minipInstance } = this.growingIO;
|
|
223
|
-
const storeKeys = [
|
|
224
|
-
this._getUidKey(),
|
|
225
|
-
this._getUserIdKey(trackingId),
|
|
226
|
-
this._getUserKeyKey(trackingId),
|
|
227
|
-
this._getGioIdKey(trackingId)
|
|
228
|
-
];
|
|
229
|
-
const memoryKeys = ['_uid', '_userId', '_userKey', '_gioId'];
|
|
230
|
-
// 批量获取的存储数据
|
|
231
|
-
const values = batchGetStorageSync(minipInstance, storeKeys) ?? [];
|
|
232
|
-
// 往存储中重设的key
|
|
233
|
-
memoryKeys.forEach((key: string, index: number) => {
|
|
234
|
-
if (key === '_uid') {
|
|
235
|
-
// 调用一次往内存里存一份
|
|
236
|
-
this.getUid();
|
|
237
|
-
} else {
|
|
238
|
-
// 往内存中赋值
|
|
239
|
-
this[key][trackingId] = values[index];
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
// 退出小程序时在存储中同步用户信息
|
|
245
|
-
saveUserInfo = () => {
|
|
246
|
-
const {
|
|
247
|
-
minipInstance,
|
|
248
|
-
dataStore: { trackersExecute }
|
|
249
|
-
} = this.growingIO;
|
|
250
|
-
trackersExecute((trackingId: string) => {
|
|
251
|
-
batchSetStorageSync(minipInstance, [
|
|
252
|
-
{ key: this._getUidKey(), value: this._uid },
|
|
253
|
-
{
|
|
254
|
-
key: this._getUserIdKey(trackingId),
|
|
255
|
-
value: this._userId[trackingId]
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
key: this._getUserKeyKey(trackingId),
|
|
259
|
-
value: this._userKey[trackingId]
|
|
260
|
-
},
|
|
261
|
-
{ key: this._getGioIdKey(trackingId), value: this._gioId[trackingId] }
|
|
262
|
-
]);
|
|
263
|
-
});
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
export default UserStore;
|
package/src/index.ts
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { initialCheck } from '@@/utils/verifiers';
|
|
2
|
-
import { consoleText, getGlobal, niceTry } from '@@/utils/tools';
|
|
3
|
-
import { drop, isString, toString } from '@@/utils/glodash';
|
|
4
|
-
import {
|
|
5
|
-
HANDLERS,
|
|
6
|
-
DEPRECATED_HANDLERS,
|
|
7
|
-
INSTANCE_HANDLERS
|
|
8
|
-
} from '@@/constants/config';
|
|
9
|
-
import GrowingIO from './core/growingIO';
|
|
10
|
-
|
|
11
|
-
const gioInstance: any = new GrowingIO();
|
|
12
|
-
|
|
13
|
-
const gdp = function () {
|
|
14
|
-
const handlerName = arguments[0];
|
|
15
|
-
let trackingId = 'g0';
|
|
16
|
-
let handler = handlerName;
|
|
17
|
-
if (handlerName.indexOf('.') > -1) {
|
|
18
|
-
trackingId = handlerName.split('.')[0] ?? 'g0'; // 没有指定trackingId,默认为g0
|
|
19
|
-
handler = handlerName.split('.')[1];
|
|
20
|
-
}
|
|
21
|
-
// 判断指令为字符串且配置项中允许调用且实例中存在的方法
|
|
22
|
-
if (isString(handler) && HANDLERS.includes(handler) && gioInstance[handler]) {
|
|
23
|
-
const args = drop(Array.from(arguments));
|
|
24
|
-
// 初始化方法单独处理
|
|
25
|
-
if (handler === 'init') {
|
|
26
|
-
const initialCheckRes: any = initialCheck(gioInstance, args);
|
|
27
|
-
if (initialCheckRes) {
|
|
28
|
-
const { projectId, dataSourceId, appId, userOptions } = initialCheckRes;
|
|
29
|
-
// 返回初始化结果
|
|
30
|
-
return gioInstance.init({
|
|
31
|
-
...userOptions,
|
|
32
|
-
projectId,
|
|
33
|
-
dataSourceId,
|
|
34
|
-
appId,
|
|
35
|
-
trackingId
|
|
36
|
-
});
|
|
37
|
-
} else {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
} else if (handler === 'registerPlugins') {
|
|
41
|
-
gioInstance.registerPlugins(args[0]);
|
|
42
|
-
} else if (gioInstance.gioSDKInitialized && gioInstance.vdsConfig) {
|
|
43
|
-
if (INSTANCE_HANDLERS.includes(handler)) {
|
|
44
|
-
return niceTry(() =>
|
|
45
|
-
gioInstance.handlerDistribute(trackingId, handler, args)
|
|
46
|
-
);
|
|
47
|
-
} else {
|
|
48
|
-
return niceTry(() => gioInstance[handler](...args));
|
|
49
|
-
}
|
|
50
|
-
} else {
|
|
51
|
-
consoleText('SDK未初始化!', 'error');
|
|
52
|
-
}
|
|
53
|
-
} else if (DEPRECATED_HANDLERS.includes(handler)) {
|
|
54
|
-
consoleText(`方法 ${toString(handler)} 已被弃用,请移除!`, 'warn');
|
|
55
|
-
} else if (handler === 'canIUse') {
|
|
56
|
-
return HANDLERS.includes(arguments[1]) && !!gioInstance[arguments[1]];
|
|
57
|
-
} else {
|
|
58
|
-
consoleText(`不存在名为 ${toString(handler)} 的方法调用!`, 'error');
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
getGlobal().gdp = gdp;
|
|
63
|
-
getGlobal().gioSDKVersion = gioInstance.sdkVersion;
|
|
64
|
-
|
|
65
|
-
const {
|
|
66
|
-
growingApp,
|
|
67
|
-
growingPage,
|
|
68
|
-
growingComponent,
|
|
69
|
-
growingBehavior,
|
|
70
|
-
initOriginalValue
|
|
71
|
-
} = gioInstance.dataStore.eventHooks;
|
|
72
|
-
initOriginalValue();
|
|
73
|
-
export const GioApp = niceTry(() => growingApp ?? App);
|
|
74
|
-
export const GioPage = niceTry(() => growingPage ?? Page);
|
|
75
|
-
export const GioComponent = niceTry(() => growingComponent ?? Component);
|
|
76
|
-
export const GioBehavior = niceTry(() => growingBehavior ?? Behavior);
|
|
77
|
-
export default gdp;
|
|
@@ -1,352 +0,0 @@
|
|
|
1
|
-
import { GrowingIOType } from '@@/types/growingIO';
|
|
2
|
-
import {
|
|
3
|
-
AppSource,
|
|
4
|
-
Location,
|
|
5
|
-
MinipInstanceType,
|
|
6
|
-
NavigateToMiniProgramOption,
|
|
7
|
-
SystemInfo
|
|
8
|
-
} from '@@/types/minipInstance';
|
|
9
|
-
import { PLATFORMS } from '@@/types/platforms';
|
|
10
|
-
import {
|
|
11
|
-
isFunction,
|
|
12
|
-
isObject,
|
|
13
|
-
isString,
|
|
14
|
-
last,
|
|
15
|
-
typeOf,
|
|
16
|
-
isEmpty,
|
|
17
|
-
isArray
|
|
18
|
-
} from '@@/utils/glodash';
|
|
19
|
-
import EMIT_MSG from '@@/constants/emitMsg';
|
|
20
|
-
import {
|
|
21
|
-
limitString,
|
|
22
|
-
niceTry,
|
|
23
|
-
getPlainMinip,
|
|
24
|
-
getPlainPlatform,
|
|
25
|
-
getPlainConfig,
|
|
26
|
-
getPlainAppCode
|
|
27
|
-
} from '@@/utils/tools';
|
|
28
|
-
|
|
29
|
-
// 此基础实现类仅包含所有小程序,快应用所有方法全部单独实现
|
|
30
|
-
class BaseInstance implements MinipInstanceType {
|
|
31
|
-
readonly minip: any = getPlainMinip('__GIO_PLATFORM__');
|
|
32
|
-
public platform: PLATFORMS;
|
|
33
|
-
public scnPrefix: string;
|
|
34
|
-
public location: Location;
|
|
35
|
-
public appSource: AppSource;
|
|
36
|
-
public systemInfo: any;
|
|
37
|
-
public network: any;
|
|
38
|
-
|
|
39
|
-
constructor(public growingIO: GrowingIOType) {
|
|
40
|
-
const {
|
|
41
|
-
platformConfig: { platform, scnPrefix }
|
|
42
|
-
} = this.growingIO;
|
|
43
|
-
this.platform = platform;
|
|
44
|
-
this.scnPrefix = scnPrefix;
|
|
45
|
-
this.growingIO.emitter.on(EMIT_MSG.OPTION_INITIALIZED, () => {
|
|
46
|
-
this.getNetworkType().then(() =>
|
|
47
|
-
this.growingIO.dataStore?.eventReleaseInspector()
|
|
48
|
-
);
|
|
49
|
-
this.getSystemInfo().then(() =>
|
|
50
|
-
this.growingIO.dataStore?.eventReleaseInspector()
|
|
51
|
-
);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// 通过hook setNavigationBarTitle方法优雅地获取客户设置的当前页面标题
|
|
56
|
-
hookSetTitle = () => {
|
|
57
|
-
const originSetter = this.minip?.setNavigationBarTitle;
|
|
58
|
-
const self = this;
|
|
59
|
-
if (originSetter) {
|
|
60
|
-
Object.defineProperty(this.minip, 'setNavigationBarTitle', {
|
|
61
|
-
writable: true,
|
|
62
|
-
enumerable: true,
|
|
63
|
-
configurable: true,
|
|
64
|
-
value: function () {
|
|
65
|
-
if (self.growingIO.gioSDKInitialized) {
|
|
66
|
-
// 这个currentPath一般认为是在onLoad中获取的当前小程序页面的path,此时SDK还没有parse,保存的还是上一个页面的信息
|
|
67
|
-
const currentPath = self.getCurrentPath();
|
|
68
|
-
const { title } = arguments[0] || {};
|
|
69
|
-
self.growingIO.dataStore.eventHooks.currentPage.configuredTitle[
|
|
70
|
-
currentPath
|
|
71
|
-
] = title;
|
|
72
|
-
}
|
|
73
|
-
return originSetter.apply(this, arguments);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
// -----以下为除快应用以外的小程序通用的实现,由各平台端继承并差异化实现-----
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* 业务相关
|
|
83
|
-
*/
|
|
84
|
-
// 保留当前页面,跳转到应用内的某个页面
|
|
85
|
-
navigateTo = (opt: {
|
|
86
|
-
url: string;
|
|
87
|
-
fail: () => void;
|
|
88
|
-
success: () => void;
|
|
89
|
-
complete: () => void;
|
|
90
|
-
}) => this.minip?.navigateTo(opt);
|
|
91
|
-
|
|
92
|
-
// 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
|
|
93
|
-
switchTab = (opt: {
|
|
94
|
-
url: string;
|
|
95
|
-
fail: () => void;
|
|
96
|
-
success: () => void;
|
|
97
|
-
complete: () => void;
|
|
98
|
-
}) => {
|
|
99
|
-
this.minip?.switchTab(opt);
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
// 打开另一个小程序
|
|
103
|
-
navigateToMiniProgram = (opt: NavigateToMiniProgramOption) =>
|
|
104
|
-
this.minip?.navigateToMiniProgram(opt);
|
|
105
|
-
|
|
106
|
-
// 获取图片信息
|
|
107
|
-
getImageInfo = ({ src, success, fail, complete }: any) =>
|
|
108
|
-
this.minip?.getImageInfo({ src, success, fail, complete });
|
|
109
|
-
|
|
110
|
-
// 采集曝光事件
|
|
111
|
-
initImpression = (collectPage: any) => {
|
|
112
|
-
this.growingIO.plugins?.gioImpressionTracking?.main(
|
|
113
|
-
collectPage,
|
|
114
|
-
'observeAll'
|
|
115
|
-
);
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* 页面相关
|
|
120
|
-
*/
|
|
121
|
-
// 获取当前页面栈
|
|
122
|
-
getCurrentPage = (): any => {
|
|
123
|
-
// @ts-ignore 小程序自带api
|
|
124
|
-
return niceTry(() => last(getCurrentPages())) || {};
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
// 获取当前页面路由
|
|
128
|
-
getCurrentPath = () => {
|
|
129
|
-
const currentPage = this.getCurrentPage();
|
|
130
|
-
// wx/my取route; swan取uri; tt取__route__; qq无值
|
|
131
|
-
return (
|
|
132
|
-
currentPage?.route || currentPage?.uri || currentPage?.__route__ || ''
|
|
133
|
-
);
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
// 获取页面标题
|
|
137
|
-
getPageTitle = (page) => {
|
|
138
|
-
const platform = getPlainPlatform();
|
|
139
|
-
let title = '';
|
|
140
|
-
let instConfig = getPlainConfig(platform);
|
|
141
|
-
if (typeOf(instConfig) === 'string') {
|
|
142
|
-
instConfig = niceTry(() => JSON.parse(instConfig)) ?? {};
|
|
143
|
-
}
|
|
144
|
-
// 第一优先级在base中的hook setNavigationBarTitle设置的值(在dataStore page实例中实现,准确率最高)
|
|
145
|
-
// 第二优先级支持客户自己在页面中设置页面title(保持3.8的向下兼容,不准确但优先级高)
|
|
146
|
-
const data = page?.data || page.$data || {};
|
|
147
|
-
title = isString(data?.gioPageTitle) ? data?.gioPageTitle : '';
|
|
148
|
-
|
|
149
|
-
let instPage;
|
|
150
|
-
// 第三优先级取页面的配置json的navigationBarTitleText(仅部分支持)
|
|
151
|
-
if (!title) {
|
|
152
|
-
// 存在__[wx]AppCode__时尝试从__[wx]AppCode__中匹配
|
|
153
|
-
niceTry(() => {
|
|
154
|
-
const instAppCode = getPlainAppCode(platform);
|
|
155
|
-
if (instAppCode) {
|
|
156
|
-
instPage = instAppCode[`${page.route}.json`] || {};
|
|
157
|
-
title =
|
|
158
|
-
instPage?.navigationBarTitleText || // wx/qq/jd
|
|
159
|
-
instPage?.mod?.exports?.navigationBarTitleText; // ks
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
if (!title && instConfig) {
|
|
164
|
-
// 第四优先级在app生命周期中拿不到page对象,拿生命周期的参数来匹配
|
|
165
|
-
const { enterParams } = this.growingIO.dataStore.eventHooks.appEffects;
|
|
166
|
-
if (!page.route && !isEmpty(enterParams)) {
|
|
167
|
-
page.route = enterParams.path || '';
|
|
168
|
-
title = page.route
|
|
169
|
-
? this._getTitleFromTabBar(instConfig, page.route)
|
|
170
|
-
: '';
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// 第五优先级存在pages数组或page对象时尝试从page中匹配(大概率匹配不到,跟框架有关)
|
|
174
|
-
if (!title) {
|
|
175
|
-
if (isArray(instConfig.pages)) {
|
|
176
|
-
instPage = instConfig.pages.find((o) => o.path === page.route) ?? {};
|
|
177
|
-
} else {
|
|
178
|
-
instPage = instConfig.page || {};
|
|
179
|
-
}
|
|
180
|
-
if (instPage) {
|
|
181
|
-
const pageInfo =
|
|
182
|
-
instPage[page.route] || instPage[`${page.route}.html`] || instPage;
|
|
183
|
-
title =
|
|
184
|
-
pageInfo?.navigationBarTitleText ||
|
|
185
|
-
pageInfo?.window?.navigationBarTitleText;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// 第六优先级取tabBar配置匹配(只有tabbar的4个页面有机会)
|
|
190
|
-
if (!title) {
|
|
191
|
-
title = this._getTitleFromTabBar(instConfig, page.route);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// 第七优先级兜底取全局window的navigationBarTitleText
|
|
196
|
-
if (!title) {
|
|
197
|
-
if (['wx', 'tt'].includes(platform)) {
|
|
198
|
-
title = (instConfig || global || $global)?.global?.window
|
|
199
|
-
?.navigationBarTitleText;
|
|
200
|
-
} else {
|
|
201
|
-
title = (instConfig || global || $global)?.window
|
|
202
|
-
?.navigationBarTitleText;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
return limitString(title);
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
private _getTitleFromTabBar = (
|
|
209
|
-
instConfig: any,
|
|
210
|
-
pageRoute: string
|
|
211
|
-
): string => {
|
|
212
|
-
const tabPage = instConfig?.tabBar?.list?.find((p) => {
|
|
213
|
-
return p.pagePath === pageRoute || p.pagePath === `${pageRoute}.html`;
|
|
214
|
-
});
|
|
215
|
-
return tabPage?.text || '';
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* 存储相关
|
|
220
|
-
*/
|
|
221
|
-
// 同步获取存储数据
|
|
222
|
-
getStorageSync = (key: string): any => {
|
|
223
|
-
let value = this.minip?.getStorageSync(key);
|
|
224
|
-
if (isObject(value) && value.expiredAt) {
|
|
225
|
-
if (value.expiredAt < Date.now()) {
|
|
226
|
-
return '';
|
|
227
|
-
} else {
|
|
228
|
-
return value.value;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return value;
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
// 异步获取存储数据
|
|
235
|
-
getStorage = (key: string): Promise<string> => {
|
|
236
|
-
return new Promise((resolve) => {
|
|
237
|
-
this.minip?.getStorage({
|
|
238
|
-
key,
|
|
239
|
-
success: ({ data }) => resolve(data),
|
|
240
|
-
fail: () => resolve('')
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
// 同步存储数据
|
|
246
|
-
setStorageSync = (key: string, value: any, expiredAt?: string | number) => {
|
|
247
|
-
if (expiredAt) {
|
|
248
|
-
value = { value, expiredAt };
|
|
249
|
-
}
|
|
250
|
-
this.minip?.setStorageSync(key, value);
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
// 异步存储数据
|
|
254
|
-
setStorage = (key: string, value: any) => {
|
|
255
|
-
this.minip?.setStorage({ key, data: value });
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
// 同步移除指定数据
|
|
259
|
-
removeStorageSync = (key: string) => {
|
|
260
|
-
this.minip?.removeStorageSync(key);
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
// 异步移除指定数据
|
|
264
|
-
removeStorage = (key: string) => {
|
|
265
|
-
this.minip?.removeStorage(key);
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* 网络相关
|
|
270
|
-
*/
|
|
271
|
-
// 获取网络类型
|
|
272
|
-
getNetworkType = (): Promise<{ networkType: string }> => {
|
|
273
|
-
const self = this;
|
|
274
|
-
return new Promise((resolve) => {
|
|
275
|
-
this.minip?.getNetworkType({
|
|
276
|
-
success: (r) => {
|
|
277
|
-
self.network = r;
|
|
278
|
-
resolve(r);
|
|
279
|
-
},
|
|
280
|
-
fail: () => resolve(null)
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
};
|
|
284
|
-
|
|
285
|
-
// 发起请求
|
|
286
|
-
request = ({
|
|
287
|
-
url,
|
|
288
|
-
data,
|
|
289
|
-
header,
|
|
290
|
-
timeout,
|
|
291
|
-
method,
|
|
292
|
-
success,
|
|
293
|
-
fail,
|
|
294
|
-
complete
|
|
295
|
-
}) => {
|
|
296
|
-
const requestTask = this.minip?.request({
|
|
297
|
-
url,
|
|
298
|
-
data,
|
|
299
|
-
// 微信小程序和其他小程序里叫header
|
|
300
|
-
header,
|
|
301
|
-
timeout,
|
|
302
|
-
method,
|
|
303
|
-
success,
|
|
304
|
-
fail,
|
|
305
|
-
complete
|
|
306
|
-
});
|
|
307
|
-
// 设置超时中断请求
|
|
308
|
-
let t = setTimeout(() => {
|
|
309
|
-
if (requestTask?.abort && isFunction(requestTask?.abort)) {
|
|
310
|
-
requestTask?.abort();
|
|
311
|
-
}
|
|
312
|
-
clearTimeout(t);
|
|
313
|
-
t = null;
|
|
314
|
-
}, (timeout || 10000) + 10);
|
|
315
|
-
return requestTask;
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* 系统相关
|
|
320
|
-
*/
|
|
321
|
-
// 获取小程序系统信息
|
|
322
|
-
getSystemInfo = (): Promise<SystemInfo> => {
|
|
323
|
-
const self = this;
|
|
324
|
-
return new Promise((resolve) => {
|
|
325
|
-
this.minip?.getSystemInfo({
|
|
326
|
-
success: (r) => {
|
|
327
|
-
self.systemInfo = r;
|
|
328
|
-
resolve(r);
|
|
329
|
-
},
|
|
330
|
-
fail: () => resolve(null)
|
|
331
|
-
});
|
|
332
|
-
});
|
|
333
|
-
};
|
|
334
|
-
|
|
335
|
-
// 获取小程序设置
|
|
336
|
-
getSetting = () => {
|
|
337
|
-
return new Promise((resolve) => {
|
|
338
|
-
this.minip?.getSetting({ success: resolve, fail: resolve });
|
|
339
|
-
});
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
// 监听网络变更
|
|
343
|
-
setNetworkStatusListener = () => {
|
|
344
|
-
this.minip?.onNetworkStatusChange(({ networkType }) => {
|
|
345
|
-
if (networkType) {
|
|
346
|
-
this.network.networkType = networkType;
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
export default BaseInstance;
|