/* *********************************************************************************** * 功能:moyusdk * 版本: v1.3 * 备注:更新日志 2021.10.11: 初版功能发布 2021.10.15: 更新音频基础功能 2022.1.5: 增加实名认证 2022.1.12 增加防沉迷 *********************************************************************************** */ declare enum MoyuPlat { web=0, //h5 网页 tt=1, //头条 op=2, //oppo vv=3, //vivo mz=4, //魅族 wx=5, //微信 qq=6, //qq f399=7, //4399h5 ks=8, //快手 hw=9, //华为 xm=10, //小米rpk csj=11, //穿山甲(官包) mmy=12, //摸摸鱼 xmApk=13, //小米apk vvApk=14, //vvapk ios=15, //IOS平台 t33=16, //233 hwkb=17, //好玩快爆 opApk=18, //oppoAPK hhw=19, //猴好玩 f399Apk=20, //4399APK ttApk=21, //头条APK a233=22, //233买量 } declare enum MoyuRankType { total='total', //总榜 month='month', //月榜 week='week', //周榜 day='day' //日榜 } declare class MoyuNative { id:any; //广告ID 一般都是string title:string; //广告标题文本 desc:string; //描述文本 btnTxt:string; //按钮文本 icon:string; //icon url 当前广告可能没有 image:string; //image url } declare class MoyuCfg { myId:number; //摸鱼ID myKey:string; //摸鱼KEY plat:MoyuPlat; //平台 version:number; //版本号,默认0 ads:MoyuAds; //广告参数 } declare class MoyuAds { //头条 ttVideoId:string; ttBannerId:string; ttInsertId:string; //oppo opVideoId:string; opBannerId:string; opNativeId:string; //vivo vvVideoId:string; vvBannerId:string; vvInsertId:string; vvNativeId:string; //魅族 mzVideoId:string; mzBannerId:string; mzInsertId:string; //微信 wxVideoId:string; wxBannerId:string; wxInsertId:string; //qq qqVideoId:string; qqBannerId:string; qqInsertId:string; qqBoxId:string; qqBlockId:string; //华为 hwVideoId:string; hwBannerId:string; hwInsertId:string; //快手 ksVideoId:string; ksBannerId:string; ksInsertId:string; } interface MoyuUser { /** * 是否授权用户 */ isAuth:boolean; /** * 实名 */ realName:string; /** * 实名码(身份证号) */ realCode:string; /** * 本地用户唯一ID */ userId:string; /** * 授权用户唯一ID */ openId:string; /** * 昵称 */ nickName:string; /** * 头像url */ headIcon:string; /** * 用户性别,0: 未知;1:男性;2:女性 */ gender:number; /** * 用户所在城市(可能取不到) */ city:string; /** * 用户年龄 */ age:number; /** * 用户创建时间(第一次登陆时间) * 返回的一个时间戳time,可通过getDate(time)来获取日期格式 */ createTime:number; //创建时间 /** * 用户登陆次数(进入游戏次数) */ loginCount:number; /** * 用户视频广告统计,数组 * 第一个数为成功次数,第二个数为未看完次数 */ videoCount:number[]; } declare class Moyu { /** * 摸鱼SDK初始化 * let cfg=new MoyuCfg(); cfg.myId=110; cfg.myKey='abcdefg1234567'; cfg.plat=MoyuPlat.tt; cfg.version=0; cfg.ads.ttVideoId='xxx'; MoyuSdk.Inst.init(cfg,this,()=>{ //.... },true); * myId 摸鱼分配的id * mykey 摸鱼密钥 * plat 当前平台 MoyuPlat * version 自定义线上版本号(注意是线上版本号),为了区分当前审核与线上版本 * ads 广告ID组配置, * * @param cfg 信息配置 * @param caller 执行域 * @param call sdk初始化完成回调,在一定要SDK返回信息后进行的内容可以在回调后做 * @param debug 是否开启调试信息,上线后建议关闭false,默认关闭 * */ static init(cfg?:any,caller?:any,call?:Function,debug?:boolean); /** * 初始化app平台应用(一般是在需要传递参数来初始化使用) * @param msg 参数 */ static initApp(msg?:string) /** * Targo买量统计(原生APP) * @param appid Targo的appid * @param key Targo的key */ static initTargoApp(appid:string,key:string) /** * 退出(关闭),部分平台无效 */ static exit() /** * 防沉迷初始化(实名成年账号激活也无效) * @param active true=激活 */ static initFCM(active:boolean) /** * 可玩游戏时间,防沉迷账号返回对应可玩时间,成年账号返回9999。 * 返回0则表示进入防沉迷,不能再玩。 * 22——8点返回0; */ static get gameTime():number /** * 是否已实名 * true表示已实名认证过了 */ static get isRealName() /** * 是否需要进行实名验证(不需要的平台返回false,认证过的返回true) */ static get needRealName() /** * 实名认证 * @param name 姓名 * @param code 身份证号码 * @param call 认证回调 * authenticate('xx','xxx',(res)=>{ * res==true表示认证成功 * }) */ static authenticate(name:string,code:string,call:Function) /** * 是否需要显示用户协议 */ static get hasAgree() /** * 是否审核中... */ static get isLegal() static set isLegal(legal:boolean) /** * 是否屏蔽区域... */ static get isMasked() /** * 用户协议是否同意 * @param agree true表示同意 */ static userAgree(agree:boolean) /** * 加载分包资源,game.json的分包配置 * @param sub 分包名 * @param update 分包下载时进度更新 * * Moyu.loadSubRes("sub",(pro)=>{ * console.log(pro); * }).then(()=>{ console.log( "load done"); }); */ static loadSubRes(sub:string,update?:Function) /** * 用户信息初始化 * @param caller 执行域 this * @param call 回调 * @param force 强力授权(如抖音授权被拒绝后,再授权则不会发起,force=true则会弹出权限设置页面,一般是用户主动点击授权来使用,未有相关功能的平台调用无效.) * 不获取对应信息则不传,传入则表示需要。(主要是获取账号唯一不变的openid) * oppo获取openid不需要; * @param key 对应平台应用申请时分配的 rpk平台一般叫appKey ,微信字节小游戏一般叫appid * @param secret 对应平台后台查看,如重新查看变化后需要更新。 * @param pkgName 对应包名(RPK等平台使用),没有不填写 * * 回调中返回用户信息MoyuUser */ static initUser(caller:any,call:Function,force?:boolean,key?:string,secret?:string,pkgName?:string) /** * 返回用户信息MoyuUser; * 要拉取授权信息,请先调用initUser(); * 包含的数据见MoyuUser; */ static getUserInfo():MoyuUser /** * 创建微信授权按钮,返回按钮对象btn,根据页面显隐做对应调整:btn.show();btn.hide(); * 非微信平台或者不需要在创建时返回null; * @param posx 屏幕位置x的百分比,如0.5表示屏幕中心 * @param posy 屏幕位置y的百分比,如0.5表示屏幕中心 * @param width 宽度 * @param height 高度 * @param imgUrl 图片地址 res/img/xx.png; * @param call 授权成功回调 * 按钮锚点已设在正中心,方便计算适配位置。 */ static createWXUserBtn(posx,posy,width,height,imgUrl,call) /** * 获取平台系统信息 */ static getSystemInfo() /** * 设置改变时 * @param isAudio 是否允许播放声音 true=允许 * @param isVt 是否开启震动 true=震动 */ static onSetting(isAudio:boolean,isVt:boolean) /** * 游戏开始时(游戏核心玩法开始),便于打点统计 * @param value 游戏进度,第几个or第几次== */ static onGameStart(value:number) /** * 游戏结束时 * @param value 游戏进度,第几个or第几次== * @param result 结果:胜利=1;失败=2,默认其他0; */ static onGameEnd(value:number,result?:number) /** * 保存数据到服务器 * @param data 数据,json * @param key 存储key,默认使用openid(请先保证获取到openid,没有存储出错),或者自定义一个唯一ID */ static saveServerData(data:{},key?:string) /** * 获取服务器数据 * @param call 回调 * @param caller 执行域 * @param key 保存数据的key,默认使用openid(请先保证已取到openid) */ static getServerData(call:Function,caller?,key?:string) /** * 清楚本地SDK数据 */ static clearData() /** * 获取平台的屏幕尺寸(有别于引擎返回的) */ static getPlatSize() /** * 显示更多游戏,字节平台请确保game.json里有配置 * 4399h5必须要有 */ static showMoreGame() /** * 获取摸鱼更多游戏推荐列表(抖音、微信) * @param caller 执行域 * @param call 回调 * getGameList(this,(list)=>{}) * list 数据结构 myId:string, //摸鱼id type:number, //类别,控制其显示位置,没位置要求可忽略 name:string, //游戏名称 icon:string, //游戏图标url banner:string, //游戏banner图url,需要banner推荐的使用,没有则不要使用banner推荐 appId:string, //微信APPID, 微信跳转APP使用 videoId:string, //抖音视频ID, 抖音跳转视频使用(通过跳转到对应视频来进入对应游戏) launchNum:number,//玩家次数,如 3542人在玩;1.2w人在玩(大于1w请做数字转换显示) */ static getGameList(caller,call) /** * 上传排行榜数据(需要摸鱼先分配一个id) * @param rankId 排行榜id * @param rankScore 排行榜 * @param fresh 刷新(替换已上传的数据,不比较),默认false(比之前的值小则不会上传) * @param force 强制上传(默认是false未授权用户数据不上传) * @param data 自定义数据,用户数据默认已包含,该数据是排行榜需要的额外数据。 * @param dataId 唯一ID,单数据依据(默认会使用用户userId) */ static upRankData(rankId:number,rankScore:number,fresh?:boolean,force?:boolean,data?:{},dataId?:string) /** * 获取排行榜数据 * @param data 排行拉取数据标识 * @param caller 执行域 * @param call 回调 * @param fresh 刷新(默认false),true表示重新拉取数据(不必每次都刷新) * * 排行榜top50数据 * let data={ rankId:10100, //排行榜id type:MoyuRankType.total, //排行榜类别 page:1, //拉取第几页 pageSize:50, //一页数量 } */ static getRankList(data:{},caller:any,call:Function,fresh?:boolean) /** * 创建一个视频广告,若不需要自定义设置,可在moyu初始化配置广告ID直接初始化 * @param aid 广告ID */ public initVideoAd(aid:string) /** * 播放一个视频广告 * @param scusess 成功回调 * @param adtype 广告分类,不同位置 * @param caller 执行域 this * @param fail 失败回调,可以通过监控onMoyuTip:20101来统一获取视频未播放完整提示 */ static showVideoAd(scusess?:Function,adtype?:number,caller?,fail?:Function) /** * 创建一个banner广告,若不需要自定义设置,可在moyu初始化配置广告ID直接初始化 * @param aid 广告ID * @param ft 刷新时间(默认30秒) * @param posx 位置x 默认0.5 * @param posy 位置y 默认1 * 默认在底部中间 */ static initBannerAd(aid:string,ft?:number, posx?:number,posy?:number) /** * banner广告显示 * @param show true显示,false隐藏 */ static showBannerAd(show:boolean) /** * banner广告位置 * * @param posx 广告中心点在屏幕宽度的百分比,如0.5表示横向在屏幕中间 * @param posy 广告中心点在屏幕高度的百分比。0在顶部,1在底部 * 大部分平台都不提供改变banner大小了,目前只提供改变位置 */ static setBannerPos(posx:number,posy:number) /** * 初始化插屏广告 * @param aid 插屏广告ID */ static initInsertAd(aid) /** * 显示一个插屏广告,可延迟间隔显示 * @param delay 延迟时间,毫秒 * @param gap 间隔时间(在上一次插屏或视频广告后多少时间内不会播放),毫秒 * @param type 插屏类型,只有一种插屏的默认不用管,APP多类型插屏传其他值,原生接入时做对应实现。 */ static showInsertAd(delay?:number,gap?:number,type?:string) /** * 初始化一个模版广告,如果ID相同则删除上一个 * @param aid 广告ID * @param left 距离左边比值,如0.5表示横向中间开始 * @param top 距离顶部比值,如0表示贴近顶部开始 * @param freshTime 刷新时间,默认30秒 */ static initCustomAd(aid:string,left:number,top:number,freshTime?:number) /** * 根据ID控制对应的模版广告显隐 * @param aid 广告id * @param show true表示显示 */ static showCustomAd(aid:string,show:boolean) /** * qq Block广告 * @param show */ static showBlock(show:boolean) /** * 盒子广告 qq */ static showBox() /** * 获取一个原生广告 * @param caller 执行域 * @param call 回调 * 回调中返回原生广告信息MoyuNative * * icon可能为空 */ static getNativeAd(caller:any,call:Function) /** * 原生广告上报 (ov平台) * @param type 1显示上报 2点击上报,默认2 * 拉取到广告后,已默认显示上报 * 一般只需要在点击时 reportNative() 即可 */ static reportNative(type?:number) /** * 设置分享信息,请在分享前添加 * @param title 必要,分享标题(需要跟游戏主题或者名字相关联) * @param keys 关键标签(["标签1","标签2"..]),推荐添加 * @param shareId 审核了的分享ID * @param imgUrl 分享的图片链接,可不添加 * @param query 启动传参(如k1=v1&k2=v2),getLaunchOptions()获取启动参数 */ static setShareInfo(title:string,keys?:string[],shareId?:string,imgUrl?:string,query?:string) /** * 游戏分享(字节、微信、QQ、快手)。 * 若是需要视频分享,可先用canShare检测是否可以视频分享。 * 微信分享已没有成功失败判断,发起分享回来后都算成功。 * 已正确录屏会默认视频分享,若录屏后却需要普通分享,调用Moyu.shareVideo='';清除储存的录屏。 * @param call 分享回调 * @param caller 执行域 * @param imgUrl 分享图片的url https://xxx.xxx/x; * @param query 分享链接中带的参数,通过链接启动的人可以从getLaunchOptions获取带出的参数 * 字节视频分享成功后回调可以得到视频id * shareGame((res)=>{}); * res==false;表示分享失败。 */ static shareGame(call?:Function,caller?:any,imgUrl?:string,query?:string) /** * 检测能否进行分享,返回分类情况 * 0:不能分享(平台不支持),不应显示分享相关 * 1:能普通分享,不支持视频分享,不应显示视频分享相关 * 2:录屏失败,不能分享 * 3:录屏时间太短,不能分享 * ... * >100:表示能进行视频分享。 * * 2和3 要给出反馈提示:录屏时间太短,不能分享;并关闭分享(方便过审)。 * * 视频分享要在recordEnd()回调后用才能保证获取视频录制情况正确 */ static canShare():number /** * 设置分享视频 * @param path 完整路径 */ static set shareVideo(path:string) /** * 获取分享视频(路径) */ static get shareVideo():string /** * 获取启动参数 */ static getLaunchOptions() /** * 添加桌面快捷方式 * @param call 添加后回调 * @param caller 执行域 this */ static addLnk(call?:Function,caller?:any) /** * 能否进行关注 * 抖音无法检查已关注 返回true * 快手返回true表示可以,false表示不能关注(已关注、平台不支持、环境不支持) * 其他平台目前没有 否是false */ static get canFocus():boolean /** * 发起关注官方号 * 目前有抖音与快手平台可以 * @param call 关注回调,true=成功,false=失败 * @param caller 执行域 */ static focus(call?:Function,caller?:any) /**录屏相关功能不支持平台直接无效,调用不影响 */ /** * @param time 录屏时间,最大300秒,不建议大于60秒 * @param clip 裁剪片段,裁剪保留最后的一个时间时段 * recordGame(60,false) //表示录屏60秒 * recordGame(30,true) //表示最大录屏,裁剪最后的30秒 */ static recordGame(time:number,clip?:boolean) /** * 暂停录屏 * @param pause ture 暂停,false 恢复录屏 */ static recordPause(pause:boolean) /** * 录屏结束 * @param caller 执行域 * @param call 回调 * recordEnd((path)=>{ * conslog.log(path); //录屏地址 * }) */ static recordEnd(caller,call) /** * 需求真实时间,请在获取时间前设置(因网络原因,尽量提前设置) * @param need 是否需要真实时间 */ static needRealTime(need?:boolean) /** * 获取当前时间戳,默认毫秒.. * @param sencond 是否以秒返回 */ static getTime(sencond?):number /** * 获取当前日期 默认number * number:20211010 * string:2021/10/10 * @param time 可以传入一个时间戳返回日期格式,默认0返回当前时间 * @param isNum 是否以数字方式返回 */ static getDate(time?:number,isNum?:boolean):number|string /** * 获取星期几 */ static getWeek():number /** * 获取当前第几周(这一年的) */ static getWeekNum():number /** * 是否为新的一天。 * 每新的一天上线后第一次取值为true,其他时间为false。 * 项目里应该只有一次调用。 * @param caller 执行域 this * @param call 回调 true=新的一天 * Moyu.isNewDay(this,(isnew)=>{ * if(isnew)console.log("新的一天"); * }) */ static isNewDay(caller:any,call:Function) /** * 是否为新的一周 * 每周一上线后第一次取值为true,其他时间为false * @param caller 执行域 this * @param call 回调 true=新的一周 * 同isNewDay */ static isNewWeek(caller:any,call:Function) /** * 数据打点(相关功能配置还需要后台开启) * @param key 关键key * @param data 打点数据,打点数据最多2条 如 sendDataEvent("level",{id:1,result:2}); */ static sendDataEvent(key:string,data?:{}) /** * 发送一个POST请求 * @param url url * @param data 数据 * @param call 回调 * senPost('hxxx.xx.x',data,()=>{}) */ static sendPost(url,data,call) /** * 发送一个Get请求 * @param url url * @param call 回调 * senGet('hxxx.xx.x',()=>{}) */ static sendGet(url,call) /** * 获得一个随机数(包含最小值,不包含最大值) * @param min 最小值 * @param max 最大值 */ static getRandom(min: number, max: number): number /** * 获得一个随机字符串 * @param len 字符串长度 */ static getRandString(len:number): string /** * * @param call * @param caller */ static getLocation(call,caller?) /** * 跳转到视频播放页面(抖音才支持,字节其他平台不支持) * 刚发布的视频可能跳转不成功,需要等一会 * @param vid 视频ID */ static playVideo(vid) /** * 监听sdk反馈的提示信息,只注册一次 * @param call 回调 * @param caller 执行域 * id查询MoyuDoc.ts * Moyu.setOnTipCall((id)=>{ * if(id==20012) * console.log("切换到后台了"); * else(id==20301) * console.log("分享失败了"); * ... * },this) */ static setOnTipCall(call:Function,caller?:any) /** * 是否有快捷方式(不支持平台也返回true) * true表示不应该进行创建了 */ static get hasShortCut() /** * 是否有阴影 * true 可以显示阴影,fasle不显示(平台不支持) */ static get hasShadow() /********平台音效相关接口*********/ /** * 是否需要使用ogg音频(apk包都使用的ogg) */ static get isNeedOgg() /** * 是否需要平台功能播放音频 * 引擎音频在一些平台上会出现广告无法暂停声音等,可使用平台音频功能来播放。 */ static get isNeedPlatAudio() /** * 播放一个声音(同声音最多可同时存在3个) * @param path 完整路径 * @param loop 是否循环 */ static playSound(path:string,loop?:boolean): void /** * 停止声音(相同路径的声音都会停止) * @param path 完整路径 */ static stopSound(path:string) /** * 播放背景音乐(只有一个) * @param path 路径 */ static playMusic(path:string) /** * 停止播放背景音乐 */ static stopMusic() /** * 背景音暂停 * @param pause 暂停=true false=恢复 */ static pauseMusic(pause:boolean) /** * 播放一个声音并在结束时回调 * @param caller 执行域 * @param call 回调 * @param path 路径 */ static playAudioWithEnd(caller:any,call:Function,path:string) /** * 静音后发起的声音播放都无效 * @param mute 静音 */ static mute(mute:boolean): void /** * 音频扩展 * 返回一个平台创建的音频实例 * 自行控制 */ static createAudio():any /** * 获取平台自定义数据,为空可能是没有配置或没拉取到 */ static get platData():any /** * 获取平台运营配置,为空可能是没有配置或没拉取到 */ static get platConfig():any /************平台判断***********/ /** * 该平台是否有用户信息 */ static get hasUserInfo() /** * 是否空平台(不在对应平台上也是) */ static get isVoidPlat() /** * 当前平台 */ static get platType() /** * 是否该平台 * @param plat 平台 */ static isPlat(plat) /** * 是否微信平台 */ static get isWx() /** * 是否qq平台 */ static get isQq() /** * 是否web平台 */ static get isWeb() /** * 是否小米APK包 */ static get isXMApk() /** * 是否4399h5小游戏 */ static get isF399() /** * 是否vivo平台 */ static get isVivo() /** * 是否oppo平台 */ static get isOppo() /** * 是否头条平台(包含抖音) */ static get isTT() static get isTTApk() /** * 是否抖音平台(抖音、抖音极速版) * 视频跳转要抖音平台才支持 */ static get isDouyin() /** * 是否魅族平台 */ static get isMZ() /** * 是否233平台 */ static get isT33() /** * 是否摸摸鱼(穿山甲android sdk) */ static get isMmy() /** * 是否快手平台 */ static get isKs() /** * 是否华为平台(rpk) */ static get isHw() /** * 是否vivo APK平台 */ static get isVVApk() /** * 是否vivo APK平台 */ static get isOPApk() /** * 是否IOS平台 */ static get isIos() /** * 震动 默认短震动 * @param time 震动时间,默认100 * time 震动信息 单个数字为持续时间 数组情况奇数索引为持续时间偶数索引为等待时间,毫秒单位 //小游戏暂不考虑间断震动 * >=400表示长震动 * 小游戏平台只有长短震动,不与时间匹配。 */ static vibration(time?: number | number[]): void //异步相关 ts使用前安装库npm install tslib /** * 异步-等待几秒 * @param num 秒 */ static waitSeconds(num:number) /** * 异步-下一帧 */ static waitNext() /** * 异步-等待几帧 * @param num 帧 */ static waitFrames(num:number) }