import AppPlatform from "../../FrameWork/Util/AppPlatform"; import AppConfig from "../../FrameWork/Config/AppConfig"; import AppSwitchConfig from "../../FrameWork/Config/AppSwitchConfig"; import wudianMgr from "../../FrameWork/Mgr/WudianMgr"; /** * QQ 小游戏 */ export default class QQMiniGameAPI { public static readonly AppBlockStyle_custom = { left: 120, top: 200 } //样式,积木广告左上角横纵坐标, mmp 最小值32 public static readonly AppBlockSize_custom = 5 //范围是1~5,积木广告的个数(展示以实际拉取广告数量为准) public static readonly AppBlockOrientation_custom = "landscape" //landscape 或者 vertical,积木广告横向展示或者竖向展示 public static Login_custom(onSuccess: Function, onFail: Function) { if (AppPlatform.is_QQ_PLAY_custom()) { window["qq"].login( { success: (res) => { if (res.code) { let code = res.code; onSuccess(code); console.log("登陆成功,获取到code : " + code) } } }) } } //-------------------------激励视频--------------------------------- protected static _isRegRewardedVideoAdEvent_custom = false; protected static _onRewardedVideoAdFailed_custom: Function = null; protected static _onRewardedVideoAdClose_custom: Function = null; protected static onRewardedVideoAdLoad_custom() { console.log('激励视频 广告加载完成') } protected static onRewardedVideoAdError_custom(err) { console.log('激励视频 广告加载失败' + err) if (QQMiniGameAPI._onRewardedVideoAdFailed_custom) { QQMiniGameAPI._onRewardedVideoAdFailed_custom(); } } protected static onRewardedVideoAdClose_custom(res) { if ((res && res.isEnded) || res == null) { console.log('激励视频 已完整观看') if (QQMiniGameAPI._onRewardedVideoAdClose_custom) { QQMiniGameAPI._onRewardedVideoAdClose_custom(true) } } else { console.log('激励视频 未完整观看') if (QQMiniGameAPI._onRewardedVideoAdClose_custom) { QQMiniGameAPI._onRewardedVideoAdClose_custom(false) } } } protected static regRewardedVideoAdEvent_custom(rewardedVideoAd) { rewardedVideoAd.onLoad(QQMiniGameAPI.onRewardedVideoAdLoad_custom) rewardedVideoAd.onError(QQMiniGameAPI.onRewardedVideoAdError_custom) rewardedVideoAd.onClose(QQMiniGameAPI.onRewardedVideoAdClose_custom) QQMiniGameAPI._isRegRewardedVideoAdEvent_custom = true; } public static showRewardedVideoAd_custom(onAdClose: Function, onFailed: Function) { if (AppPlatform.is_QQ_PLAY_custom()) { QQMiniGameAPI._onRewardedVideoAdClose_custom = onAdClose; QQMiniGameAPI._onRewardedVideoAdFailed_custom = onFailed; var rewardedVideoAd = window["qq"].createRewardedVideoAd( { adUnitId: AppConfig.qq_adUnitId_custom, } ); if (!QQMiniGameAPI._isRegRewardedVideoAdEvent_custom) { QQMiniGameAPI.regRewardedVideoAdEvent_custom(rewardedVideoAd); } rewardedVideoAd.load().then(() => { var promise = rewardedVideoAd.show(); promise.then(() => console.log('激励视频 广告显示成功')); promise.catch((err) => { rewardedVideoAd.load() .then(() => rewardedVideoAd.show()) .catch(err => { console.log('激励视频 广告显示失败') if (onFailed) { onFailed(); } }) }); }).catch(err => { console.log('激励视频 广告加载失败') if (onFailed) { onFailed(); } }) } else { onAdClose(true); } } //---------------------------------------------------------------- //-------------------------小游戏跳转--------------------------- public static navigateToMiniProgram_custom(appId: string, path: string, onSuccess: Function, onFail: Function, onComplate: Function) { if (AppPlatform.is_QQ_PLAY_custom()) { console.log("跳转游戏: " + appId); window["qq"].navigateToMiniProgram( { appId: appId, path: path, extraData: { foo: 'bar' }, envVersion: 'release', success(res) { if (onSuccess) { onSuccess(res) } }, fail(res) { if (onFail) { onFail(res) } }, complete(res) { if (onComplate) { onComplate(res) } } }) } } //---------------------------------------------------------------------- //---------------------分享---------------------------------------- protected static _onShow_custom: Function = null; protected static _lastShareTime_custom: number = 0; public static share_custom(complate: Function, titel: string, imageUrl: string) { if (AppPlatform.is_QQ_PLAY_custom()) { QQMiniGameAPI._onShow_custom = () => { window["qq"].offShow(QQMiniGameAPI._onShow_custom) QQMiniGameAPI._onShow_custom = null; var c = Date.now() - this._lastShareTime_custom; if (complate) { if (Date.now() - this._lastShareTime_custom > 2000) { complate(true) } else { complate(false) } } } window["qq"].onShow(QQMiniGameAPI._onShow_custom) QQMiniGameAPI._lastShareTime_custom = Date.now(); window["qq"].shareAppMessage( { title: titel, imageUrl: imageUrl } ); } } //---------------------------------------------------------------------- //--------------------插屏幕广告--------------------------------------- public static showInterstitialAd_custom(onAdClose: Function, onFailed: Function) { if (AppPlatform.is_QQ_PLAY_custom()) { var interstitialAd = window["qq"].createInterstitialAd({ adUnitId: AppConfig.qq_InsAdUnitId_custom, }) let _onLoad = () => { console.log('插屏广告 加载完成'); interstitialAd.show().catch((err) => { console.log('插屏广告 显示失败 :' + err) interstitialAd.offLoad(_onLoad); interstitialAd.offError(_onError); interstitialAd.offClose(_onClose); interstitialAd.destroy(); if (onFailed) { onFailed(); } }) } interstitialAd.onLoad(_onLoad) let _onError = (err) => { console.log('插屏广告 加载失败' + err); interstitialAd.offLoad(_onLoad); interstitialAd.offError(_onError); interstitialAd.offClose(_onClose); interstitialAd.destroy(); if (onFailed) { onFailed(); } } interstitialAd.onError(_onError) let _onClose = () => { console.log('插屏广告 关闭'); interstitialAd.offLoad(_onLoad); interstitialAd.offError(_onError); interstitialAd.offClose(_onClose); interstitialAd.destroy(); if (onAdClose) { onAdClose(); } } interstitialAd.onClose(_onClose) } else { onAdClose(); } } //--------------------盒子广告--------------------------------------- public static mAppboxAd_custom = null; protected static onBoxAdClose_custom: Function = null; public static LoadAppBoxAd_custom(onAdClose: Function, onFailed: Function) { if (AppPlatform.is_QQ_PLAY_custom()) { this.mAppboxAd_custom = window["qq"].createAppBox({ adUnitId: AppConfig.qq_AppBoxId_custom, }) this.mAppboxAd_custom.load().then(() => { console.log('盒子广告 加载完成'); }) this.mAppboxAd_custom.onError((err) => { console.log('盒子广告 加载失败' + err); if (onFailed) { onFailed(); onFailed = null; } }) this.onBoxAdClose_custom = () => { console.log('盒子广告 关闭'); if (onAdClose) { onAdClose(); onAdClose = null; } } this.mAppboxAd_custom.onClose(this.onBoxAdClose_custom); } else { if (onAdClose) { onAdClose(); onAdClose = null; } } } public static showAppBoxAd_custom(onFailed: Function, onAdClose?: Function) { if (AppPlatform.is_QQ_PLAY_custom()) { if (QQMiniGameAPI.mAppboxAd_custom) { console.log("显示盒子广告"); QQMiniGameAPI.mAppboxAd_custom.offClose(QQMiniGameAPI.onBoxAdClose_custom); QQMiniGameAPI.onBoxAdClose_custom = () => { console.log('盒子广告 关闭'); if (onAdClose) { onAdClose(); onAdClose = null; } } QQMiniGameAPI.mAppboxAd_custom.onClose(QQMiniGameAPI.onBoxAdClose_custom); QQMiniGameAPI.mAppboxAd_custom.show().catch((err) => { console.log('盒子广告 显示失败 :' + err); if (onFailed) { onFailed(); onFailed = null; } }) } else { QQMiniGameAPI.LoadAppBoxAd_custom(onAdClose, onFailed); } } } /** * 得到小程序启动参数的同步方法,可得到一个Object返回值,返回值具体的数据结构在下面的列表中 * scene number 启动小游戏的场景值 * query Object 启动小游戏的 query 参数 * shareTicket string shareTicket,详见获取更多转发信息 * referrerInfo object 来源信息。从另一个小程序、公众号或 App 进入小程序时返回。否则返回 {} * https://developers.weixin.qq.com/minigame/dev/api/base/app/life-cycle/qq.getLaunchOptionsSync.html * @static * @returns {LaunchOptions} * @memberof QQMiniGameAPI */ public static getLaunchOptionsSync_custom() { // let result = { scene: 0, query: null, shareTicket: "", referrerInfo: null }; if (AppPlatform.is_QQ_PLAY_custom()) { let obj = window["qq"].getLaunchOptionsSync() console.log("场景值 " + obj.scene); let str = JSON.stringify(obj.query); console.log("Query参数 " + str); let key = obj.query["key"]; console.log("Query参数:key " + key); console.log("ShareTicket " + obj.shareTicket); console.log("ReferrerInfo.appId " + obj.referrerInfo.appId); console.log("ReferrerInfo.extraData " + obj.referrerInfo.extraData); return obj; } let obj = { scene: 1001, query: "", shareTicket: "", appId: "", extraData: "" } return obj; } //---------------------------------------------------------------------- /** * 打开微信左上角分享转发点击事件,在游戏逻辑中调用一次即可 * 注意此方法只会在真机上执行,在微信模拟器环境下点击转发按钮什么都不会发生 * * @static * @param {string} titel 分享标题 * @param {string} imageUrl 分享图片地址 * @param {Function} [success] 成功回调函数(可不填) * @param {Function} [fail] 失败回调函数(可不填) * @param {Function} [complate] 完成回调函数,成功失败都会执行(可不填) * @memberof QQMiniGameAPI */ public static SetShareMenu_custom(titel: string, imageUrl: string, success?: Function, fail?: Function, complate?: Function) { if (AppPlatform.is_QQ_PLAY_custom()) { console.log("小游戏设置转发按钮"); window["qq"].showShareMenu({ withShareTicket: false, success: success, fail: fail, complete: complate }); window["qq"].onShareAppMessage(function () { return { title: titel, imageUrl: imageUrl } }); } } //显示QQ狂点界面1,此接口添加了对场景值,IP地区的判断 //data 传入界面的参数 格式 :{ Complete : Function , PrizeCount : String | Number} //onSuccess 界面成功打开回调 //onFail 界面打开失败回调 public static tryShowWXCrazyClick_custom(): boolean { let launchScene = QQMiniGameAPI.getLaunchOptionsSync_custom().scene; let noEnterBySearch: boolean = true; let wudianSceneList = AppSwitchConfig.getInstance_custom().getAppSwitchData_custom().wudianSceneList_custom; for (let i = 0; i < wudianSceneList.length; ++i) { let wudianSceneValue = wudianSceneList[i]; if (launchScene == wudianSceneValue) { noEnterBySearch = false; } } let ipBlocked = wudianMgr.ryw_GetIpBlocked_custom(); let wudian = AppSwitchConfig.getInstance_custom().getAppSwitchData_custom().wudian_custom; let kuangdianBanner = AppSwitchConfig.getInstance_custom().getAppSwitchData_custom().qqcfg_custom.kuangdianBanner_custom; if (AppConfig.Versions_custom == AppSwitchConfig.getInstance_custom().getAppSwitchData_custom().qqcfg_custom.qqversions_custom && ipBlocked && noEnterBySearch && 1 == wudian && 1 == kuangdianBanner) { return true; } else { return false; } } //显示QQ狂点界面2,此接口添加了对场景值,IP地区的判断 //data 传入界面的参数 格式 :{ Complete : Function , PrizeCount : String | Number} //onSuccess 界面成功打开回调 //onFail 界面打开失败回调 public static tryShowWXCrazyClick2_custom(): boolean { let launchScene = QQMiniGameAPI.getLaunchOptionsSync_custom().scene; let noEnterBySearch: boolean = true; let wudianSceneList = AppSwitchConfig.getInstance_custom().getAppSwitchData_custom().wudianSceneList_custom; for (let i = 0; i < wudianSceneList.length; ++i) { let wudianSceneValue = wudianSceneList[i]; if (launchScene == wudianSceneValue) { noEnterBySearch = false; } } let ipBlocked = wudianMgr.ryw_GetIpBlocked_custom(); let wudian = AppSwitchConfig.getInstance_custom().getAppSwitchData_custom().wudian_custom; let kuangdianBox = AppSwitchConfig.getInstance_custom().getAppSwitchData_custom().qqcfg_custom.kuangdianBox_custom; if (AppConfig.Versions_custom == AppSwitchConfig.getInstance_custom().getAppSwitchData_custom().qqcfg_custom.qqversions_custom && ipBlocked && noEnterBySearch && 1 == wudian && 1 == kuangdianBox) { return true; } else { return false; } } //---------------------- 积木广告 ------------------------------------- / /** * 1000 后端错误调用失败 该项错误不是开发者的异常情况 一般情况下忽略一段时间即可恢复。 * 1001 参数错误 使用方法错误 可以前往 q.qq.com 确认具体教程(小程序和小游戏分别有各自的教程,可以在顶部选项中,“设计”一栏的右侧进行切换。 * 1002 广告单元无效 可能是拼写错误、或者误用了其他 APP 的广告 ID 请重新前往 q.qq.com 确认广告位 ID。 * 1003 内部错误 该项错误不是开发者的异常情况 一般情况下忽略一段时间即可恢复。 * 1004 无适合的广告 广告不是每一次都会出现,这次没有出现可能是由于该用户不适合浏览广告 属于正常情况,且开发者需要针对这种情况做形态上的兼容。 * 1005 广告组件审核中 你的广告正在被审核,无法展现广告 请前往 q.qq.com 确认审核状态,且开发者需要针对这种情况做形态上的兼容。 * 1006 广告组件被驳回 你的广告审核失败,无法展现广告 请前往 q.qq.com 确认审核状态,且开发者需要针对这种情况做形态上的兼容 * 1007 广告组件被驳回 你的广告能力已经被封禁,封禁期间无法展现广告 请前往 q.qq.com 确认小程序广告封禁状态。 * 1008 广告单元已关闭 该广告位的广告能力已经被关闭 请前往 q.qq.com 重新打开对应广告位的展现。 * 1009 广告位置设置错误 该广告的位置设置导致展示不全 请重新调整广告的位置 */ private static mAppBlockAd_custom = null; private static onFail: Function; private static screenWidth_custom: number = NaN; private static screenHeight_custom: number; private static pixelRatio_custom: number; private static isIos_custom: boolean; private static isAppBlockAdLoading_custom: boolean = false; private static skdVersion_custom: string; private static supportSDKVersion_custom = "1.15.0"; /** * * @param onFail 错误回调 * @param centerX centerX 单位为px * @param top top px值 * @param orientation landscape | vertical */ public static showAppBlockAd_custom(onFail?: Function, top: number = 150, orientation: string = "landscape") { if (!AppPlatform.is_QQ_PLAY_custom()) return; if (!window["qq"].createBlockAd) return; if (QQMiniGameAPI.isAppBlockAdLoading_custom) return; QQMiniGameAPI.isAppBlockAdLoading_custom = true; if (isNaN(QQMiniGameAPI.screenWidth_custom)) { try { let res = window["qq"].getSystemInfoSync(); QQMiniGameAPI.screenWidth_custom = res.windowWidth; QQMiniGameAPI.screenHeight_custom = res.windowHeight; QQMiniGameAPI.pixelRatio_custom = res.pixelRatio; QQMiniGameAPI.isIos_custom = res.platform == "ios"; QQMiniGameAPI.skdVersion_custom = res.SDKVersion; //IOS下使用DP单位,left,top均为DP,android使用PX QQMiniGameAPI.screenWidth_custom *= (QQMiniGameAPI.isIos_custom ? 1 : QQMiniGameAPI.pixelRatio_custom); QQMiniGameAPI.screenHeight_custom *= (QQMiniGameAPI.isIos_custom ? 1 : QQMiniGameAPI.pixelRatio_custom); console.log("getSystemInfoSync ==> ", res.SDKVersion); } catch (e) { if (onFail) onFail(); return; } } let arr1: Array = QQMiniGameAPI.skdVersion_custom.split(".").map(v => parseInt(v)); let arr2: Array = QQMiniGameAPI.supportSDKVersion_custom.split(".").map(v => parseInt(v)); let isSupport: boolean = true; for (let i: number = 0; i < arr1.length; i++) { if (arr1[i] < arr2[i]) { isSupport = false; break; } } if (!isSupport) return; console.log("QQMiniGameAPI.showAppBlockAd ", top); QQMiniGameAPI.destroyAppBlockAd_custom(); QQMiniGameAPI.onFail = onFail; let min: number = QQMiniGameAPI.isIos_custom ? 32 / QQMiniGameAPI.pixelRatio_custom : 32; let mTop: number = Math.max(min, top / (QQMiniGameAPI.isIos_custom ? QQMiniGameAPI.pixelRatio_custom : 1)); let mLeft: number = QQMiniGameAPI.screenWidth_custom / 2; mLeft = min; QQMiniGameAPI.mAppBlockAd_custom = window["qq"].createBlockAd({ adUnitId: AppConfig.qq_blockAdArray_custom[Math.floor(Math.random() * AppConfig.qq_blockAdArray_custom.length)], style: { left: mLeft, top: mTop }, size: QQMiniGameAPI.AppBlockSize_custom, orientation: orientation, }); // QQMiniGameAPI.mAppBlockAd.onResize(QQMiniGameAPI.appBlockADResize); QQMiniGameAPI.mAppBlockAd_custom.onError(QQMiniGameAPI.appBlockADError_custom); QQMiniGameAPI.mAppBlockAd_custom.show().catch((err) => { console.log('积木广告 显示失败 :' + JSON.stringify(err)); if (onFail) { onFail(); } }); QQMiniGameAPI.isAppBlockAdLoading_custom = false; } private static appBlockADResize_custom(obj: any): void { if (!QQMiniGameAPI.mAppBlockAd_custom["style"]) return; let realWidth = obj.width; let realHeight = obj.height; // console.log("onResize ==> qq ", screenWidth, "=", realWidth, "=", screenHeight, "=", realHeight); // if (!isNaN(centerX)) { // mLeft = ((screenWidth - realWidth) / 2) + (centerX / (isIos ? pixelRatio : 1)); // } else if (!isNaN(left)) { // left /= (isIos ? pixelRatio : 1); // mLeft = Math.max(33, left); // } else if (!isNaN(right)) { // right /= (isIos ? pixelRatio : 1); // mLeft = Math.max(screenWidth - realWidth, right); // } // console.log("onResize ==> 3 ", mLeft, "=", mTop); // QQMiniGameAPI.mAppBlockAd.style.left = mLeft; let mLeft = (QQMiniGameAPI.screenWidth_custom - realWidth) / 2; QQMiniGameAPI.mAppBlockAd_custom.style.left = mLeft; } private static appBlockADError_custom(err: any): void { console.log("积木广告 加载失败 ", JSON.stringify(err)); if (QQMiniGameAPI.onFail) QQMiniGameAPI.onFail(); } public static destroyAppBlockAd_custom() { if (!AppPlatform.is_QQ_PLAY_custom()) return; if (!QQMiniGameAPI.mAppBlockAd_custom) return; console.log("QQMiniGameAPI.destroyAppBlockAd"); QQMiniGameAPI.mAppBlockAd_custom.offResize(QQMiniGameAPI.appBlockADResize_custom); QQMiniGameAPI.mAppBlockAd_custom.offError(QQMiniGameAPI.appBlockADError_custom); QQMiniGameAPI.mAppBlockAd_custom.hide(); QQMiniGameAPI.mAppBlockAd_custom.destroy(); QQMiniGameAPI.mAppBlockAd_custom = null; } //---------------------- 积木广告 ------------------------------------- / }