import { _decorator, error, SpriteFrame, sys } from "cc"; import { config } from "./config"; import { uiManager } from "./manager/uiManager"; //管理广告、分享、SDK相关内容的组件 export class SdkUtil { public static platform: string = 'cocos'; //平台 public static imgAd: SpriteFrame = null!; public static imgShare: SpriteFrame = null!; public static isDebugMode: boolean = false; public static onlineInterval: number = -1; public static isEnableVibrate: boolean = true; public static isCheckOffline: boolean = false; //登录后会检查是否展示登录界面,而且只检查一次 public static isWatchVideoAd: boolean = false;//是否正在播放广告 public static isEnableMoving: boolean = false;//是否允许屏幕上下移动 public static isEnableZoom: boolean = false;//是否允许屏幕缩放 public static arrLockDiary = [];//未解锁日记 public static vibrateInterval: number = 100;//两次震动之间的间隔,AppActivity里面的震动间隔也是100 public static vibratePreTime: number = 0;//上次震动时间 public static KS_GAME:boolean = false; //是否ks游戏 public static videoAd:any =null; public static isLookAd:boolean = false; //是否在看广告 public static tt_systemInfo: any = null; //抖音_系统信息 private static tt_isSupportSidebar:boolean = false; //抖音_是否支持侧边栏 private static tt_isToEnterFromSidebar:boolean = false; //抖音_是否从侧边栏进入 private static tt_gameRecorder:any = null; //抖音游戏录制 private static tt_recordVideoPath:string = ''; //抖音录制视频路径 private static tt_totalRecord:number = 4000; //抖音总录制时间 private static tt_isRecording:boolean = false; //抖音是否录制中 //------------------------------ 公共 ------------------------------// public static init() { if(sys.platform==sys.Platform.WECHAT_GAME) { let isKSGame = typeof KSGameGlobal != 'undefined' // console.log('isKSGame=',isKSGame) SdkUtil.KS_GAME = isKSGame } this.ttGetSystemInfo(()=> { this.ttRegisterInfo() }) } // 自定义事件统计 public static customEventStatistics(eventType: string, objParams?: any) { eventType = eventType.toString(); if (!objParams) { objParams = {}; } // console.log({'eventType': eventType},{'objParams': objParams}); if (this.platform === 'wx') { //@ts-ignore if (window['wx'] && window['wx']['aldSendEvent']) { //@ts-ignore window.wx['aldSendEvent'](eventType, objParams); } } //@ts-ignore if (this.platform === 'cocos' && window.cocosAnalytics && window.cocosAnalytics.isInited()) { console.log("###统计", eventType, objParams); //@ts-ignore window.cocosAnalytics.CACustomEvent.onStarted(eventType, objParams); } } // 检测授权用户信息 public static checkAuthUserInfo(cb) { if(sys.platform == sys.Platform.WECHAT_GAME && !SdkUtil.KS_GAME) { SdkUtil.wxCheckAuthUserInfo(cb) } else { cb(true) } } // 登录 public static login(call){ if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.login({ force: true, success(res) { console.log(`tt_login 调用成功:${res.code} ${res.anonymousCode}`); call({"code":res.code,"anonymousCode":res.anonymousCode}) }, fail(err) { console.log(`tt_login 调用失败:${err}`); // call(null) }, }); } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { ks.login({ success(res) { console.log(`ks_login 调用成功:${res.code}`); call({"code":res.code}) }, fali(err) { console.log(`ks_login 调用失败:${err}`); // call(null) } }) } else { wx.login({ success(res) { console.log(`wx_login 调用成功:${res.code}`); call({"code":res.code}) }, fali(err) { console.log(`wx_login 调用失败:${err}`); // call(null) } }) } } else{ call(null) } } // 获取用户信息 public static getUserInfo(call){ if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.getUserInfo({ // withCredentials: true, // withRealNameAuthenticationInfo: true, success(res) { console.log(`tt_getUserInfo 调用成功`, res); call(res.userInfo) }, fail(err) { console.log(`tt_getUserInfo 调用失败`, err); }, }); } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { ks.getUserInfo({ success(res) { console.log(`ks_getUserInfo 调用成功`, res); call(res.userInfo) }, fail(err) { console.log(`ks_getUserInfo 调用失败`, err); }, }) } else { SdkUtil.wxCheckAuthUserInfo((is_true)=>{ if(is_true) { wx.getUserInfo({ success(res) { console.log(`wx_getUserInfo 调用成功`, res); call(res.userInfo) }, fail(err) { console.log(`wx_getUserInfo 调用失败`, err); }, }) } }) } } else{ call(null) } } // 震动 public static vibrateShort(){ if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.vibrateShort({ success(res) {}, fail(err) {} }); } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { ks.vibrateShort({ success(res) {}, fail(err) {} }); } else { wx.vibrateShort({ success(res) {}, fail(err) {} }); } } } // 关于loading public static showLoading(title:string) { if(title.length<=0) { return } if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.showLoading({ title: title, success(res) {},fail(err) {} }) } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { ks.showLoading({ title: title, success(res) {},fail(err) {} }) } else { wx.showLoading({ title: title, success(res) {},fail(err) {} }) } } } public static hideLoading() { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.hideLoading({ success(res) { }, fail(err) { } }); } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { ks.hideLoading({ success(res) { }, fail(err) { } }); } else { wx.hideLoading({ success(res) { }, fail(err) { } }); } } } // 展示toast public static showToast(title:string,duration=2000,success_cb=null, fail_cb=null) { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.showToast({ title: title, duration: duration, success(res) { if(success_cb){ success_cb() } }, fail(err) { if(fail_cb) { fail_cb() } }, }); } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { ks.showToast({ title: title, duration: duration, success(res) { if(success_cb){ success_cb() } }, fail(err) { if(fail_cb) { fail_cb() } }, }); } else { wx.showToast({ title: title, duration: duration, success(res) { if(success_cb){ success_cb() } }, fail(err) { if(fail_cb) { fail_cb() } }, }); } } } // 展示modal (确定:res.confirm 取消:res.cancel) public static showModal(title:string, content:string, suc_cb=null, fail_cb=null, confirmText:string='确定', showCancel:boolean=true, cancelText:string='取消') { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.showModal({ title: title, content: content, confirmText: confirmText, showCancel: showCancel, cancelText: cancelText, success(res) { if(suc_cb) { suc_cb(res) } }, fail(err) { if(fail_cb){ fail_cb(err) } }, }); } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { ks.showModal({ title: title, content: content, confirmText: confirmText, showCancel: showCancel, cancelText: cancelText, success(res) { if(suc_cb) { suc_cb(res) } }, fail(err) { if(fail_cb){ fail_cb(err) } }, }); } else { wx.showModal({ title: title, content: content, confirmText: confirmText, showCancel: showCancel, cancelText: cancelText, success(res) { if(suc_cb) { suc_cb(res) } }, fail(err) { if(fail_cb){ fail_cb(err) } }, }); } } else { if(suc_cb) { suc_cb({'confirm':true}) } } } // 展示actionSheet (点击的索引:`res.tapIndex`) public static showActionSheet(item_list:string[], suc_cb=null, fail_cb=null) { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.showActionSheet({ item_list, success(res) { if(suc_cb) { suc_cb(res) } }, fail(err) { if(fail_cb) { fail_cb(err) } }, }); } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { ks.showActionSheet({ item_list, success(res) { if(suc_cb) { suc_cb(res) } }, fail(err) { if(fail_cb) { fail_cb(err) } }, }); } else { wx.showActionSheet({ item_list, success(res) { if(suc_cb) { suc_cb(res) } }, fail(err) { if(fail_cb) { fail_cb(err) } }, }); } } } // 选择系统相册 public static choosSystemImage(call_back) { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.chooseImage({ sourceType: ["album"], count:1, success:(res)=>{ // console.log('chooseImage调用成功=${res}') if(res.tempFilePaths.length>0) { call_back(res.tempFilePaths[0])} }, fail(err) { console.log(`tt_chooseImage调用失败=${err}`); }, }) } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { ks.chooseMedia({ mediaType: ["image"], sourceType: ["album"], count:1, success:(res)=>{ // console.log('chooseImage调用成功=${res}') if(res.tempFilePaths.length>0) { call_back(res.tempFilePaths[0])} }, fail(err) { console.log(`wx_chooseImage调用失败=${err}`); }, }) } else { wx.chooseMedia({ mediaType: ["image"], sourceType: ["album"], count:1, success:(res)=>{ // console.log('chooseImage调用成功=${res}') if(res.tempFilePaths.length>0) { call_back(res.tempFilePaths[0])} }, fail(err) { console.log(`wx_chooseImage调用失败=${err}`); }, }) } } } // 检测显示添加桌面 public static checkIsShowAddDesktop():boolean { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { if(SdkUtil.tt_systemInfo.appName=='Douyin' || SdkUtil.tt_systemInfo.appName=='douyin_lite') { return true } } return false } // 分享游戏 public static shareGame(title: string, desc:string, call_back=null) { if(desc==undefined||desc==null) { desc = config.gameName} if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { SdkUtil.ttShare(title,desc, null, ()=>{ this.showToast('分享失败') }) } else if(sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { SdkUtil.ksShare(desc) } else { SdkUtil.wxShare(desc) } }else{ if(call_back) { call_back(true) } } } public static shareGameVideo() { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { let videoPath = SdkUtil.ttGetScreenRecordingVideoPath() uiManager.Instance().showLoading() this.ttShareScreenRecordVideo(config.gameName,videoPath,()=>{ uiManager.Instance().hideLoading() }, ()=>{ uiManager.Instance().hideLoading() }) } } // 获取广告id public static getAdId(ad_type = config.ADS_TYPE.UNKNOWN):string { let ad_id = "" if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { if(ad_type==config.ADS_TYPE.GAME_INFINITE_DEGREE_VIDEO) { ad_id = config.TT_CONFIG.ADS_ID_INFINITE_DEGREE_VIDEO } else if(ad_type==config.ADS_TYPE.GAME_RELIFE_VIDEO) { ad_id = config.TT_CONFIG.ADS_ID_RELIFE_VIDEO } else if(ad_type==config.ADS_TYPE.GAME_RESTART) { ad_id = config.TT_CONFIG.ADS_ID_RESTART } else if(ad_type==config.ADS_TYPE.GAME_SIGN_DOUBLE) { ad_id = config.TT_CONFIG.ADS_ID_SIGN_DOUBLE } else if(ad_type==config.ADS_TYPE.GAME_SIGN_BUQIAN) { ad_id = config.TT_CONFIG.ADS_ID_SIGN_BUQIAN } } else if (sys.platform == sys.Platform.WECHAT_GAME) { if(SdkUtil.KS_GAME) { if(ad_type==config.ADS_TYPE.GAME_INFINITE_DEGREE_VIDEO) { ad_id = config.KS_CONFIG.ADS_ID_INFINITE_DEGREE_VIDEO } else if(ad_type==config.ADS_TYPE.GAME_RELIFE_VIDEO) { ad_id = config.KS_CONFIG.ADS_ID_RELIFE_VIDEO } else if(ad_type==config.ADS_TYPE.GAME_RESTART) { ad_id = config.KS_CONFIG.ADS_ID_RESTART } else if(ad_type==config.ADS_TYPE.GAME_SIGN_DOUBLE) { ad_id = config.KS_CONFIG.ADS_ID_SIGN_DOUBLE } else if(ad_type==config.ADS_TYPE.GAME_SIGN_BUQIAN) { ad_id = config.KS_CONFIG.ADS_ID_SIGN_BUQIAN } } else { if(ad_type==config.ADS_TYPE.GAME_INFINITE_DEGREE_VIDEO) { ad_id = config.WX_CONFIG.ADS_ID_INFINITE_DEGREE_VIDEO } else if(ad_type==config.ADS_TYPE.GAME_RELIFE_VIDEO) { ad_id = config.WX_CONFIG.ADS_ID_RELIFE_VIDEO } else if(ad_type==config.ADS_TYPE.GAME_RESTART) { ad_id = config.WX_CONFIG.ADS_ID_RESTART } else if(ad_type==config.ADS_TYPE.GAME_SIGN_DOUBLE) { ad_id = config.WX_CONFIG.ADS_ID_SIGN_DOUBLE } else if(ad_type==config.ADS_TYPE.GAME_SIGN_BUQIAN) { ad_id = config.WX_CONFIG.ADS_ID_SIGN_BUQIAN } } } return ad_id } // 显示激励视频广告 public static showVideoAd(_adUnitId: string, call_back) { if(sys.platform==sys.Platform.BYTEDANCE_MINI_GAME) { uiManager.Instance().showLoading() SdkUtil.videoAd = tt.createRewardedVideoAd({adUnitId: _adUnitId}); } else if(sys.platform==sys.Platform.WECHAT_GAME) { call_back({"isEnded":true}) // uiManager.Instance().showLoading() // if(SdkUtil.KS_GAME) { // SdkUtil.videoAd = ks.createRewardedVideoAd({adUnitId: _adUnitId}); // } else { // SdkUtil.videoAd = wx.createRewardedVideoAd({adUnitId: _adUnitId}); // } } else { call_back({"isEnded":true}) return } if(SdkUtil.videoAd==null){ uiManager.Instance().hideLoading() return } SdkUtil.videoAd.onLoad(() => { SdkUtil.isLookAd = true SdkUtil.videoAd.show(); console.log("广告加载完成"); }); SdkUtil.videoAd.onClose((res) => { // console.log('广告关闭') uiManager.Instance().hideLoading() SdkUtil.isLookAd = false SdkUtil.videoAd.destroy() call_back(res) }); SdkUtil.videoAd.onError((res) => { // console.log('广告错误') uiManager.Instance().hideLoading() SdkUtil.isLookAd = false SdkUtil.videoAd.destroy() let errorString = res.errCode + '-' + res.errMsg call_back({isEnded:false,errorString:errorString}) }); SdkUtil.videoAd.load() } //------------------------------ 微信相关 ------------------------------// // 微信检查授权用户信息 public static wxCheckAuthUserInfo(cb) { wx.getSetting({ success(res) { if(res.authSetting['scope.userInfo'] === true) { // 已经授权 cb(true) } else { cb(false) } }, fail(err) { cb(false) } }) } // 微信分享 public static wxShare(title: string, imageUrl: string='') { // console.log('wx分享=',title, 'imageUrl=',imageUrl) wx.showShareMenu({ withShareTicket: true, // shareAppMessage(可以删除):显示分享给好友选项,shareTimeline(可以删除):显示分享至朋友圈选项 // 可以只开启前者。如果要开启后者,则两者必须都开启才能生效。 // menus: ['shareAppMessage', 'shareTimeline'], menus: ['shareAppMessage'], complete: () => {} }); // 主动分享 wx.shareAppMessage({ title: title, imageUrl: imageUrl }); } //------------------------------ 快手相关 ------------------------------// // 快手分享 public static ksShare(title: string, imageUrl:string='', success_cb = null, fail_cb = null) { // console.log('ks分享=',title, 'imageUrl=',imageUrl) ks.shareAppMessage({ success:(res)=>{ if(success_cb){ success_cb(res) } }, fail:(err)=>{ if(fail_cb){ fail_cb(err) }} }); } //------------------------------ 抖音相关 ------------------------------// // 抖音获取系统信息 public static ttGetSystemInfo(callback) { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.getSystemInfo({ success:(res) => { // console.log('tt.getSystemInfo=',res) // appName: "Douyin" appName: "douyin_lite" SdkUtil.tt_systemInfo = res callback() } }) } } // 分享 public static ttShare(title:string, desc:string, sucess_cb=null, fail_cb=null) { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.shareAppMessage({ title: title, desc: desc, success() { console.log("分享成功") // this.showToast('分享成功') if(sucess_cb) { sucess_cb() } }, fail(e) { console.log("分享失败",e) if(fail_cb) { fail_cb() } }, }); } } // 抖音添加快捷键(目前仅支持:抖音(Douyin) 和 抖音极速版(douyin_lite)) public static ttAddShortcut(onSuccess:Function = null, onFail:Function = null) { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { if(SdkUtil.tt_systemInfo.appName=='Douyin'||SdkUtil.tt_systemInfo.appName=='douyin_lite') { if(SdkUtil.tt_systemInfo.brand=='Apple') { tt.addShortcut({ success() { console.log("添加桌面成功"); onSuccess && onSuccess(null) }, fail(err) { console.log("添加桌面失败", err.errMsg); onFail && onFail(err) }, }); } else if(SdkUtil.tt_systemInfo.brand=='Android') { // 检测只支持安卓 tt.checkShortcut({ success(res) { console.log("检查快捷方式", res.status); if(res.status.exist==false||res.status.needUpdate==true) { tt.addShortcut({ success() { console.log("添加桌面成功"); onSuccess && onSuccess(null) }, fail(err) { console.log("添加桌面失败", err.errMsg); onFail && onFail(err) }, }); } }, fail(err) { console.log("检查快捷方式失败", err.errMsg); onFail && onFail(err) }, }); } } } } // 抖音注册信息 public static ttRegisterInfo() { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.onShow((res) => { console.log('tt.onShow =', res) // console.log('res=',res) if(res.scene == '021036' || res.scene == '101036') { SdkUtil.tt_isToEnterFromSidebar = true } if(res.scene.launch_from == 'homepage' && res.scene.location == 'sidebar_card') { SdkUtil.tt_isToEnterFromSidebar = true } }); tt.onHide(()=>{ console.log('tt.onHide') if(SdkUtil.isLookAd==false) { // statisticsManager.uploadRecordUserLevel(false) } }) tt.checkScene({ scene: "sidebar", success: (res) => { console.log("check scene success: ", res.isExist); if(res.isExist != undefined || res.isExist != null) { SdkUtil.tt_isSupportSidebar = res.isExist } }, fail: (res) => { console.log("check scene fail:", res); } }); let options = tt.getLaunchOptionsSync() console.log('getLaunchOptionsSync=', options) if(options.scene == '021036' || options.scene == '101036') { SdkUtil.tt_isToEnterFromSidebar = true } } } // 抖音检测是否显示奖励 public static ttCheckSceneShowRewards():boolean { return SdkUtil.tt_isSupportSidebar } // 抖音检测是否从侧边栏进入 public static ttCheckToEnterFromSidebar():boolean { return SdkUtil.tt_isToEnterFromSidebar } // 抖音导航到侧边栏场景 public static ttNavToSidebarScene() { if(sys.platform == sys.Platform.BYTEDANCE_MINI_GAME) { tt.navigateToScene({ scene: "sidebar", success: (res) => { // console.log("navigate to scene success"); }, fail: (res) => { // console.log("navigate to scene fail: ", res); }, }); } } // 抖音开启屏幕录制 public static ttStartScreenRecording() { if(sys.platform!=sys.Platform.BYTEDANCE_MINI_GAME) { return } if(this.tt_systemInfo.platform == 'devtools') { console.log('抖音模拟器') return } if(this.tt_isRecording==true) { this.ttStopScreenRecording() } if(!this.tt_gameRecorder) { this.tt_gameRecorder = tt.getGameRecorderManager() } this.tt_gameRecorder.start({duration: this.tt_totalRecord}) this.tt_gameRecorder.onStart(()=> { this.tt_isRecording = true // console.log('GameRecorder onStart onStart onStart') }) this.tt_gameRecorder.onStop((res)=> { // console.log('GameRecorder onStop onStop onStop=',res) this.tt_isRecording = false this.tt_recordVideoPath = res.videoPath }) this.tt_gameRecorder.onError((e)=> { console.log('ttGameRecord error:',e) }) } // 抖音关闭屏幕录制 public static ttStopScreenRecording(isClearVideoPath:boolean = false) { if(sys.platform!=sys.Platform.BYTEDANCE_MINI_GAME) { return } if(this.tt_gameRecorder == null) { return } if(isClearVideoPath) { this.tt_recordVideoPath = ""; } this.tt_gameRecorder.stop() } // 抖音获取屏幕录制视频文件 public static ttGetScreenRecordingVideoPath():string { return this.tt_recordVideoPath; } // 抖音分享屏幕录制视频 private static ttShareScreenRecordVideo(title: string, videoPath: string, onSuccess: Function = null, onFail: Function = null) { console.log('tt_录制视频路径=',videoPath) if(videoPath.length<=0) { return } tt.shareAppMessage({ title: title, templateId: config.TT_CONFIG.SHARE_RECORD_VIDEO_ID, channel: "video", extra: { videoTopics: [config.gameName], hashtag_list: ['小游戏','小程序'], videoPath: videoPath, withVideoId: true, }, success: (res) => { console.log('抖音分享屏幕录制视频,成功=',res) onSuccess && onSuccess(); }, fail: (e) => { // 当前今日头条ios无法获得分享成功回调 if(res.platform === 'ios' && res.appName === 'Toutiao') console.log('抖音分享屏幕录制视频,失败=',e) onFail && onFail() } }) } }