bug fix
This commit is contained in:
@@ -11,225 +11,231 @@ import { LuffaWalletSDK } from "./wallet/LuffaWalletSDK";
|
||||
import { UmaAnalyticsSDK } from "./analytics/UmaAnalyticsSDK";
|
||||
import { ISignCap } from "./core/ISignCap";
|
||||
import { ITransactionCap } from "./core/ITransactionCap";
|
||||
import { WebSDK } from "./platform/WebSDK";
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
// 渠道管理器
|
||||
@ccclass('SDKManager')
|
||||
export class SDKManager {
|
||||
private static _I: SDKManager = null;
|
||||
public static get I(): SDKManager {
|
||||
if (!SDKManager._I) {
|
||||
SDKManager._I = new SDKManager();
|
||||
}
|
||||
return SDKManager._I;
|
||||
@ccclass("SDKManager")
|
||||
export class SDKManager {
|
||||
private static _I: SDKManager = null;
|
||||
public static get I(): SDKManager {
|
||||
if (!SDKManager._I) {
|
||||
SDKManager._I = new SDKManager();
|
||||
}
|
||||
// 广告,分享
|
||||
private adSDK: IAdSDK | null = null;
|
||||
// 钱包
|
||||
private walletSDK: IWalletSDK | null = null;
|
||||
// 平台基础
|
||||
private platformSDK: IPlatformSDK | null = null;
|
||||
// 分析统计
|
||||
private analyticsSDK: IAnalyticsSDK | null = null;
|
||||
return SDKManager._I;
|
||||
}
|
||||
// 广告,分享
|
||||
private adSDK: IAdSDK | null = null;
|
||||
// 钱包
|
||||
private walletSDK: IWalletSDK | null = null;
|
||||
// 平台基础
|
||||
private platformSDK: IPlatformSDK | null = null;
|
||||
// 分析统计
|
||||
private analyticsSDK: IAnalyticsSDK | null = null;
|
||||
|
||||
private constructor() {
|
||||
|
||||
}
|
||||
|
||||
// 初始化
|
||||
public init(cb: Function = null) {
|
||||
logger.info("SDKManager 初始化...");
|
||||
// 检测平台
|
||||
if (PlatformHelper.isKuaishou()) {
|
||||
// 快手
|
||||
private constructor() {}
|
||||
|
||||
} else if (PlatformHelper.isWechat()) {
|
||||
// 微信
|
||||
this.adSDK = new WxAdSDK();
|
||||
this.platformSDK = new WxPlatformSDK();
|
||||
} else if (PlatformHelper.isLuffa()) {
|
||||
// Luffa
|
||||
this.walletSDK = new LuffaWalletSDK();
|
||||
} else if (PlatformHelper.isByteDance()) {
|
||||
// 字节跳动
|
||||
// 初始化
|
||||
public init(cb: Function = null) {
|
||||
logger.info("SDKManager 初始化...");
|
||||
logger.info("当前平台" + sys.platform);
|
||||
// 检测平台
|
||||
if (PlatformHelper.isKuaishou()) {
|
||||
// 快手
|
||||
} else if (PlatformHelper.isWechat()) {
|
||||
// 微信
|
||||
this.adSDK = new WxAdSDK();
|
||||
this.platformSDK = new WxPlatformSDK();
|
||||
} else if (PlatformHelper.isLuffa()) {
|
||||
// Luffa
|
||||
this.walletSDK = new LuffaWalletSDK();
|
||||
} else if (PlatformHelper.isByteDance()) {
|
||||
// 字节跳动
|
||||
} else {
|
||||
//默认web平台
|
||||
this.platformSDK = new WebSDK();
|
||||
}
|
||||
|
||||
} else {
|
||||
// 默认加载 UMA 分析
|
||||
this.analyticsSDK = new UmaAnalyticsSDK();
|
||||
|
||||
}
|
||||
// 初始化各模块
|
||||
this.adSDK?.init();
|
||||
this.walletSDK?.init();
|
||||
this.platformSDK?.init();
|
||||
this.analyticsSDK?.init();
|
||||
|
||||
// 默认加载 UMA 分析
|
||||
this.analyticsSDK = new UmaAnalyticsSDK();
|
||||
// 回调
|
||||
cb && cb();
|
||||
}
|
||||
|
||||
// 初始化各模块
|
||||
this.adSDK?.init();
|
||||
this.walletSDK?.init();
|
||||
this.platformSDK?.init();
|
||||
this.analyticsSDK?.init();
|
||||
/**
|
||||
* 销毁所有 SDK
|
||||
*
|
||||
* - 逐个调用各 SDK 的 `destroy` 方法
|
||||
* - 用于游戏退出、切换账号、切换平台时释放资源
|
||||
* - 调用时机:游戏关闭 / 重新进入大厅 / SDK 切换
|
||||
*/
|
||||
public destroyAll() {
|
||||
this.adSDK?.destroy?.();
|
||||
this.adSDK = null;
|
||||
this.walletSDK?.destroy?.();
|
||||
this.walletSDK = null;
|
||||
this.platformSDK?.destroy?.();
|
||||
this.platformSDK = null;
|
||||
this.analyticsSDK?.destroy?.();
|
||||
this.analyticsSDK = null;
|
||||
logger.log("所有 SDK 已销毁并清空引用");
|
||||
}
|
||||
|
||||
// 回调
|
||||
cb && cb();
|
||||
}
|
||||
/** --------------------------------------------------------- 广告,分享 --------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* 销毁所有 SDK
|
||||
*
|
||||
* - 逐个调用各 SDK 的 `destroy` 方法
|
||||
* - 用于游戏退出、切换账号、切换平台时释放资源
|
||||
* - 调用时机:游戏关闭 / 重新进入大厅 / SDK 切换
|
||||
*/
|
||||
public destroyAll() {
|
||||
this.adSDK?.destroy?.();
|
||||
this.adSDK = null;
|
||||
this.walletSDK?.destroy?.();
|
||||
this.walletSDK = null;
|
||||
this.platformSDK?.destroy?.();
|
||||
this.platformSDK = null;
|
||||
this.analyticsSDK?.destroy?.();
|
||||
this.analyticsSDK = null;
|
||||
logger.log("所有 SDK 已销毁并清空引用");
|
||||
}
|
||||
// 展示激励视频广告
|
||||
public showRewardVideo(cb: (ok: boolean) => void): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.showRewardVideo(cb);
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 广告,分享 --------------------------------------------------------- */
|
||||
// 展示插屏广告
|
||||
public showInterstitial(): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.showInterstitial();
|
||||
}
|
||||
|
||||
// 展示激励视频广告
|
||||
public showRewardVideo(cb: (ok: boolean) => void): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.showRewardVideo(cb)
|
||||
}
|
||||
// 展示 Banner 广告
|
||||
public showBanner(): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.showBanner();
|
||||
}
|
||||
|
||||
// 展示插屏广告
|
||||
public showInterstitial(): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.showInterstitial()
|
||||
}
|
||||
|
||||
// 展示 Banner 广告
|
||||
public showBanner(): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.showBanner()
|
||||
}
|
||||
// 隐藏 Banner 广告
|
||||
public hideBanner(): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.hideBanner();
|
||||
}
|
||||
|
||||
// 隐藏 Banner 广告
|
||||
public hideBanner(): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.hideBanner()
|
||||
}
|
||||
// 主动拉起分享
|
||||
public showShare(cb?: Function): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.showShare(cb);
|
||||
}
|
||||
|
||||
// 主动拉起分享
|
||||
public showShare(cb?: Function): void {
|
||||
if (!this.adSDK) return;
|
||||
this.adSDK.showShare(cb)
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 钱包 --------------------------------------------------------- */
|
||||
|
||||
// 连接钱包
|
||||
public connectWallet(cb: (address: string, publicKey?: string) => void): void {
|
||||
if (!this.walletSDK) return;
|
||||
this.walletSDK.connectWallet(cb);
|
||||
}
|
||||
/** --------------------------------------------------------- 钱包 --------------------------------------------------------- */
|
||||
|
||||
// 断开钱包连接
|
||||
public disconnectWallet(): void {
|
||||
if (!this.walletSDK) return;
|
||||
this.walletSDK.disconnectWallet();
|
||||
}
|
||||
// 连接钱包
|
||||
public connectWallet(
|
||||
cb: (address: string, publicKey?: string) => void
|
||||
): void {
|
||||
if (!this.walletSDK) return;
|
||||
this.walletSDK.connectWallet(cb);
|
||||
}
|
||||
|
||||
// 获取当前钱包地址
|
||||
public getWalletAddress(): string | null {
|
||||
if (!this.walletSDK) return null;
|
||||
return this.walletSDK.getWalletAddress()
|
||||
}
|
||||
// 断开钱包连接
|
||||
public disconnectWallet(): void {
|
||||
if (!this.walletSDK) return;
|
||||
this.walletSDK.disconnectWallet();
|
||||
}
|
||||
|
||||
// 签名消息
|
||||
public async signMessage(message: string, options?: any): Promise<{ signature: string; fullMessage?: string }> {
|
||||
if (!this.walletSDK) return;
|
||||
// 判断是否实现签名能力
|
||||
if ("signMessage" in this.walletSDK) {
|
||||
const signer = this.walletSDK as unknown as ISignCap;
|
||||
return signer.signMessage(message, options);
|
||||
}
|
||||
throw new Error("当前钱包 SDK 不支持 signMessage 功能");
|
||||
}
|
||||
// 获取当前钱包地址
|
||||
public getWalletAddress(): string | null {
|
||||
if (!this.walletSDK) return null;
|
||||
return this.walletSDK.getWalletAddress();
|
||||
}
|
||||
|
||||
// 签名交易
|
||||
public async signTransaction(rawTx: any): Promise<{ signedData: string }> {
|
||||
if (!this.walletSDK) return;
|
||||
// 判断是否实现交易能力
|
||||
if ("signTransaction" in this.walletSDK) {
|
||||
const txCap = this.walletSDK as unknown as ITransactionCap;
|
||||
return txCap.signTransaction(rawTx);
|
||||
}
|
||||
throw new Error("当前钱包 SDK 不支持 signTransaction 功能");
|
||||
}
|
||||
// 签名消息
|
||||
public async signMessage(
|
||||
message: string,
|
||||
options?: any
|
||||
): Promise<{ signature: string; fullMessage?: string }> {
|
||||
if (!this.walletSDK) return;
|
||||
// 判断是否实现签名能力
|
||||
if ("signMessage" in this.walletSDK) {
|
||||
const signer = this.walletSDK as unknown as ISignCap;
|
||||
return signer.signMessage(message, options);
|
||||
}
|
||||
throw new Error("当前钱包 SDK 不支持 signMessage 功能");
|
||||
}
|
||||
|
||||
// 发送交易(广播到链上)
|
||||
public async sendTransaction(signedData: string): Promise<{ hash: string }> {
|
||||
if (!this.walletSDK) return;
|
||||
// 判断是否实现交易能力
|
||||
if ("sendTransaction" in this.walletSDK) {
|
||||
const txCap = this.walletSDK as unknown as ITransactionCap;
|
||||
return txCap.sendTransaction(signedData);
|
||||
}
|
||||
throw new Error("当前钱包 SDK 不支持 sendTransaction 功能");
|
||||
}
|
||||
// 签名交易
|
||||
public async signTransaction(rawTx: any): Promise<{ signedData: string }> {
|
||||
if (!this.walletSDK) return;
|
||||
// 判断是否实现交易能力
|
||||
if ("signTransaction" in this.walletSDK) {
|
||||
const txCap = this.walletSDK as unknown as ITransactionCap;
|
||||
return txCap.signTransaction(rawTx);
|
||||
}
|
||||
throw new Error("当前钱包 SDK 不支持 signTransaction 功能");
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 平台基础 --------------------------------------------------------- */
|
||||
// 发送交易(广播到链上)
|
||||
public async sendTransaction(signedData: string): Promise<{ hash: string }> {
|
||||
if (!this.walletSDK) return;
|
||||
// 判断是否实现交易能力
|
||||
if ("sendTransaction" in this.walletSDK) {
|
||||
const txCap = this.walletSDK as unknown as ITransactionCap;
|
||||
return txCap.sendTransaction(signedData);
|
||||
}
|
||||
throw new Error("当前钱包 SDK 不支持 sendTransaction 功能");
|
||||
}
|
||||
|
||||
// 登录
|
||||
public login(cb?: Function): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.login(cb)
|
||||
}
|
||||
/** --------------------------------------------------------- 平台基础 --------------------------------------------------------- */
|
||||
|
||||
// 获取用户信息
|
||||
public getUserInfo(cb: (info: { nickName: string; avatarUrl: string }) => void): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.getUserInfo(cb)
|
||||
}
|
||||
// 登录
|
||||
public login(cb?: Function): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.login(cb);
|
||||
}
|
||||
|
||||
// 检查平台权限
|
||||
public checkPermission(scope: string, cb: (granted: boolean) => void): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.checkPermission(scope, cb)
|
||||
}
|
||||
// 获取用户信息
|
||||
public getUserInfo(
|
||||
cb: (info: { nickName: string; avatarUrl: string }) => void
|
||||
): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.getUserInfo(cb);
|
||||
}
|
||||
|
||||
// 复制文本到剪贴板
|
||||
public copyToClipboard(text: string, cb?: Function): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.copyToClipboard(text, cb);
|
||||
}
|
||||
// 检查平台权限
|
||||
public checkPermission(scope: string, cb: (granted: boolean) => void): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.checkPermission(scope, cb);
|
||||
}
|
||||
|
||||
// 客服功能是否可用
|
||||
public kefuSupport(): boolean {
|
||||
if (!this.platformSDK) return false;
|
||||
return this.platformSDK.kefuSupport();
|
||||
}
|
||||
// 复制文本到剪贴板
|
||||
public copyToClipboard(text: string, cb?: Function): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.copyToClipboard(text, cb);
|
||||
}
|
||||
|
||||
// 打开客服会话
|
||||
public openKefu(): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.openKefu();
|
||||
}
|
||||
// 客服功能是否可用
|
||||
public kefuSupport(): boolean {
|
||||
if (!this.platformSDK) return false;
|
||||
return this.platformSDK.kefuSupport();
|
||||
}
|
||||
|
||||
// 获取设备分辨率
|
||||
public getWindowSize(): { width: number, height: number } {
|
||||
if (!this.platformSDK) return {width: 720, height: 1280};
|
||||
return this.platformSDK.getWindowSize();
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 分析统计 --------------------------------------------------------- */
|
||||
|
||||
// 判断统计功能是否可用
|
||||
public isAnalyticsEnabled(): boolean {
|
||||
if (!this.analyticsSDK) return false;
|
||||
return this.analyticsSDK.isAnalyticsEnabled();
|
||||
}
|
||||
// 打开客服会话
|
||||
public openKefu(): void {
|
||||
if (!this.platformSDK) return;
|
||||
this.platformSDK.openKefu();
|
||||
}
|
||||
|
||||
// 上报事件
|
||||
public trackEvent(eventName: string, value?: any): void {
|
||||
if (!this.analyticsSDK) return;
|
||||
return this.analyticsSDK.trackEvent(eventName, value);
|
||||
}
|
||||
}
|
||||
// 获取设备分辨率
|
||||
public getWindowSize(): { width: number; height: number } {
|
||||
if (!this.platformSDK) return { width: 720, height: 1280 };
|
||||
return this.platformSDK.getWindowSize();
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 分析统计 --------------------------------------------------------- */
|
||||
|
||||
// 判断统计功能是否可用
|
||||
public isAnalyticsEnabled(): boolean {
|
||||
if (!this.analyticsSDK) return false;
|
||||
return this.analyticsSDK.isAnalyticsEnabled();
|
||||
}
|
||||
|
||||
// 上报事件
|
||||
public trackEvent(eventName: string, value?: any): void {
|
||||
if (!this.analyticsSDK) return;
|
||||
return this.analyticsSDK.trackEvent(eventName, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
import { IPlatformSDK } from "../core/IPlatformSDK";
|
||||
import { logger } from "db://assets/Scripts/Main/Common/Logger";
|
||||
|
||||
export class WebSDK implements IPlatformSDK {
|
||||
constructor() {}
|
||||
init(cb?: Function): void {
|
||||
logger.log("Web平台初始化");
|
||||
cb && cb();
|
||||
}
|
||||
|
||||
// 登录
|
||||
login(cb?: Function): void {
|
||||
cb && cb({ code: "Web" });
|
||||
}
|
||||
|
||||
// 获取用户信息
|
||||
getUserInfo(
|
||||
cb: (info: { nickName: string; avatarUrl: string }) => void
|
||||
): void {
|
||||
cb({ nickName: "小明", avatarUrl: "avatar.png" });
|
||||
}
|
||||
|
||||
// 检查平台权限
|
||||
checkPermission(scope: string, cb: (granted: boolean) => void): void {
|
||||
cb(true);
|
||||
}
|
||||
|
||||
//region 复制到剪贴板
|
||||
/**复制文本到剪贴板 */
|
||||
copyToClipboard(text: string, cb?: Function) {
|
||||
logger.log("web 复制到剪贴板:", text);
|
||||
|
||||
if (navigator.clipboard && window.isSecureContext) {
|
||||
// 使用现代的 Clipboard API
|
||||
navigator.clipboard
|
||||
.writeText(text)
|
||||
.then(() => {
|
||||
logger.log("web 复制成功 (Clipboard API)");
|
||||
cb && cb(true);
|
||||
})
|
||||
.catch((err) => {
|
||||
logger.log("web 复制失败 (Clipboard API):", err);
|
||||
this.fallbackCopyToClipboard(text, cb);
|
||||
});
|
||||
} else {
|
||||
// 使用兼容性方案
|
||||
this.fallbackCopyToClipboard(text, cb);
|
||||
}
|
||||
}
|
||||
/**兼容性复制方案 */
|
||||
private fallbackCopyToClipboard(text: string, cb?: Function) {
|
||||
const textArea = document.createElement("textarea");
|
||||
textArea.value = text;
|
||||
|
||||
// 避免滚动到底部
|
||||
textArea.style.top = "0";
|
||||
textArea.style.left = "0";
|
||||
textArea.style.position = "fixed";
|
||||
textArea.style.opacity = "0";
|
||||
|
||||
document.body.appendChild(textArea);
|
||||
textArea.focus();
|
||||
textArea.select();
|
||||
|
||||
try {
|
||||
const successful = document.execCommand("copy");
|
||||
if (successful) {
|
||||
logger.log("web 复制成功 (fallback)");
|
||||
cb && cb(true);
|
||||
} else {
|
||||
logger.log("web 复制失败 (fallback)");
|
||||
cb && cb(false);
|
||||
}
|
||||
} catch (err) {
|
||||
logger.log("web 复制异常 (fallback):", err);
|
||||
cb && cb(false);
|
||||
}
|
||||
|
||||
document.body.removeChild(textArea);
|
||||
}
|
||||
|
||||
// 客服功能是否可用
|
||||
kefuSupport(): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 打开客服会话
|
||||
openKefu(): void {}
|
||||
|
||||
// 获取设备分辨率
|
||||
getWindowSize(): { width: number; height: number } {
|
||||
return { width: 720, height: 1280 };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "6903a95e-077f-44a4-a740-04ee2ae3ab86",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
Reference in New Issue
Block a user