Как упаковать размещенное веб-приложение с помощью Ionic Capacitor - PullRequest
2 голосов
/ 29 апреля 2019

У меня есть размещенное веб-приложение на основе CMS, которое я хочу упаковать как приложение для Android / iOS с Ionic Capacitor.Таким образом, я добавил

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

в Capitor.config.json и сделал

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

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

в главном файле Javascript моего приложения (я использую веб-пакет для комплектации).Это в основном работает, то есть приложение загружается и отображается правильно.Но в консоли я вижу, что Capacitor загружает веб-версии плагинов, а Device.getInfo() говорит, что платформа «веб», а не «android».

Как заставить Capacitor работать так, как если бымое приложение было загружено из файловой системы устройства, и, в частности, как я могу заставить его использовать собственные версии плагинов в этой настройке?

1 Ответ

2 голосов
/ 30 апреля 2019

Как оказалось, причина моих неприятностей в том, что на моих страницах был активный сервисный работник. Capacity использует WebViewClient :: shouldInterceptRequest для внедрения кода Javascript, который инициализирует мост в родной мир, и Android не вызывает этот обратный вызов для запросов, которые обрабатывает работник службы. Вместо этого он имеет отдельный обратный вызов для этих запросов, который доступен через 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 в класс Bridge.)

...