1da799f5-6e62-4de6-aaef-ff22f6c186c0.js 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. "use strict";
  2. cc._RF.push(module, '1da79n1bmJN5qrv/yL2wYbA', 'FBAdManager');
  3. // common-plugin/Scripts/FaceBookSdk/FBAdManager.ts
  4. "use strict";
  5. // fb文档 https://developers.facebook.com/docs/games/instant-games/sdk/fbinstant6.3
  6. // 使用的话,直接看广告管理器 FBAdManager
  7. /*
  8. 使用步骤
  9. * 1. addXXXXAd() 添加相应的广告,以及预加载的数量(默认为3)
  10. * 1.1. 插屏 addInterstitial
  11. * 1.2. 激励视频 addRewardedVideo
  12. * 1.3. banner addBanner
  13. * 2. loadAll() 预加载所有广告实例
  14. * 3. isXXXReady() 检查是否可以播放
  15. * 3.1. 插屏 isInterstitialAdReady
  16. * 3.2. 激励视频 isRewardedVideoReady
  17. * 3.3. banner isBannerReady
  18. * 4. showXXXAsync() 播放广告,并检查播放状态
  19. * 4.1. 插屏 showInterstitialAd
  20. * 4.2. 激励视频 showRewardedVideo
  21. * 4.3. banner showBannerAsync
  22. * 5. hideXXXAsync() 隐藏广告(banner专属)
  23. * 5.1. 插屏 不需要
  24. * 5.2. 激励视频 不需要
  25. * 5.3. banner hideBannerAsync
  26. * 其他:
  27. * 6. 判断是否支持特定api
  28. * 6.1 判断是否支持banner广告
  29. //
  30. */
  31. var __extends = (this && this.__extends) || (function () {
  32. var extendStatics = function (d, b) {
  33. extendStatics = Object.setPrototypeOf ||
  34. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  35. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  36. return extendStatics(d, b);
  37. };
  38. return function (d, b) {
  39. extendStatics(d, b);
  40. function __() { this.constructor = d; }
  41. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  42. };
  43. })();
  44. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  45. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  46. return new (P || (P = Promise))(function (resolve, reject) {
  47. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  48. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  49. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  50. step((generator = generator.apply(thisArg, _arguments || [])).next());
  51. });
  52. };
  53. var __generator = (this && this.__generator) || function (thisArg, body) {
  54. var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
  55. return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
  56. function verb(n) { return function (v) { return step([n, v]); }; }
  57. function step(op) {
  58. if (f) throw new TypeError("Generator is already executing.");
  59. while (_) try {
  60. if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
  61. if (y = 0, t) op = [op[0] & 2, t.value];
  62. switch (op[0]) {
  63. case 0: case 1: t = op; break;
  64. case 4: _.label++; return { value: op[1], done: false };
  65. case 5: _.label++; y = op[1]; op = [0]; continue;
  66. case 7: op = _.ops.pop(); _.trys.pop(); continue;
  67. default:
  68. if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
  69. if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
  70. if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
  71. if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
  72. if (t[2]) _.ops.pop();
  73. _.trys.pop(); continue;
  74. }
  75. op = body.call(thisArg, _);
  76. } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
  77. if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
  78. }
  79. };
  80. Object.defineProperty(exports, "__esModule", { value: true });
  81. var Utils_1 = require("../Utils");
  82. var FB_MAX_AD_INSTANCE = 3; // FB允许的最多广告实例数量
  83. var FB_INIT_AD_COUNT = 3; // 预加载的广告实例数量
  84. var FB_BANNER_REFRESH_INTERVAL = 30 + 10; // FB: Banner广告有播放间隔限制 30 seconds (由于网络原因,需要多加一点时间)
  85. var FB_INTERSTITIAL_REFRESH_INTERVAL = 30 + 10; // FB: 插屏广告有播放间隔限制
  86. var FB_REWARDED_VIDEO_REFRESH_INTERVAL = 0; // FB: 激励视频没有播放间隔限制
  87. var FB_MAX_BANNER_ERROR = 1; // banner加载连续出现N次错误后,终止加载
  88. var FB_MAX_INTERSTITIAL_ERROR = 3; // 插屏加载连续出现N次错误后,终止加载
  89. var FB_MAX_REWARDED_VIDEO_ERROR = 3; // 激励视频加载连续出现N次错误后,终止加载
  90. var FB_AUTO_LOAD_ON_PLAY = true; // 插屏、激励视频是否在播放完毕后自动加载
  91. var FB_AUTO_RELOAD_DELAY = 1; // 自动重新加载时,延迟加载等待的时间
  92. var FB_AD_DELAY_FOR_FIRST_BANNER = 0; // 首个banner广告延迟N秒显示
  93. var FB_AD_DELAY_FOR_FIRST_INTERSTITIAL = 30; // 首个插屏广告需要延迟30秒播放(避免游戏前30秒就播放广告)
  94. var FB_AD_DELAY_FOR_FIRST_REWARDED_VIDEO = 0; // 首个激励视频广告延迟N秒显示
  95. var FB_AD_TYPE;
  96. (function (FB_AD_TYPE) {
  97. FB_AD_TYPE[FB_AD_TYPE["INTERSTITIAL"] = 0] = "INTERSTITIAL";
  98. FB_AD_TYPE[FB_AD_TYPE["REWARDED_VIDEO"] = 1] = "REWARDED_VIDEO";
  99. FB_AD_TYPE[FB_AD_TYPE["BANNER"] = 2] = "BANNER";
  100. })(FB_AD_TYPE || (FB_AD_TYPE = {}));
  101. var FB_AD_STATE;
  102. (function (FB_AD_STATE) {
  103. FB_AD_STATE[FB_AD_STATE["NONE"] = 0] = "NONE";
  104. FB_AD_STATE[FB_AD_STATE["NEW"] = 1] = "NEW";
  105. FB_AD_STATE[FB_AD_STATE["LOADING"] = 2] = "LOADING";
  106. FB_AD_STATE[FB_AD_STATE["LOADED"] = 3] = "LOADED";
  107. FB_AD_STATE[FB_AD_STATE["PLAYING"] = 4] = "PLAYING";
  108. })(FB_AD_STATE || (FB_AD_STATE = {}));
  109. function getStateName(state) {
  110. var str = "NONE";
  111. switch (state) {
  112. case FB_AD_STATE.NEW:
  113. str = "NEW";
  114. break;
  115. case FB_AD_STATE.LOADING:
  116. str = "LOADING";
  117. break;
  118. case FB_AD_STATE.LOADED:
  119. str = "LOADED";
  120. break;
  121. case FB_AD_STATE.PLAYING:
  122. str = "PLAYING";
  123. break;
  124. }
  125. return str;
  126. }
  127. function waitTimeSecond(timeoutSecond, callback) {
  128. return __awaiter(this, void 0, void 0, function () {
  129. return __generator(this, function (_a) {
  130. return [2 /*return*/, new Promise(function (resolve, reject) {
  131. setTimeout(function () {
  132. if (callback) {
  133. callback();
  134. }
  135. resolve();
  136. }, timeoutSecond * 1000);
  137. })];
  138. });
  139. });
  140. }
  141. var ErrorTooManyAdInstance = {
  142. code: "EXCEED_MAX_AD_INSTANCE",
  143. message: "广告对象不允许超过 " + FB_MAX_AD_INSTANCE
  144. };
  145. var ErrorNoReadyAdInstance = {
  146. code: "NO_READY_AD_INSTANCE",
  147. message: "没有加载完毕的广告,或者广告播放太频繁"
  148. };
  149. var ErrorNotReadyForLoad = {
  150. code: "NOT_READY_FOR_LOAD",
  151. message: "当前状态不允许再次加载"
  152. };
  153. var ErrorAdIsLoading = {
  154. code: "AD_IS_LOADING",
  155. message: "广告正在加载"
  156. };
  157. var ErrorNotReadyForPlay = {
  158. code: "NOT_READY_FOR_PLAYING",
  159. message: "没有可以播放的广告"
  160. };
  161. var ErrorAdIsPlaying = {
  162. code: "AD_IS_PLAYING",
  163. message: "广告正在播放"
  164. };
  165. var ErrorNoBannerAdInstance = {
  166. code: "NO_BANNER_AD",
  167. message: "没有添加Banner广告"
  168. };
  169. var ErrorApiNotSupport = {
  170. code: "API_NOT_SUPPORT",
  171. message: "广告接口不支持"
  172. };
  173. var ErrorTooFastShow = {
  174. code: "TOO_FAST_SHOW",
  175. message: "广告播放太频繁"
  176. };
  177. var ErrorNotPlaying = {
  178. code: "NOT_PLAYING",
  179. message: "广告没有播放"
  180. };
  181. var ErrorTooManyErrors = {
  182. code: "TOO_MANY_ERRORS",
  183. message: "太多错误, 停止操作"
  184. };
  185. var FB_API_BANNER = "loadBannerAdAsync";
  186. var FB_ERROR_CODE_RATE_LIMITED = "RATE_LIMITED";
  187. var FB_ERROR_CLIENT_UNSUPPORTED_OPERATION = "CLIENT_UNSUPPORTED_OPERATION";
  188. var FB_ERROR_ADS_NO_FILL = "ADS_NO_FILL";
  189. function getOption(opt, key, defaultValue) {
  190. if (opt && typeof (opt[key]) != "undefined") {
  191. return opt[key];
  192. }
  193. return defaultValue;
  194. }
  195. // 广告计时器
  196. var AdTimer = /** @class */ (function () {
  197. function AdTimer(interval, delay) {
  198. this._lastShowTime = 0; // 上次显示时间
  199. this._refreshInterval = 0; // 刷新间隔, <=0 表示无限制
  200. this._refreshInterval = interval > 0 ? interval : 0;
  201. this._lastShowTime = 0;
  202. if (delay > 0) {
  203. this._lastShowTime = Date.now() + delay * 1000 - this._refreshInterval * 1000;
  204. }
  205. }
  206. AdTimer.prototype.isReadyToRefresh = function () {
  207. return this.getNextRefreshInterval() <= 0;
  208. };
  209. AdTimer.prototype.getNextRefreshInterval = function () {
  210. var refreshInterval = 0;
  211. if (this._refreshInterval > 0 && this._lastShowTime > 0) {
  212. var currentTime = Date.now();
  213. refreshInterval = this._refreshInterval - (currentTime - this._lastShowTime) / 1000;
  214. }
  215. return refreshInterval;
  216. };
  217. AdTimer.prototype.updateLastShowTime = function () {
  218. this._lastShowTime = Date.now();
  219. };
  220. return AdTimer;
  221. }());
  222. var FBAdUnitBase = /** @class */ (function () {
  223. function FBAdUnitBase(id, type, sharedTimer, opt) {
  224. // protected _lastShowTime:number = 0; // 上次显示时间
  225. // protected _refreshInterval:number = 0; // 刷新间隔, <=0 表示无限制
  226. this._maxLoadError = 0;
  227. this._errorCounter = 0;
  228. this._fatalError = false;
  229. this._sharedTimer = null;
  230. this._adId = id;
  231. this._state = FB_AD_STATE.NONE;
  232. this._type = type;
  233. this._sharedTimer = sharedTimer;
  234. this._fatalError = false;
  235. Utils_1.utils.showLog(!!sharedTimer, "sharedTimer is invalid", sharedTimer);
  236. // this._refreshInterval = getOption(opt, "refreshInterval", 0);
  237. this._maxLoadError = getOption(opt, "maxLoadError", 0);
  238. // const delayForFirstAd = getOption(opt, "delayForFirstAd", 0);
  239. // if(delayForFirstAd > 0) {
  240. // this._lastShowTime = Date.now() + delayForFirstAd * 1000 - this._refreshInterval * 1000;
  241. // }else{
  242. // this._lastShowTime = 0;
  243. // }
  244. }
  245. FBAdUnitBase.prototype.getStateName = function () {
  246. return getStateName(this._state);
  247. };
  248. FBAdUnitBase.prototype.getAdTypeName = function () {
  249. if (this._type == FB_AD_TYPE.INTERSTITIAL) {
  250. return "插屏广告";
  251. }
  252. if (this._type == FB_AD_TYPE.REWARDED_VIDEO) {
  253. return "激励视频广告";
  254. }
  255. if (this._type == FB_AD_TYPE.BANNER) {
  256. return "Banner";
  257. }
  258. return "UNKNOWN";
  259. };
  260. FBAdUnitBase.prototype.getInfo = function () {
  261. return "[" + this.getAdTypeName() + ":" + this._adId + ":" + this.getStateName() + "]";
  262. };
  263. FBAdUnitBase.prototype.isReadyToRefresh = function () {
  264. // return this.getNextRefreshInterval() <= 0;
  265. return this._sharedTimer.isReadyToRefresh();
  266. };
  267. FBAdUnitBase.prototype.getNextRefreshInterval = function () {
  268. return this._sharedTimer.getNextRefreshInterval();
  269. };
  270. FBAdUnitBase.prototype.updateLastShowTime = function () {
  271. this._sharedTimer.updateLastShowTime();
  272. };
  273. FBAdUnitBase.prototype.increaseErrorCounter = function () {
  274. this._errorCounter++;
  275. };
  276. FBAdUnitBase.prototype.resetErrorCounter = function () {
  277. this._errorCounter = 0;
  278. };
  279. FBAdUnitBase.prototype.setFatalError = function () {
  280. this._fatalError = true;
  281. };
  282. FBAdUnitBase.prototype.isErrorTooMany = function () {
  283. return this._fatalError || (this._maxLoadError > 0 && this._errorCounter >= this._maxLoadError);
  284. };
  285. return FBAdUnitBase;
  286. }());
  287. // 有状态的广告对象
  288. var FBStatefulAdUnit = /** @class */ (function (_super) {
  289. __extends(FBStatefulAdUnit, _super);
  290. function FBStatefulAdUnit(id, type, sharedTimer, opt) {
  291. var _this = _super.call(this, id, type, sharedTimer, opt) || this;
  292. _this._adInstance = null;
  293. _this._autoLoadOnPlay = getOption(opt, "autoLoadOnPlay", false);
  294. return _this;
  295. }
  296. // 预加载广告
  297. FBStatefulAdUnit.prototype.loadAsync = function () {
  298. return __awaiter(this, void 0, void 0, function () {
  299. var _a, e_1, delayTime;
  300. return __generator(this, function (_b) {
  301. switch (_b.label) {
  302. case 0:
  303. if (!(this._adInstance == null)) return [3 /*break*/, 4];
  304. if (!(this._state == FB_AD_STATE.NONE)) return [3 /*break*/, 2];
  305. // 只能创建一次
  306. this._state = FB_AD_STATE.NEW;
  307. Utils_1.utils.showLog("获取广告对象: " + this.getInfo());
  308. _a = this;
  309. return [4 /*yield*/, this.createAdInstanceAsync(this._adId)];
  310. case 1:
  311. _a._adInstance = _b.sent();
  312. return [3 /*break*/, 3];
  313. case 2:
  314. // 已经在创建对象了 (new-ing)
  315. Utils_1.utils.showLog("当前状态未满足加载条件, 正在获取广告对象: " + this.getInfo());
  316. return [2 /*return*/];
  317. case 3: return [3 /*break*/, 4];
  318. case 4:
  319. // [2] 检查是否满足预加载条件
  320. if (this._state != FB_AD_STATE.NEW) {
  321. // 只有 NEW 状态才能进行加载
  322. Utils_1.utils.showLog("当前状态未满足加载条件: " + this.getInfo());
  323. if (this._state == FB_AD_STATE.LOADING) {
  324. Utils_1.utils.showLog("广告正在加载中,不要重复加载" + this.getInfo());
  325. throw ErrorAdIsLoading;
  326. }
  327. else {
  328. throw ErrorNotReadyForLoad;
  329. }
  330. }
  331. if (this.isErrorTooMany()) {
  332. Utils_1.utils.showLog("太多错误,停止加载: " + this.getInfo());
  333. throw ErrorTooManyErrors;
  334. }
  335. _b.label = 5;
  336. case 5:
  337. _b.trys.push([5, 7, , 8]);
  338. // [3] 加载广告
  339. // 设置为加载中
  340. this._state = FB_AD_STATE.LOADING;
  341. Utils_1.utils.showLog("开始加载广告: " + this.getInfo());
  342. return [4 /*yield*/, this._adInstance.loadAsync()];
  343. case 6:
  344. _b.sent();
  345. // [4] 成功加载
  346. this._state = FB_AD_STATE.LOADED;
  347. this.resetErrorCounter();
  348. Utils_1.utils.showLog("广告加载成功: " + this.getInfo());
  349. return [2 /*return*/, true];
  350. case 7:
  351. e_1 = _b.sent();
  352. // [5] 加载失败
  353. // 异常能正常进入promise的catch分支
  354. // 加载失败,不需要重置 adInstance
  355. // this._adInstance = null;
  356. // 状态回退到加载前
  357. Utils_1.utils.showLog("广告加载失败: " + this.getInfo(), e_1);
  358. if (e_1.code == FB_ERROR_ADS_NO_FILL) {
  359. // 遇到 NOT FILL错误,就不能再继续加载了
  360. Utils_1.utils.showLog("广告无法填充,不再继续请求: " + this.getInfo());
  361. this.setFatalError();
  362. }
  363. else {
  364. this.increaseErrorCounter();
  365. this._state = FB_AD_STATE.NEW;
  366. delayTime = 10 * this._errorCounter + FB_AUTO_RELOAD_DELAY;
  367. Utils_1.utils.showLog("延迟" + delayTime + "秒后, 自动重新加载: " + this.getInfo());
  368. waitTimeSecond(delayTime, this.loadAsync.bind(this));
  369. }
  370. throw e_1;
  371. case 8: return [2 /*return*/];
  372. }
  373. });
  374. });
  375. };
  376. // 广告是否加载完毕
  377. FBStatefulAdUnit.prototype.isReady = function () {
  378. return this._adInstance != null && this._state == FB_AD_STATE.LOADED;
  379. };
  380. // 播放广告
  381. FBStatefulAdUnit.prototype.showAsync = function () {
  382. return __awaiter(this, void 0, void 0, function () {
  383. var e_2;
  384. return __generator(this, function (_a) {
  385. switch (_a.label) {
  386. case 0:
  387. // [1.1] 判断是否满足播放条件
  388. if (!this.isReady()) {
  389. Utils_1.utils.showLog("当前状态未满足播放条件: " + this.getInfo());
  390. if (this._state == FB_AD_STATE.PLAYING) {
  391. throw ErrorAdIsPlaying;
  392. }
  393. else {
  394. throw ErrorNotReadyForPlay;
  395. }
  396. }
  397. // [1.2] 是否满足播放间隔
  398. if (!this.isReadyToRefresh()) {
  399. Utils_1.utils.showLog("播放太频繁,还需间隔" + this.getNextRefreshInterval() + " 秒: " + this.getInfo());
  400. throw ErrorTooFastShow;
  401. }
  402. _a.label = 1;
  403. case 1:
  404. _a.trys.push([1, 3, , 4]);
  405. // [2] 播放广告
  406. // 设置为播放中
  407. this._state = FB_AD_STATE.PLAYING;
  408. Utils_1.utils.showLog("开始播放广告: " + this.getInfo());
  409. return [4 /*yield*/, this._adInstance.showAsync()];
  410. case 2:
  411. _a.sent();
  412. Utils_1.utils.showLog("播放广告完毕: " + this.getInfo());
  413. // [3] 播放完毕后重置广告对象
  414. this._adInstance = null;
  415. this._state = FB_AD_STATE.NONE;
  416. this.updateLastShowTime();
  417. // [4] 播完自动加载
  418. if (this._autoLoadOnPlay) {
  419. // TODO: 应该适当延迟
  420. Utils_1.utils.showLog("延迟" + FB_AUTO_RELOAD_DELAY + "秒后, 自动重新加载: " + this.getInfo());
  421. waitTimeSecond(FB_AUTO_RELOAD_DELAY, this.loadAsync.bind(this));
  422. }
  423. return [2 /*return*/, true];
  424. case 3:
  425. e_2 = _a.sent();
  426. // [5] 播放完毕后重置广告对象
  427. Utils_1.utils.showLog("播放广告失败: " + this.getInfo(), e_2);
  428. if (e_2.code == FB_ERROR_CODE_RATE_LIMITED) {
  429. // 播放太频繁,可忽略
  430. // 状态回退
  431. this._state = FB_AD_STATE.LOADED;
  432. }
  433. else {
  434. this._adInstance = null;
  435. this._state = FB_AD_STATE.NONE;
  436. // [6] 失败自动重新加载
  437. if (this._autoLoadOnPlay) {
  438. Utils_1.utils.showLog("延迟" + FB_AUTO_RELOAD_DELAY + "秒后, 自动重新加载: " + this.getInfo());
  439. waitTimeSecond(FB_AUTO_RELOAD_DELAY, this.loadAsync.bind(this));
  440. }
  441. }
  442. throw e_2;
  443. case 4: return [2 /*return*/];
  444. }
  445. });
  446. });
  447. };
  448. return FBStatefulAdUnit;
  449. }(FBAdUnitBase));
  450. // 插屏广告
  451. var FBInterstitialUnit = /** @class */ (function (_super) {
  452. __extends(FBInterstitialUnit, _super);
  453. function FBInterstitialUnit(id, sharedTimer, opt) {
  454. return _super.call(this, id, FB_AD_TYPE.INTERSTITIAL, sharedTimer, opt) || this;
  455. }
  456. FBInterstitialUnit.prototype.createAdInstanceAsync = function (adId) {
  457. return __awaiter(this, void 0, void 0, function () {
  458. return __generator(this, function (_a) {
  459. switch (_a.label) {
  460. case 0: return [4 /*yield*/, FBInstant.getInterstitialAdAsync(this._adId)];
  461. case 1: return [2 /*return*/, _a.sent()];
  462. }
  463. });
  464. });
  465. };
  466. return FBInterstitialUnit;
  467. }(FBStatefulAdUnit));
  468. // 激励视频广告
  469. var FBRewardedVideoUnit = /** @class */ (function (_super) {
  470. __extends(FBRewardedVideoUnit, _super);
  471. function FBRewardedVideoUnit(id, sharedTimer, opt) {
  472. return _super.call(this, id, FB_AD_TYPE.REWARDED_VIDEO, sharedTimer, opt) || this;
  473. }
  474. FBRewardedVideoUnit.prototype.createAdInstanceAsync = function (adId) {
  475. return __awaiter(this, void 0, void 0, function () {
  476. return __generator(this, function (_a) {
  477. switch (_a.label) {
  478. case 0: return [4 /*yield*/, FBInstant.getRewardedVideoAsync(this._adId)];
  479. case 1: return [2 /*return*/, _a.sent()];
  480. }
  481. });
  482. });
  483. };
  484. return FBRewardedVideoUnit;
  485. }(FBStatefulAdUnit));
  486. // 横幅广告
  487. var FBBannerUnit = /** @class */ (function (_super) {
  488. __extends(FBBannerUnit, _super);
  489. function FBBannerUnit(id, sharedTimer, opt) {
  490. return _super.call(this, id, FB_AD_TYPE.BANNER, sharedTimer, opt) || this;
  491. }
  492. // 显示Banner广告, 注意可以调用多次
  493. FBBannerUnit.prototype.showAsync = function () {
  494. return __awaiter(this, void 0, void 0, function () {
  495. var e_3;
  496. return __generator(this, function (_a) {
  497. switch (_a.label) {
  498. case 0:
  499. if (!this.isReadyToRefresh()) {
  500. Utils_1.utils.showLog("播放太频繁,还需间隔" + this.getNextRefreshInterval() + " 秒: " + this.getInfo());
  501. throw ErrorTooFastShow;
  502. }
  503. if (this.isErrorTooMany()) {
  504. Utils_1.utils.showLog("太多错误,停止加载: " + this.getInfo());
  505. throw ErrorTooManyErrors;
  506. }
  507. _a.label = 1;
  508. case 1:
  509. _a.trys.push([1, 3, , 4]);
  510. this._state = FB_AD_STATE.PLAYING;
  511. Utils_1.utils.showLog("开始显示广告: " + this.getInfo());
  512. return [4 /*yield*/, FBInstant.loadBannerAdAsync(this._adId)];
  513. case 2:
  514. _a.sent();
  515. Utils_1.utils.showLog("显示广告成功: " + this.getInfo());
  516. // 更新刷新时间
  517. this.updateLastShowTime();
  518. this.resetErrorCounter();
  519. return [3 /*break*/, 4];
  520. case 3:
  521. e_3 = _a.sent();
  522. Utils_1.utils.showLog("显示广告失败: " + this.getInfo(), e_3);
  523. if (e_3.code == FB_ERROR_CODE_RATE_LIMITED) {
  524. // 播放太频繁,可忽略
  525. // 不用重置,保留
  526. }
  527. else if (e_3.code == FB_ERROR_ADS_NO_FILL) {
  528. // 遇到 NOT FILL错误,就不能再继续加载了
  529. Utils_1.utils.showLog("广告无法填充,不再继续请求: " + this.getInfo());
  530. this.setFatalError();
  531. }
  532. else {
  533. this.increaseErrorCounter();
  534. }
  535. throw e_3;
  536. case 4: return [2 /*return*/];
  537. }
  538. });
  539. });
  540. };
  541. FBBannerUnit.prototype.hideAsync = function () {
  542. return __awaiter(this, void 0, void 0, function () {
  543. var e_4;
  544. return __generator(this, function (_a) {
  545. switch (_a.label) {
  546. case 0:
  547. if (this._state != FB_AD_STATE.PLAYING) {
  548. Utils_1.utils.showLog("广告没有在播放中: " + this.getInfo());
  549. throw ErrorNotPlaying;
  550. }
  551. _a.label = 1;
  552. case 1:
  553. _a.trys.push([1, 3, , 4]);
  554. Utils_1.utils.showLog("隐藏广告: " + this.getInfo());
  555. // TODO: 重复隐藏广告不会报错
  556. return [4 /*yield*/, FBInstant.hideBannerAdAsync()];
  557. case 2:
  558. // TODO: 重复隐藏广告不会报错
  559. _a.sent();
  560. this._state = FB_AD_STATE.NONE;
  561. return [3 /*break*/, 4];
  562. case 3:
  563. e_4 = _a.sent();
  564. Utils_1.utils.showLog("隐藏广告失败: " + this.getInfo(), e_4);
  565. // 隐藏失败不做任何操作
  566. // this._state = FB_AD_STATE.NONE;
  567. throw e_4;
  568. case 4: return [2 /*return*/];
  569. }
  570. });
  571. });
  572. };
  573. return FBBannerUnit;
  574. }(FBAdUnitBase));
  575. var FBAdManager = /** @class */ (function () {
  576. function FBAdManager() {
  577. }
  578. FBAdManager.getVersion = function () {
  579. return "1.0.2";
  580. };
  581. // 1.1 添加插屏广告
  582. // 返回已经添加的插屏广告总数
  583. FBAdManager.addInterstitial = function (id, count) {
  584. if (count === void 0) { count = FB_INIT_AD_COUNT; }
  585. if (this._interstitialTimer == null) {
  586. this._interstitialTimer = new AdTimer(this.defaultInterstitialTimerOption.refreshInterval, this.defaultInterstitialTimerOption.delayForFirstAd);
  587. }
  588. for (var i = 0; i < count; i++) {
  589. if (this._interstitialAds.length >= FB_MAX_AD_INSTANCE) {
  590. Utils_1.utils.showLog("添加插屏广告失败, 超出限制: " + this._interstitialAds.length, id);
  591. throw ErrorTooManyAdInstance;
  592. }
  593. var adUnit = new FBInterstitialUnit(id, this._interstitialTimer, this.defaultInterstitialOption);
  594. this._interstitialAds.push(adUnit);
  595. Utils_1.utils.showLog("添加插屏广告: " + id, "count: " + this._interstitialAds.length);
  596. }
  597. return this._interstitialAds.length;
  598. };
  599. // 1.2. 添加激励视频广告
  600. // 返回已经添加的激励视频总数
  601. FBAdManager.addRewardedVideo = function (id, count) {
  602. if (count === void 0) { count = FB_INIT_AD_COUNT; }
  603. if (this._rewardedVideoTimer == null) {
  604. this._rewardedVideoTimer = new AdTimer(this.defaultRewardedVideoTimerOption.refreshInterval, this.defaultRewardedVideoTimerOption.delayForFirstAd);
  605. }
  606. for (var i = 0; i < count; i++) {
  607. if (this._rewardedVideos.length >= FB_MAX_AD_INSTANCE) {
  608. Utils_1.utils.showLog("添加激励视频广告失败, 超出限制: " + this._rewardedVideos.length, id);
  609. throw ErrorTooManyAdInstance;
  610. }
  611. var adUnit = new FBRewardedVideoUnit(id, this._rewardedVideoTimer, this.defaultRewardedVideoOption);
  612. this._rewardedVideos.push(adUnit);
  613. Utils_1.utils.showLog("添加激励视频广告: " + id, "count: " + this._rewardedVideos.length);
  614. }
  615. return this._rewardedVideos.length;
  616. };
  617. // 1.3. 添加Banner广告
  618. FBAdManager.addBanner = function (id) {
  619. if (this._bannerTimer == null) {
  620. this._bannerTimer = new AdTimer(this.defaultBannerTimerOption.refreshInterval, this.defaultBannerTimerOption.delayForFirstAd);
  621. }
  622. var adUnit = new FBBannerUnit(id, this._bannerTimer, this.defaultBannerOption);
  623. this._banners.push(adUnit);
  624. Utils_1.utils.showLog("添加Banner广告: " + id, "count: " + this._banners.length);
  625. return adUnit;
  626. };
  627. // 2. 初始化和预加载
  628. // Deprecated 此方法用于保持兼容, 建议使用 loadAllAsync
  629. FBAdManager.loadAll = function () {
  630. return __awaiter(this, void 0, void 0, function () {
  631. return __generator(this, function (_a) {
  632. switch (_a.label) {
  633. case 0:
  634. Utils_1.utils.showLog("初始化广告队列");
  635. return [4 /*yield*/, this.loadAllAsync()];
  636. case 1: return [2 /*return*/, _a.sent()];
  637. }
  638. });
  639. });
  640. };
  641. // 异步顺序预加载所有广告
  642. FBAdManager.loadAllAsync = function () {
  643. return __awaiter(this, void 0, void 0, function () {
  644. var i, adUnit, e_5, i, adUnit, e_6;
  645. return __generator(this, function (_a) {
  646. switch (_a.label) {
  647. case 0:
  648. Utils_1.utils.showLog("FBAdManager Version: " + this.getVersion());
  649. Utils_1.utils.showLog("初始化广告队列");
  650. i = 0;
  651. _a.label = 1;
  652. case 1:
  653. if (!(i < this._rewardedVideos.length)) return [3 /*break*/, 7];
  654. adUnit = this._rewardedVideos[i];
  655. if (!(i > 0)) return [3 /*break*/, 3];
  656. return [4 /*yield*/, waitTimeSecond(0.1)];
  657. case 2:
  658. _a.sent();
  659. _a.label = 3;
  660. case 3:
  661. _a.trys.push([3, 5, , 6]);
  662. return [4 /*yield*/, adUnit.loadAsync()];
  663. case 4:
  664. _a.sent();
  665. return [3 /*break*/, 6];
  666. case 5:
  667. e_5 = _a.sent();
  668. return [3 /*break*/, 6];
  669. case 6:
  670. i++;
  671. return [3 /*break*/, 1];
  672. case 7:
  673. i = 0;
  674. _a.label = 8;
  675. case 8:
  676. if (!(i < this._interstitialAds.length)) return [3 /*break*/, 14];
  677. adUnit = this._interstitialAds[i];
  678. if (!(i > 0)) return [3 /*break*/, 10];
  679. return [4 /*yield*/, waitTimeSecond(0.1)];
  680. case 9:
  681. _a.sent();
  682. _a.label = 10;
  683. case 10:
  684. _a.trys.push([10, 12, , 13]);
  685. return [4 /*yield*/, adUnit.loadAsync()];
  686. case 11:
  687. _a.sent();
  688. return [3 /*break*/, 13];
  689. case 12:
  690. e_6 = _a.sent();
  691. return [3 /*break*/, 13];
  692. case 13:
  693. i++;
  694. return [3 /*break*/, 8];
  695. case 14: return [2 /*return*/];
  696. }
  697. });
  698. });
  699. };
  700. FBAdManager._isAdReady = function (type) {
  701. var adUnits = (type == FB_AD_TYPE.INTERSTITIAL) ? this._interstitialAds : this._rewardedVideos;
  702. var isReady = false;
  703. for (var i = 0; i < adUnits.length; i++) {
  704. var adUnit = adUnits[i];
  705. if (adUnit.isReady() && adUnit.isReadyToRefresh()) {
  706. isReady = true;
  707. break;
  708. }
  709. }
  710. return isReady;
  711. };
  712. FBAdManager._showAsync = function (type) {
  713. var adUnits = (type == FB_AD_TYPE.INTERSTITIAL) ? this._interstitialAds : this._rewardedVideos;
  714. var readyUnit = null;
  715. for (var i = 0; i < adUnits.length; i++) {
  716. var adUnit = adUnits[i];
  717. if (adUnit.isReady() && adUnit.isReadyToRefresh()) {
  718. readyUnit = adUnit;
  719. break;
  720. }
  721. }
  722. if (readyUnit != null) {
  723. return readyUnit.showAsync();
  724. }
  725. throw ErrorNoReadyAdInstance;
  726. };
  727. FBAdManager._getAdTimer = function (type) {
  728. if (type == FB_AD_TYPE.INTERSTITIAL) {
  729. return this._interstitialTimer;
  730. }
  731. if (type == FB_AD_TYPE.REWARDED_VIDEO) {
  732. return this._rewardedVideoTimer;
  733. }
  734. return this._bannerTimer;
  735. };
  736. // 3.1. 判断是否可以播放插屏广告
  737. FBAdManager.isInterstitialAdReady = function () {
  738. return this._isAdReady(FB_AD_TYPE.INTERSTITIAL);
  739. };
  740. // 4.1. 播放插屏广告
  741. FBAdManager.showInterstitialAd = function () {
  742. return __awaiter(this, void 0, void 0, function () {
  743. return __generator(this, function (_a) {
  744. switch (_a.label) {
  745. case 0: return [4 /*yield*/, this._showAsync(FB_AD_TYPE.INTERSTITIAL)];
  746. case 1: return [2 /*return*/, _a.sent()];
  747. }
  748. });
  749. });
  750. };
  751. // 3.2. 判断是否可以播放激励视频广告
  752. FBAdManager.isRewardedVideoReady = function () {
  753. return this._isAdReady(FB_AD_TYPE.REWARDED_VIDEO);
  754. };
  755. // 4.2. 播放激励视频广告
  756. FBAdManager.showRewardedVideo = function () {
  757. return __awaiter(this, void 0, void 0, function () {
  758. return __generator(this, function (_a) {
  759. switch (_a.label) {
  760. case 0: return [4 /*yield*/, this._showAsync(FB_AD_TYPE.REWARDED_VIDEO)];
  761. case 1: return [2 /*return*/, _a.sent()];
  762. }
  763. });
  764. });
  765. };
  766. // 6. 检查是否支持对应API
  767. FBAdManager.checkApiSupport = function (api) {
  768. if (FBInstant.getSupportedAPIs().indexOf(api) >= 0) {
  769. return true;
  770. }
  771. else {
  772. return false;
  773. }
  774. };
  775. // 6.1. 是否支持banner
  776. FBAdManager.isBannerSupport = function () {
  777. if (typeof this._bannerSupport == "undefined") {
  778. this._bannerSupport = this.checkApiSupport(FB_API_BANNER);
  779. }
  780. return this._bannerSupport;
  781. };
  782. // 3.3. banner广告是否可以刷新或者重新加载
  783. FBAdManager.isBannerReady = function () {
  784. if (this._banners.length <= 0) {
  785. throw ErrorNoBannerAdInstance;
  786. }
  787. var adUnit = this._banners[0];
  788. return adUnit.isReadyToRefresh();
  789. };
  790. // 4.3. 播放默认banner广告
  791. FBAdManager.showBannerAsync = function () {
  792. return __awaiter(this, void 0, void 0, function () {
  793. var adUnit;
  794. return __generator(this, function (_a) {
  795. switch (_a.label) {
  796. case 0:
  797. if (!this.isBannerSupport()) {
  798. throw ErrorApiNotSupport;
  799. }
  800. if (this._banners.length <= 0) {
  801. throw ErrorNoBannerAdInstance;
  802. }
  803. adUnit = this._banners[0];
  804. return [4 /*yield*/, adUnit.showAsync()];
  805. case 1: return [2 /*return*/, _a.sent()];
  806. }
  807. });
  808. });
  809. };
  810. // 5.3. 隐藏默认banner广告
  811. FBAdManager.hideBannerAsync = function () {
  812. return __awaiter(this, void 0, void 0, function () {
  813. var adUnit;
  814. return __generator(this, function (_a) {
  815. switch (_a.label) {
  816. case 0:
  817. if (!this.isBannerSupport()) {
  818. throw ErrorApiNotSupport;
  819. }
  820. if (this._banners.length <= 0) {
  821. throw ErrorNoBannerAdInstance;
  822. }
  823. adUnit = this._banners[0];
  824. return [4 /*yield*/, adUnit.hideAsync()];
  825. case 1: return [2 /*return*/, _a.sent()];
  826. }
  827. });
  828. });
  829. };
  830. FBAdManager._interstitialAds = [];
  831. FBAdManager._rewardedVideos = [];
  832. FBAdManager._banners = [];
  833. FBAdManager._interstitialTimer = null;
  834. FBAdManager._rewardedVideoTimer = null;
  835. FBAdManager._bannerTimer = null;
  836. FBAdManager._bannerSupport = undefined;
  837. // 插屏广告默认参数
  838. FBAdManager.defaultInterstitialOption = {
  839. autoLoadOnPlay: FB_AUTO_LOAD_ON_PLAY,
  840. maxLoadError: FB_MAX_INTERSTITIAL_ERROR,
  841. };
  842. // 激励视频默认参数
  843. FBAdManager.defaultRewardedVideoOption = {
  844. autoLoadOnPlay: FB_AUTO_LOAD_ON_PLAY,
  845. maxLoadError: FB_MAX_REWARDED_VIDEO_ERROR,
  846. };
  847. // banner默认参数
  848. FBAdManager.defaultBannerOption = {
  849. autoLoadOnPlay: FB_AUTO_LOAD_ON_PLAY,
  850. maxLoadError: FB_MAX_BANNER_ERROR,
  851. };
  852. // 插屏广告计时器默认参数
  853. FBAdManager.defaultInterstitialTimerOption = {
  854. refreshInterval: FB_INTERSTITIAL_REFRESH_INTERVAL,
  855. delayForFirstAd: FB_AD_DELAY_FOR_FIRST_INTERSTITIAL
  856. };
  857. // 激励视频计时器默认参数
  858. FBAdManager.defaultRewardedVideoTimerOption = {
  859. refreshInterval: FB_REWARDED_VIDEO_REFRESH_INTERVAL,
  860. delayForFirstAd: FB_AD_DELAY_FOR_FIRST_REWARDED_VIDEO
  861. };
  862. // banner计时器默认参数
  863. FBAdManager.defaultBannerTimerOption = {
  864. refreshInterval: FB_BANNER_REFRESH_INTERVAL,
  865. delayForFirstAd: FB_AD_DELAY_FOR_FIRST_BANNER
  866. };
  867. return FBAdManager;
  868. }());
  869. exports.default = FBAdManager;
  870. cc._RF.pop();