You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.0 KiB
122 lines
3.0 KiB
|
3 weeks ago
|
/**
|
||
|
|
* 微信 DataNexus / 30r。仅 wechatgame 构建时由扩展拷入 assets/script/sdk。
|
||
|
|
* 官方 SDK 放到 node_modules/@dn-sdk,或把 js 放本目录命名为 dn-sdk.js。
|
||
|
|
*/
|
||
|
|
|
||
|
|
/** createSdk30r 入参 */
|
||
|
|
export type Sdk30rCreateOpts = {
|
||
|
|
/** 腾讯广告 user_action_set_id */
|
||
|
|
user_action_set_id: number;
|
||
|
|
/** 密钥 */
|
||
|
|
secret_key: string;
|
||
|
|
/** 微信 appid */
|
||
|
|
appid: string;
|
||
|
|
};
|
||
|
|
|
||
|
|
/** 官方 SDK 最小面 */
|
||
|
|
type DnSdkLike = {
|
||
|
|
init?: (opts: Sdk30rCreateOpts) => { inited?: boolean } | void;
|
||
|
|
track?: (event: string, msg: unknown) => void;
|
||
|
|
setOpenId?: (uid: string) => void;
|
||
|
|
onTutorialFinish?: () => void;
|
||
|
|
onRegister?: () => void;
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 微信 30r 运行时(SDKManager.require 入口为 createSdk30r)。
|
||
|
|
*/
|
||
|
|
export class Sdk30rWechat {
|
||
|
|
private _sdk: DnSdkLike | null = null;
|
||
|
|
private _inited = false;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 加载官方 SDK 并初始化
|
||
|
|
* @param opts 广告账号参数
|
||
|
|
*/
|
||
|
|
static create(opts: Sdk30rCreateOpts): Sdk30rWechat {
|
||
|
|
const ins = new Sdk30rWechat();
|
||
|
|
ins._boot(opts);
|
||
|
|
return ins;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 上报事件
|
||
|
|
* @param event 事件名
|
||
|
|
* @param msg 属性
|
||
|
|
*/
|
||
|
|
track(event: string, msg: unknown): void {
|
||
|
|
this._sdk?.track?.(event, msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 新手引导完成 */
|
||
|
|
onTutorialFinish(): void {
|
||
|
|
this._sdk?.onTutorialFinish?.();
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 注册完成 */
|
||
|
|
onRegister(): void {
|
||
|
|
this._sdk?.onRegister?.();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 绑定 openid
|
||
|
|
* @param uid 用户 id
|
||
|
|
*/
|
||
|
|
setOpenId(uid: string): void {
|
||
|
|
this._sdk?.setOpenId?.(String(uid ?? ''));
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 初始化结果 */
|
||
|
|
getInitResult(): { inited: boolean } {
|
||
|
|
return { inited: this._inited };
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 载入并 init 官方 SDK */
|
||
|
|
private _boot(opts: Sdk30rCreateOpts): void {
|
||
|
|
const mod = this._loadDnSdk();
|
||
|
|
if (!mod) {
|
||
|
|
console.error('[Sdk30rWechat] 未找到 @dn-sdk / dn-sdk.js');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
this._sdk = mod;
|
||
|
|
if (typeof mod.init !== 'function') {
|
||
|
|
this._inited = true;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
const ret = mod.init(opts);
|
||
|
|
this._inited = ret == null || ret.inited !== false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 优先 npm @dn-sdk,其次同目录 dn-sdk.js */
|
||
|
|
private _loadDnSdk(): DnSdkLike | null {
|
||
|
|
try {
|
||
|
|
return this._unwrap(require('@dn-sdk'));
|
||
|
|
} catch {
|
||
|
|
/* 再试 vendor */
|
||
|
|
}
|
||
|
|
try {
|
||
|
|
return this._unwrap(require('./dn-sdk'));
|
||
|
|
} catch {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 解开 default 导出
|
||
|
|
* @param raw require 结果
|
||
|
|
*/
|
||
|
|
private _unwrap(raw: unknown): DnSdkLike | null {
|
||
|
|
if (!raw || typeof raw !== 'object') return null;
|
||
|
|
const rec = raw as { default?: DnSdkLike };
|
||
|
|
return rec.default ?? (raw as DnSdkLike);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* SDKManager 动态 require 入口
|
||
|
|
* @param opts 初始化参数
|
||
|
|
*/
|
||
|
|
export function createSdk30r(opts: Sdk30rCreateOpts): Sdk30rWechat {
|
||
|
|
return Sdk30rWechat.create(opts);
|
||
|
|
}
|