webview.bridge.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. const WebviewEvents = {
  2. /**
  3. * 获取平台信息
  4. */
  5. GET_PLATFORM: 'getPlatform',
  6. /**
  7. * 获取状态栏高度
  8. */
  9. GET_STATUS_BAR_HEIGHT: 'getStatusBarHeight',
  10. /**
  11. * 扫码
  12. */
  13. SCAN: 'scan',
  14. /**
  15. * 苹果支付
  16. */
  17. APPLE_PAY: 'applePay',
  18. APPLE_PAY_RESTORE: 'applePayRestore',
  19. // 微信是否安装
  20. CHECK_WECHAT_INSTALLED: 'checkWechatInstalled',
  21. GET_UPGRADE_INFO: 'getUpgradeInfo',
  22. DOWNLOAD_UPGRADE: 'downloadAndInstall',
  23. OPEN_IFRAME: 'openIframe'
  24. }
  25. function resetWindowCallback(callbackEvent) {
  26. window[callbackEvent] = null;
  27. delete window[callbackEvent];
  28. }
  29. async function getWebviewCallback(event, args) {
  30. if (!uni.webView) {
  31. return Promise.reject(new Error('uni环境异常,请检查uni.webview是否正确引入'));
  32. }
  33. if (window.platform === 'h5') {
  34. return Promise.reject(new Error('请在app中使用'));
  35. }
  36. const callbackEvent = `webviewCallback_${event}`;
  37. try {
  38. return await new Promise((resolve, reject) => {
  39. window[callbackEvent] = (data) => {
  40. resolve(data);
  41. resetWindowCallback(callbackEvent);
  42. };
  43. uni.webView.postMessage({
  44. data: {
  45. action: event,
  46. data: {
  47. callbackAction: callbackEvent,
  48. data: args
  49. }
  50. }
  51. });
  52. });
  53. } catch (error) {
  54. return Promise.reject(new Error('webview初始化失败,请检查是否正确引入uni.webview'));
  55. }
  56. }
  57. class WebviewBridge {
  58. constructor() { }
  59. getPaltform() {
  60. return getWebviewCallback(WebviewEvents.GET_PLATFORM);
  61. }
  62. scan(...args) {
  63. return getWebviewCallback(WebviewEvents.SCAN, args);
  64. }
  65. applePay(...args) {
  66. return getWebviewCallback(WebviewEvents.APPLE_PAY, args);
  67. }
  68. applePayRestore(...args) {
  69. return getWebviewCallback(WebviewEvents.APPLE_PAY_RESTORE, args);
  70. }
  71. checkWechatInstalled(...args) {
  72. return getWebviewCallback(WebviewEvents.CHECK_WECHAT_INSTALLED, args);
  73. }
  74. getStatusBarHeight() {
  75. return getWebviewCallback(WebviewEvents.GET_STATUS_BAR_HEIGHT);
  76. }
  77. getUpgradeInfo(...args) {
  78. return getWebviewCallback(WebviewEvents.GET_UPGRADE_INFO, args);
  79. }
  80. openIframe(...args) {
  81. return getWebviewCallback(WebviewEvents.OPEN_IFRAME, args);
  82. }
  83. downloadUpgrade(url, progressCb) {
  84. window.onDownloadProgress = progressCb;
  85. return getWebviewCallback(WebviewEvents.DOWNLOAD_UPGRADE, {
  86. url,
  87. progressCb: 'onDownloadProgress'
  88. });
  89. }
  90. }
  91. const webviewBridge = new WebviewBridge();
  92. window.webviewBridge = webviewBridge;