5

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

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

到电容器.config.json 并做到了

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

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

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

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

4

1 回答 1

6

事实证明,我的页面有一个活跃的服务人员是我麻烦的原因。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 类中。)

于 2019-04-30T07:56:28.263 回答