Какая альтернатива WebIntent на iOS в Ionic 4?

Мне нужно открыть приложение и получить ответ, который он вернет после выбора. Я делаю это с помощью плагина WebIntent (https://ionicframework.com/docs/native/web-intent) для Android, и он работает. Теперь я пытаюсь сделать то же самое для iOS, я использую InAppBrowser (https://ionicframework.com/docs/native/in-app-browser), но есть ошибка, если вы открываете приложение со ссылкой, используя target: "_system", прослушиватели событий не запускаются. Есть ли другие способы сделать это в iOS?

Пример WebIntent:

      const options = {
        action: this.webIntent.ACTION_VIEW,
        url: 'app://url',
        extras: {
          my_extras: 'extras'
        }
      };

      this.webIntent.startActivityForResult(options).then((intent) => {
        if (intent.extras.resultCode === -1) {
          this.doSomething(intent.extras);
        } else {
          // handle errors
        }
      }, (error) => {
        // handle case when app is not installed
      });

Пример моей попытки с InAppBrowser

      let browser = this.iab.create('app://url', '_system');

      browser.on('exit').subscribe((event) => {
        console.log('exit'); // this event is fired actually
      }, err => {
        console.log(err);
      });

      browser.on('message').subscribe(event => {
        console.log('message'); // all other events like this one are not fired
      }, err => {
        console.log(err);
      });

Спасибо за любую помощь!

- РЕДАКТИРОВАТЬ -
Итак, я нашел способ в Интернете использовать слушателей в InAppBrowser с целью _system. Вам нужно создать браузер с целью _blank, а затем снова открыть его в обработчике событий с помощью _system target. Пример:

openBrowser() {
  const url = 'app://url'
  const browser = this.iab.create(url, '_blank');
  browser.on('beforeload').subscribe(evt => {
    this.beforeloadEventHandler(evt, url);
  }
  // close the blank browser where you want
  browser.close();
}
public beforeloadEventHandler(event, url) {
  const browser = this.iab.create(url, '_system');
  browser.on('beforeload').subscribe(evt => {
    this.beforeloadEventHandler(evt, url);
  });

  // your logic
  console.log('beforeload evt');
  console.log(JSON.stringify(event));
}

Но, в конце концов, это решение не работает для меня, потому что я не получаю никаких данных с помощью слушателей InAppBrowser, я думаю, есть другой способ сделать это.


person Dolph    schedule 06.12.2019    source источник


Ответы (1)


Простая альтернатива - использовать API конденсатора.

App.addListener('appUrlOpen', (data: any) => {
    // data.url contains the url that is opening your app
    // so you can use it to check what to do
});

const canOpen = await App.canOpenUrl({ url: 'app://url' });
if (canOpen.value === true) {
    // can open 'app://url'
}
const open = await App.openUrl({ url: 'app://url' });
if (!open.completed) {
    // app not opened, custom logic like ask to install the app or redirect to the store
}
person Dolph    schedule 04.03.2020