index.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. interface HTML5 extends Window {
  2. plus?: any; // eslint-disable-line
  3. }
  4. export default new (class {
  5. private h5 = new Promise<HTML5>((resolve) => {
  6. document.addEventListener('plusready', () => {
  7. resolve(window);
  8. })
  9. })
  10. constructor() {
  11. // 监听返回按钮事件
  12. this.onPlusReady((plus) => {
  13. let firstBack = true;
  14. const webview = plus.webview.currentWebview();
  15. plus.key.addEventListener('backbutton', () => {
  16. // eslint-disable-next-line
  17. webview.canBack((e: any) => {
  18. // 判断能否继续返回
  19. if (e.canBack) {
  20. webview.back();
  21. } else {
  22. // 1秒内连续两次按返回键退出应用
  23. if (firstBack) {
  24. firstBack = false;
  25. plus.nativeUI.toast('再按一次退出应用');
  26. setTimeout(() => {
  27. firstBack = true;
  28. }, 1000);
  29. } else {
  30. plus.runtime.quit();
  31. }
  32. }
  33. })
  34. })
  35. })
  36. }
  37. // eslint-disable-next-line
  38. onPlusReady(callback: (plus: any) => void) {
  39. this.h5.then((res) => {
  40. callback(res.plus)
  41. })
  42. }
  43. /**
  44. * 客户端的版本名称
  45. * @returns
  46. */
  47. getVersion() {
  48. return new Promise<string>((resolve) => {
  49. this.onPlusReady((plus) => {
  50. resolve(plus.runtime.version)
  51. })
  52. })
  53. }
  54. /**
  55. * 获取客户端的版本号
  56. * @returns
  57. */
  58. getVersionCode() {
  59. return new Promise<string>((resolve) => {
  60. this.onPlusReady((plus) => {
  61. const versionCode = plus.runtime.versionCode
  62. console.log('版本号', versionCode)
  63. resolve(versionCode)
  64. })
  65. })
  66. }
  67. /**
  68. * 获取状态栏高度
  69. * @param callback
  70. */
  71. getStatusBarHeight(callback: (statusbarHeight: number) => void) {
  72. this.onPlusReady((plus) => {
  73. const height = plus.navigator.getStatusbarHeight();
  74. callback(height);
  75. })
  76. }
  77. /**
  78. * 设置状态栏文字颜色
  79. * @param color dark - 暗色,light - 亮色
  80. */
  81. setStatusBarStyle(color: 'dark' | 'light') {
  82. this.onPlusReady((plus) => {
  83. plus.navigator.setStatusBarStyle(color);
  84. })
  85. }
  86. /**
  87. * 隐藏状态栏
  88. */
  89. hideStatusBar() {
  90. this.onPlusReady((plus) => {
  91. plus.navigator.setFullscreen(true);
  92. })
  93. }
  94. /**
  95. * 显示状态栏
  96. */
  97. showStatusBar() {
  98. this.onPlusReady((plus) => {
  99. plus.navigator.setFullscreen(false);
  100. })
  101. }
  102. /**
  103. * 设置应用全屏
  104. */
  105. setFullSreen() {
  106. this.onPlusReady((plus) => {
  107. this.hideStatusBar();
  108. plus.navigator.hideSystemNavigation();
  109. })
  110. }
  111. /**
  112. * 应用退出全屏
  113. */
  114. exitFullSreen() {
  115. this.onPlusReady((plus) => {
  116. this.showStatusBar();
  117. plus.navigator.showSystemNavigation();
  118. })
  119. }
  120. /**
  121. * 更新应用
  122. * @param url
  123. */
  124. updateApp(url: string) {
  125. this.onPlusReady((plus) => {
  126. const dtask = plus.downloader.createDownload(
  127. url,
  128. {
  129. filename: ''
  130. },
  131. function (d: any, status: number) {
  132. if (status == 200) {
  133. // 当前下载的状态
  134. installApp(d.filename) // 调用安装的方法
  135. } else {
  136. //plus.nativeUI.alert('下载失败')
  137. }
  138. }
  139. )
  140. dtask.start() // 开启下载的任务
  141. // app自动更新进度
  142. dtask.addEventListener('statechanged', function (task: any, status: number) {
  143. // 给下载任务设置一个监听 并根据状态 做操作
  144. switch (task.state) {
  145. case 1:
  146. console.log('正在下载')
  147. break
  148. case 2:
  149. console.log('已连接到服务器')
  150. break
  151. case 3:
  152. // console.log(task)
  153. // console.log(task.downloadedSize)//当前的大
  154. // console.log(task.totalSize)//安装包的大小
  155. }
  156. })
  157. // 自动更新
  158. // eslint-disable-next-line no-inner-declarations
  159. function installApp(path: string) {
  160. plus.nativeUI.showWaiting('正在更新...')
  161. plus.runtime.install(
  162. path,
  163. {
  164. // true表示强制安装,不进行版本号的校验;false则需要版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 false
  165. force: false
  166. },
  167. function () {
  168. plus.nativeUI.closeWaiting()
  169. console.log('更新成功!')
  170. plus.runtime.restart()
  171. },
  172. function (e: any) {
  173. plus.nativeUI.closeWaiting()
  174. plus.nativeUI.alert('更新失败:' + e.message)
  175. }
  176. )
  177. }
  178. })
  179. }
  180. })