mgtvApi.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. import { sys, Vec2, Node } from "cc";
  2. import { authorizeParams, getUserInfoParams, loadParams, loginParams, MiniGameApiBase, ModalParams, recordedGameScreenParams, toastParams } from "./MiniGameApiBase";
  3. import { GameCfg } from "../Config/GameCfg";
  4. export interface mgtvVideoAd {
  5. // 通过 load 方法主动预加载广告内容。
  6. // 此外,在显示广告出现问题时也可以尝试主动 load 一次。
  7. // 该方法返回一个 Promise,如果广告已经自动拉取成功,调用该方法返回一个 resolved Promise;
  8. load: () => Promise<any>;
  9. // 广告创建后默认是隐藏的,可以通过该方法显示广告。 该方法返回一个 Promise 对象。当广告组件正常获取素材时,该 Promise 对象会是一个 resolved Promise。当广告组件发生错误时,会是一个 rejected Promise,参数与error事件监听器获得的参数相同。
  10. show: () => Promise<any>;
  11. //绑定 load 事件的监听器,用户在手动调用 load 方法后,广告组件会预先加载。 广告组件成功拉取广告素材时会触发load事件的监听器。
  12. //确保监听此事件时,开发者主动调用过 load 方法。
  13. onLoad: (listener: Function) => void;
  14. // 解除绑定 load 事件的监听器。
  15. offLoad: (listener: Function) => void;
  16. //绑定 error 事件的监听器。 广告组件拉取广告素材和其他情况下如果发生错误,会触发error事件的监听器。监听器会获得一个包含errCode和errMsg属性的对象参数。
  17. // errCode 详情
  18. onError: (listener: (error: any) => void) => void;
  19. // 解除绑定 error 事件的监听器。
  20. offError: (listener: Function) => void;
  21. // 绑定 close 事件的监听器。 当用户点击了 Video 广告上的关闭按钮时,会触发close事件的监听器。监听器会获得一个包含isEnded属性的对象参数,表征用户是否完整观看了视频。
  22. onClose: (listener: (res: { isEnded: boolean }) => void) => void;
  23. //解除绑定 close 事件的监听器。
  24. offClose: (listener: Function) => void;
  25. //
  26. destroy();
  27. }
  28. const mgtv: any = window['mgtv'];
  29. export default class mgtvApi extends MiniGameApiBase {
  30. checkScene(successCB?: Function, errorCB?: Function) {
  31. throw new Error("Method not implemented.");
  32. }
  33. navigateToScene(successCB?: Function, errorCB?: Function) {
  34. throw new Error("Method not implemented.");
  35. }
  36. getStorageSync(key?: string) {
  37. let data = null;
  38. data = sys.localStorage.getItem(key)
  39. return data
  40. }
  41. removeStorage(key?: string) {
  42. sys.localStorage.removeItem(key);
  43. console.log("removeStorage")
  44. }
  45. getDeviceInfo() {
  46. try {
  47. let info = mgtv.getDeviceInfo()
  48. console.log("设备信息:", info)
  49. console.error("xxxxxxxx")
  50. if (info == undefined) return "unknown"
  51. let str: string = info.platform
  52. let res: RegExpMatchArray = str.match(/ipad/i)
  53. console.log("userAgent: ", str)
  54. if (res) return "ipad"
  55. if (sys.isBrowser && sys.os == sys.OS.IOS) {
  56. res = str.match(/iphone/i)
  57. if (res) return "iphone"
  58. if (window.screen.height > window.screen.width) return "ipad"
  59. return "mac"
  60. }
  61. return "unknown"
  62. } catch (error) {
  63. return "unknown"
  64. }
  65. }
  66. setUnlockAllTime(time: number) {
  67. console.log("setUnlockAllTime")
  68. }
  69. getUnlockAllTime(call: Function) {
  70. console.log("getUnlockAllTime")
  71. }
  72. setUnitState(state?: string) {
  73. console.log("setUnitState")
  74. }
  75. reportAnalytics(eventName: string, data?: { [key: string]: string | number | boolean; }) {
  76. console.log("reportAnalytics")
  77. }
  78. setSoundInfo(sound?: boolean, music?: boolean) {
  79. console.log("setSoundInfo")
  80. }
  81. protected m_AppId: string = "mg93xxbzti90iuqgp";
  82. protected m_Secret: string = "";
  83. protected m_VideoAdIdIndex: number = 0;
  84. protected m_VideoAdIdList: string[] = ["bqixzt3s9wpdfhkj", "uphfj3d5ojv4rsfz", "jt7xyddjrdtuir7m"];
  85. protected m_BannerAdIdIndex: number = 0;
  86. protected m_BannerAdId: string[] = [];
  87. protected m_InsertAdIdIndex: number = 0;
  88. protected m_InsertAdId: string[] = [];
  89. protected m_videoAd: mgtvVideoAd = undefined;
  90. protected m_BannerAd: any = undefined;
  91. validAppId(): void {
  92. if (GameCfg.SYSTEM_LOG) console.log("mgtv-api-validAppId");
  93. }
  94. ready(): void {
  95. if (GameCfg.SYSTEM_LOG) console.log("mgtv-api-ready");
  96. }
  97. getUserInfo(params: getUserInfoParams): void {
  98. mgtv.getUserInfo(params);
  99. }
  100. showToast(params: toastParams): void {
  101. mgtv.showToast(params);
  102. }
  103. showLoading(params: loadParams): void {
  104. mgtv.showLoading(params);
  105. }
  106. hideLoading(): void {
  107. mgtv.hideLoading();
  108. }
  109. showModal(params: ModalParams): void {
  110. }
  111. authorize(params: authorizeParams): void {
  112. params.success && params.success();
  113. }
  114. login(params: loginParams): void {
  115. mgtv.login(params);
  116. }
  117. getVideoAdId(): string {
  118. const id: string = this.m_VideoAdIdList[this.m_VideoAdIdIndex];
  119. this.m_VideoAdIdIndex++;
  120. if (this.m_VideoAdIdIndex >= this.m_VideoAdIdList.length) {
  121. this.m_VideoAdIdIndex = 0;
  122. }
  123. return id;
  124. }
  125. loadAndShowVideoAd(successCB: () => void, errorCB: (error: any) => void, completeCB?: () => void, reportAnalyticsExplain?: string): void {
  126. if (this.m_videoAd == null) {
  127. this.m_videoAd = mgtv.createRewardedVideoAd({ adUnitId: this.getVideoAdId() });
  128. }
  129. let onClose = (res) => {
  130. if (res && res.isEnded) {
  131. // 给予奖励
  132. successCB();
  133. // O1HD.getManagers().soundMgr.setSoundEnabled(true);
  134. } else {
  135. //
  136. errorCB('视频中途退出');
  137. // O1HD.getManagers().soundMgr.setSoundEnabled(true);
  138. }
  139. this.m_videoAd.offClose(onClose);
  140. completeCB && completeCB();
  141. };
  142. //
  143. this.m_videoAd.load().then(() => { //加载视频广告完成
  144. this.m_videoAd.show().then(() => { //播放视频广告完成
  145. this.m_videoAd.onClose(onClose);
  146. // O1HD.getManagers().soundMgr.setSoundEnabled(true);
  147. // O1HD.getManagers().soundMgr.playMusic("BGM1");
  148. }).catch((err) => { //播放视频广告错误
  149. errorCB('视频显示错误 :' + JSON.stringify(err));
  150. this.m_videoAd.offClose(onClose);
  151. completeCB && completeCB();
  152. })
  153. }).catch((err) => { //加载视频广告错误
  154. errorCB('视频加载错误 :' + JSON.stringify(err));
  155. this.m_videoAd.offClose(onClose);
  156. completeCB && completeCB();
  157. });
  158. }
  159. getInsertAdId(): string {
  160. const id: string = this.m_InsertAdId[this.m_InsertAdIdIndex];
  161. this.m_InsertAdIdIndex++;
  162. if (this.m_InsertAdIdIndex >= this.m_InsertAdId.length) {
  163. this.m_InsertAdIdIndex = 0;
  164. }
  165. return id;
  166. }
  167. showInsertAd(onAdClose: () => void, onFailed: () => void): void {
  168. console.log("加抖音 插屏 广告");
  169. const adId = this.getInsertAdId();
  170. let insertAd = mgtv.createInterstitialAd({
  171. adUnitId: adId,
  172. });
  173. insertAd.load();
  174. insertAd.onLoad(() => {
  175. console.warn('插屏广告 加载完成');
  176. insertAd.show().catch((err) => {
  177. console.warn('插屏广告 显示失败 :' + JSON.stringify(err));
  178. insertAd.destroy();
  179. insertAd = null;
  180. if (onFailed) {
  181. onFailed();
  182. }
  183. });
  184. });
  185. insertAd.onError((err) => {
  186. console.warn('插屏广告 加载失败' + JSON.stringify(err));
  187. insertAd.destroy();
  188. insertAd = null;
  189. if (onFailed) {
  190. onFailed();
  191. }
  192. });
  193. insertAd.onClose(() => {
  194. console.warn('插屏广告 关闭');
  195. if (insertAd != null) {
  196. insertAd.destroy();
  197. insertAd = null;
  198. }
  199. if (onAdClose) {
  200. onAdClose();
  201. }
  202. });
  203. }
  204. protected bannerSuccese: boolean = false;
  205. getBannerAdId(): string {
  206. const id: string = this.m_BannerAdId[this.m_BannerAdIdIndex];
  207. this.m_BannerAdIdIndex++;
  208. if (this.m_BannerAdIdIndex >= this.m_BannerAdId.length) {
  209. this.m_BannerAdIdIndex = 0;
  210. }
  211. return id;
  212. }
  213. showBannerAD(node: Node, successCB?: () => void, errorCB?: (error: any) => void, onCloseCB?: () => void,
  214. setBannerPos?: ({ screenWidth, screenHeight }: { screenWidth: any; screenHeight: any; }) => Vec2): void {
  215. const { screenWidth, screenHeight } = mgtv.getSystemInfoSync();
  216. let pos: Vec2 = setBannerPos && setBannerPos({ screenWidth, screenHeight }) || new Vec2(0, 0);
  217. var targetBannerAdWidth = 200;
  218. if (this.m_BannerAd && !this.bannerSuccese) {
  219. this.m_BannerAd.destroy()
  220. this.m_BannerAd = null
  221. }
  222. if (this.m_BannerAd) {
  223. this.m_BannerAd.show()
  224. .then(() => {
  225. successCB && successCB();
  226. console.log("---------------------Banner广告直接显示成功");
  227. })
  228. .catch((err) => {
  229. errorCB && errorCB(err);
  230. console.log("---------------------Banner广告直接显示组件出现问题", JSON.stringify(err));
  231. });
  232. return
  233. }
  234. this.bannerSuccese = true
  235. if (this.m_BannerAd == null) {
  236. this.m_BannerAd = mgtv.createBannerAd({
  237. adUnitId: this.getBannerAdId(),
  238. adIntervals: 30,
  239. style: {
  240. // width: targetBannerAdWidth,
  241. // top: screenHeight - (targetBannerAdWidth / 16) * 9, // 根据系统约定尺寸计算出广告高度
  242. left: pos.x,
  243. top: pos.y,
  244. }
  245. });//创建
  246. }
  247. this.m_BannerAd.onResize(size => {
  248. console.log(size.width, size.height, "banner长宽");
  249. // this.m_BannerAd.style.top = size.height;//screenHeight - size.height;
  250. // this.m_BannerAd.style.left = size.width;//(screenWidth - size.width) / 2;
  251. // setBannerPosition && setBannerPosition({ x: this.m_BannerAd.style.left, y: this.m_BannerAd.style.top },
  252. // { width: size.width, height: size.height });
  253. });
  254. this.m_BannerAd.onLoad(() => {
  255. if (node == null || !node.active || !node.isValid) {
  256. console.log("---------------------------------------------------------");
  257. return
  258. }
  259. this.bannerSuccese = false;
  260. this.m_BannerAd
  261. .show()
  262. .then(() => {
  263. console.log("---------------------Banner广告显示成功");
  264. this.m_BannerAd.onHide(() => {
  265. console.log('mgtv-banner 广告隐藏');
  266. onCloseCB && onCloseCB();
  267. });
  268. })
  269. .catch((err) => {
  270. console.log("---------------------Banner广告组件显示出现问题", JSON.stringify(err));
  271. });
  272. });
  273. this.m_BannerAd.onError((e) => {
  274. this.bannerSuccese = false
  275. console.log("---------------------Banner广告加载错误,错误原因:", JSON.stringify(e))
  276. });
  277. }
  278. hideBanner() {
  279. // if (this.m_BannerAd != null) {
  280. // this.m_BannerAd.hide();
  281. // }
  282. }
  283. recordedGameScreenStart(params: recordedGameScreenParams, onStart?: (res: any) => void): void {
  284. console.log("mgtv-api-recordedGameScreenStart");
  285. onStart && onStart(null);
  286. }
  287. recordedGameScreenStop() {
  288. console.log("mgtv-api-recordedGameScreenStop");
  289. return true;
  290. }
  291. shareRecordedGameScreen(successCb?: () => void, failCb?: (e?: any) => void): void {
  292. console.log("mgtv-api-shareRecordedGameScreen");
  293. successCb && successCb();
  294. }
  295. isHaveRecordedGameScreen(): boolean {
  296. return true;
  297. }
  298. }