QQVideoWoBridge.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. ;
  2. (function () {
  3. //初始化Promise方法
  4. var ua = navigator.userAgent;
  5. var p_ios = ua.match(/(iPhone\sOS)\s([\d_]+)/);
  6. var p_adr = ua.match(/(Android)\s+([\d.]+)/);
  7. var isIOS = p_ios ? true : false;
  8. var isAdr = !isIOS && p_adr ? true : false;
  9. var isQQVideo = /(QQLiveBrowser)/i.test(ua) || /(QQLiveBroadcast)/i.test(ua);
  10. var isLiveApp = /(QQLiveBroadcast)/i.test(ua);
  11. var authToken = {
  12. "data": "123456",
  13. "token": "FE3D6EE5233D64C4709A733DCF9C89BA"
  14. };
  15. if (typeof (bridge) == "undefined") {
  16. var bridge = null;
  17. }
  18. //默认的Promise模型,防止出错
  19. var Deferred = function () {
  20. return {
  21. reject: function () {
  22. return this;
  23. },
  24. resolve: function () {
  25. return this;
  26. },
  27. done: function () {
  28. return this;
  29. },
  30. fail: function () {}
  31. };
  32. };
  33. if ($ && $.Deferred) {
  34. //Zepto和jquery的Promise
  35. Deferred = function () {
  36. return $.Deferred();
  37. };
  38. } else if (window.txmv && txmv.base && txmv.base.Deferred) {
  39. //腾讯视频基础库的Promise
  40. Deferred = function () {
  41. return new txmv.base.Deferred();
  42. };
  43. }
  44. function parseJSON(str_json) {
  45. var json_msg = null;
  46. try {
  47. json_msg = JSON.parse(str_json);
  48. } catch (e) {
  49. json_msg = null;
  50. }
  51. return json_msg;
  52. }
  53. var DeferInfo = {};
  54. function getDefer(key, force) {
  55. if (!DeferInfo[key] || !!force) {
  56. DeferInfo[key] = {};
  57. DeferInfo[key]["defer"] = new Deferred();
  58. }
  59. return DeferInfo[key]["defer"];
  60. }
  61. //将正确返回的回调函数与Promise模型中的resolve绑定,保证resolve的时候,也同样会调用回调函数
  62. function RsyncDefer(func_suc) {
  63. var defer = Deferred();
  64. var _funcResolve = defer.resolve;
  65. defer.resolve = function () {
  66. _funcResolve.apply(this, Array.prototype.slice.call(arguments, 0));
  67. func_suc && func_suc.apply && func_suc.apply(null, Array.prototype.slice.call(arguments, 0));
  68. };
  69. return defer;
  70. }
  71. /*
  72. * 调用接口的默认逻辑
  73. * @param
  74. * str_method 接口名
  75. * json_param 参数名
  76. * fun_suc 返回值
  77. */
  78. function _handlerDefaultTpl(str_method, json_param, func_suc) {
  79. var defer = RsyncDefer(func_suc);
  80. _Bridge(function (json_msg) {
  81. if (json_msg && json_msg.state) {
  82. defer.resolve({
  83. state: 1,
  84. msg: "No Bridge Applied!"
  85. });
  86. } else {
  87. TenvideoJSBridge.invoke(str_method, json_param, function (str_msg) {
  88. var json_res = parseJSON(str_msg);
  89. defer.resolve({
  90. state: 0,
  91. data: json_res
  92. });
  93. });
  94. }
  95. });
  96. return defer;
  97. }
  98. /** @description 获取的接口
  99. * @param
  100. func_suc 获取到接口之后的回调函数
  101. @remark 首先判断ios接口是否存在,如果不存在的话,就监听下接口ready的事件,如果再5秒钟内两者都没有获取到接口,就提示失败
  102. */
  103. function _Bridge(func_suc) {
  104. var defer = RsyncDefer(func_suc);
  105. if (window.TenvideoJSBridge) {
  106. if (isAdr) {
  107. bridge = window.Unicom;
  108. } else {
  109. bridge = window.TenvideoJSBridge;
  110. }
  111. defer.resolve();
  112. } else {
  113. document.addEventListener('onTenvideoJSBridgeReady', function () {
  114. if (isAdr) {
  115. bridge = window.Unicom;
  116. } else {
  117. bridge = window.TenvideoJSBridge;
  118. }
  119. defer.resolve();
  120. });
  121. //如果5秒钟之后,还是没有对应的接口,就直接返回false,说明拉取接口失败了。
  122. setTimeout(function () {
  123. if (!window.TenvideoJSBridge) {
  124. defer.resolve({
  125. state: 1,
  126. msg: "No Bridge Applied!"
  127. });
  128. }
  129. }, 5000);
  130. }
  131. return defer;
  132. }
  133. QQVideoBridge = {
  134. bridge: null,
  135. auth: function (token) {
  136. authToken = !!token ? token : authToken;
  137. var defer = new getDefer("auth");
  138. if (!isQQVideo) {
  139. defer.reject(-1);
  140. return defer;
  141. }
  142. _Bridge(function () {
  143. if (bridge) {
  144. if (isAdr) {
  145. var iRet = bridge.auth(authToken.data, authToken.token);
  146. defer.resolve(iRet);
  147. } else {
  148. bridge.invoke("auth", authToken, function (code) {
  149. defer.resolve(code);
  150. });
  151. }
  152. } else {
  153. defer.reject(-1);
  154. }
  155. })
  156. return defer;
  157. },
  158. getCarrierInfos: function (json_param, func_suc) {
  159. return _handlerDefaultTpl("getCarrierInfos", json_param, func_suc);
  160. },
  161. getCarrierEnableState: function (json_param, func_suc) {
  162. return _handlerDefaultTpl("getCarrierEnableState", json_param, func_suc);
  163. },
  164. getUnicomNativieInfo: function (json_param) {
  165. var defer = new getDefer("getUnicomNativieInfo");
  166. _Bridge(function () {
  167. if (bridge) {
  168. if (isAdr) {
  169. var json_msg = bridge.invoke('getUnicomNativeInfo', JSON.stringify(json_param));
  170. defer.resolve(parseJSON(json_msg));
  171. } else {
  172. if (isLiveApp) {
  173. bridge.invoke("getUnicomNativeInfo", json_param, function (json_msg) {
  174. var res = json_msg && json_msg.result;
  175. defer.resolve(res);
  176. })
  177. } else {
  178. bridge.invoke("getUnicomNativieInfo", json_param, function (json_msg) {
  179. defer.resolve(parseJSON(json_msg));
  180. })
  181. }
  182. }
  183. } else {
  184. defer.reject(-1);
  185. }
  186. })
  187. return defer;
  188. },
  189. onNetworkChange: function () {
  190. tb.cookie.set("onNetworkChange", 1, location.hostname || location.host, false, 1);
  191. location.reload();
  192. },
  193. registNetworkChange: function () {
  194. var onNetworkChange = "QQVideoBridge.onNetworkChange";
  195. var netJson = {};
  196. netJson.callback = onNetworkChange;
  197. _Bridge(function () {
  198. if (bridge) {
  199. if (isAdr) {
  200. window.Unicom.invoke('registerNetworkListener', JSON.stringify(netJson));
  201. } else if (isIOS) {
  202. bridge.invoke("registerNetworkListener", {}, function (json_msg) {
  203. location.reload();
  204. });
  205. }
  206. } else {
  207. defer.reject(-1);
  208. }
  209. })
  210. },
  211. onRemoteUserMob: function (err, userMob) {
  212. var defer = new getDefer("getRemoteUserMob");
  213. if (err == 0) {
  214. defer.resolve(userMob);
  215. } else {
  216. defer.reject(-1);
  217. }
  218. },
  219. getRemoteUserMob: function (json_param) {
  220. var defer = new getDefer("getRemoteUserMob");
  221. if (!defer["loadok"]) {
  222. var defer = new getDefer("getRemoteUserMob", true);
  223. } else {
  224. return defer;
  225. }
  226. _Bridge(function () {
  227. if (bridge) {
  228. json_param = json_param || {};
  229. json_param.callback = "QQVideoBridge.onRemoteUserMob";
  230. if (isAdr) {
  231. bridge.invoke('getRemoteUserMob', JSON.stringify(json_param));
  232. } else {
  233. bridge.invoke("getRemoteUserMob", json_param, function (json_msg) {
  234. var oJson = parseJSON(json_msg);
  235. if (oJson.errcode == 0) {
  236. defer["loadok"] = true;
  237. defer.resolve(oJson.userMob);
  238. } else {
  239. defer.reject(-1);
  240. }
  241. });
  242. }
  243. } else {
  244. defer.reject(-1);
  245. }
  246. })
  247. return defer;
  248. },
  249. processResult: function (str_name, json_result) {
  250. var defer = new getDefer(str_name);
  251. _Bridge(function () {
  252. if (bridge) {
  253. if (isAdr) {
  254. var strJson = JSON.stringify(json_result);
  255. var ret = bridge.invoke(str_name, strJson);
  256. defer.resolve(ret);
  257. } else {
  258. bridge.invoke(str_name, json_result, function (ret) {
  259. defer.resolve(ret);
  260. });
  261. }
  262. } else {
  263. defer.reject(-1);
  264. }
  265. })
  266. return defer;
  267. },
  268. saveResult: function (str_name, json_result) {
  269. var defer = new getDefer(str_name);
  270. _Bridge(function () {
  271. if (bridge) {
  272. if (isAdr) {
  273. var strJson = JSON.stringify(json_result);
  274. var ret = window.Unicom.invoke(str_name, strJson);
  275. defer.resolve(ret);
  276. } else {
  277. bridge.invoke(str_name, json_result, function (ret) {
  278. defer.resolve(ret);
  279. });
  280. }
  281. } else {
  282. defer.reject(-1);
  283. }
  284. })
  285. return defer;
  286. },
  287. getMd5: function (data) {
  288. var defer = new getDefer("getMd5");
  289. _Bridge(function () {
  290. if (bridge) {
  291. var _json = {};
  292. _json.data = data;
  293. var str_param = JSON.stringify(_json);
  294. function resolve(ret) {
  295. var retJson = eval("(" + ret + ")");
  296. var retValue = "";
  297. if (!!retJson && !!retJson.value) {
  298. retValue = retJson.value;
  299. }
  300. defer.resolve(retValue);
  301. }
  302. if (isAdr) {
  303. var ret = window.Unicom.invoke('generateMd5', str_param);
  304. resolve(ret)
  305. } else {
  306. bridge.invoke("generateMd5", _json, function (ret) {
  307. resolve(ret)
  308. });
  309. }
  310. } else {
  311. defer.reject(-1);
  312. }
  313. })
  314. return defer;
  315. },
  316. getBase64: function (data, deferName) {
  317. var _deferName = deferName || "generateBase64";
  318. var defer = new getDefer(_deferName);
  319. _Bridge(function () {
  320. if (bridge) {
  321. var _json = {};
  322. _json.data = data;
  323. function resolve(ret) {
  324. var retJson = eval("(" + ret + ")");
  325. var retValue = "";
  326. if (!!retJson && !!retJson.value) {
  327. retValue = retJson.value;
  328. }
  329. defer.resolve(retValue);
  330. }
  331. var str_param = JSON.stringify(_json);
  332. if (isAdr) {
  333. var ret = window.Unicom.invoke('generateBase64', str_param);
  334. resolve(ret)
  335. } else {
  336. bridge.invoke("generateBase64", _json, function (json_msg) {
  337. resolve(ret)
  338. });
  339. }
  340. } else {
  341. defer.reject(-1);
  342. }
  343. })
  344. return defer;
  345. },
  346. getNetworkType: function () {
  347. var defer = new getDefer("getNetworkType", true);
  348. _Bridge(function () {
  349. if (bridge) {
  350. if (isAdr) {
  351. var ret = window.Unicom.invoke('getNetworkType');
  352. var oJson = eval("(" + ret + ")");
  353. defer.resolve(oJson.networkType);
  354. } else {
  355. bridge.invoke("getNetworkType", {}, function (ret) {
  356. var oJson = eval("(" + ret + ")");
  357. defer.resolve(oJson.networkType);
  358. });
  359. }
  360. } else {
  361. defer.reject(-1);
  362. }
  363. })
  364. return defer;
  365. },
  366. receiveHollywood: function (json_msg) {
  367. var defer = new getDefer("receiveHollywood");
  368. _Bridge(function () {
  369. if (bridge) {
  370. if (isAdr) {
  371. var res = bridge.invoke('receiveHollywood', JSON.stringify(json_msg));
  372. defer.resolve(parseJSON(res));
  373. } else if (isIOS) {
  374. bridge.callHandler("receiveHollywood", json_msg, function (res) {
  375. defer.resolve(parseJSON(res));
  376. });
  377. }
  378. } else {
  379. defer.reject(-1);
  380. }
  381. })
  382. return defer;
  383. },
  384. unicomH5Report: function (json_param) {
  385. var defer = new getDefer("unicomH5Report");
  386. _Bridge(function () {
  387. if (bridge) {
  388. if (isAdr) {
  389. bridge.invoke('reportOrderClickMta', JSON.stringify(json_param));
  390. defer.resolve(0);
  391. } else {
  392. bridge.invoke("unicomH5Report", json_param, function () {
  393. defer.resolve(0);
  394. });
  395. }
  396. } else {
  397. defer.reject(-1);
  398. }
  399. })
  400. return defer;
  401. },
  402. getLoginCookie: function (json_param, func_suc) {
  403. var defer = new getDefer("getLoginCookie", true);
  404. _Bridge(function () {
  405. if (bridge) {
  406. if (isAdr) {
  407. var ret = window.Unicom.invoke('getLoginCookie');
  408. var oJson = eval("(" + ret + ")");
  409. defer.resolve(oJson.cookie);
  410. } else {
  411. bridge.invoke("getLoginCookie", {}, function (ret) {
  412. var oJson = eval("(" + ret + ")");
  413. defer.resolve(oJson.cookie);
  414. });
  415. }
  416. } else {
  417. defer.reject(-1);
  418. }
  419. })
  420. return defer;
  421. },
  422. getDeviceToken: function (json_param, func_suc) {
  423. var defer = new getDefer("getDeviceToken", true);
  424. _Bridge(function () {
  425. if (bridge) {
  426. if (isAdr) {
  427. var ret = window.Unicom.invoke('getDeviceToken');
  428. var oJson = eval("(" + ret + ")");
  429. defer.resolve(oJson.deviceToken);
  430. } else {
  431. bridge.invoke("getDeviceToken", {}, function (ret) {
  432. var oJson = eval("(" + ret + ")");
  433. defer.resolve(oJson.deviceToken);
  434. });
  435. }
  436. } else {
  437. defer.reject(-1);
  438. }
  439. })
  440. return defer;
  441. },
  442. setMoreInfo: function (json_param, func_suc) {
  443. return _handlerDefaultTpl("setMoreInfo", json_param, func_suc);
  444. },
  445. openToolsDialog: function (json_param, func_suc) {
  446. return _handlerDefaultTpl("openToolsDialog", json_param, func_suc);
  447. },
  448. apply: function (name, json_param, func_suc) {
  449. return _handlerDefaultTpl(name, json_param, func_suc);
  450. }
  451. }
  452. var json_event = {};
  453. function _registerHandler(str_method, func_caller, func_suc) {
  454. var defer = RsyncDefer(func_suc);
  455. _Bridge(function (json_msg) {
  456. if (json_msg && json_msg.state) {
  457. defer.resolve({
  458. state: 1,
  459. msg: "No Bridge Applied!"
  460. });
  461. } else {
  462. defer.resolve({
  463. state: 0
  464. });
  465. TenvideoJSBridge.on(str_method, function (data, responseCallback) {
  466. func_caller && func_caller(data);
  467. (typeof responseCallback == "function") && responseCallback("SUCESS"); //ios老接口有这个回调,这里保留一下
  468. });
  469. }
  470. });
  471. return defer;
  472. }
  473. /*
  474. * 注册APP的回调事件
  475. */
  476. QQVideoBridge.on = function (str_event, func_suc) {
  477. if (!json_event[str_event]) {
  478. json_event[str_event] = {
  479. eventName: str_event,
  480. func: []
  481. };
  482. window[str_event] = function () {
  483. for (var i in json_event[str_event].func) {
  484. json_event[str_event].func[i].apply(null, Array.prototype.slice.call(arguments, 0));
  485. }
  486. }
  487. _registerHandler(str_event, window[str_event], function () {});
  488. }
  489. json_event[str_event].func.push(func_suc);
  490. }
  491. /*
  492. * 删除APP的回调事件
  493. */
  494. QQVideoBridge.off = function (str_event, func_suc) {
  495. if (!json_event[str_event]) {
  496. return;
  497. }
  498. if (!func_suc) {
  499. json_event[str_event].func = [];
  500. }
  501. for (var i = json_event[str_event].func.length - 1; i >= 0; i--) {
  502. if (json_event[str_event].func[i] == func_suc) {
  503. json_event[str_event].func.splice(i, 1);
  504. }
  505. }
  506. }
  507. /*
  508. * 触发事件
  509. */
  510. QQVideoBridge.trigger = function (str_event) {
  511. if (!json_event[str_event]) {
  512. return;
  513. }
  514. window[str_event].apply(null, Array.prototype.slice.call(arguments, 1));
  515. }
  516. window.QQVideoBridge = QQVideoBridge;
  517. })();