繁体   English   中英

如何使用 Ionic Capacitor 打包托管的 Web 应用程序

[英]How to package a hosted web app with Ionic Capacitor

我有一个基于 CMS 的托管 Web 应用程序,我想将其打包为带有 Ionic Capacitor 的 Android/iOS 应用程序。 所以我加了

  "server": {
    "url": "https://my.domain/"
  },

到capacitor.config.json并做了

import { Capacitor, Plugins } from '@capacitor/core';

console.log('Plugins', Capacitor.Plugins);

在我的应用程序的主要 Javascript 文件中(我使用 webpack 进行捆绑)。 这基本上有效,即应用程序被正确加载和显示。 但是在控制台上,我看到 Capacitor 加载了插件的 web 版本,并且Device.getInfo()说平台是“web”,而不是“android”。

当我的应用程序从设备的文件系统加载时,我怎样才能让 Capacitor 表现得像它一样,特别是我怎样才能让它在这个设置中使用插件的本机版本?

事实证明,我遇到麻烦的原因是我的页面有一个活跃的服务工作者。 Capacity 使用WebViewClient::shouldInterceptRequest来注入初始化桥接器到本地世界的 Javascript 代码,Android 不会为 Service Worker 处理的请求调用此回调。 相反,它对这些请求有一个单独的回调,可通过ServiceWorkerController 获得

所以我所做的是创建我自己的小插件:

@NativePlugin
public class ServiceWorker extends Plugin {

  @RequiresApi(api = Build.VERSION_CODES.N)
  @Override
  public void load() {
    ServiceWorkerController swController = ServiceWorkerController.getInstance();

    swController.setServiceWorkerClient(new ServiceWorkerClient() {
      @Override
      public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) {
        return bridge.getLocalServer().shouldInterceptRequest(request);
      }
    });
  }

}

然后它按预期工作。 (我还必须将 localServer 的 getter 添加到 Bridge 类。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM