Encontré una situación extraña con el comportamiento de mi iónico InAppBrowser.
Mi código se ve así:
Tengo observable donde quiero una carrera entre la duración del tiempo de espera y mi solicitud http
const src$ = of(this.setItemLoading(item.id, true)); const queryTimeout$ = timer(5e3).pipe( take(1), map(() => { return throwError(new Error('Timeout!!!')); }) ); src$.pipe( switchMap(() => race(queryTimeout$, http$)), delay(1e3), first(), tap(() => this.setItemLoading(item.id, false)) ).subscribe( res => { item['afterQueryCallback'] && item['afterQueryCallback'](res); }, err => { this.hpService.handleError(err); } ); Dentro afterQueryCallback (que está en otro componente) tengo this.iab.create(data, this.type, 'location=no'); donde this.type es '_system' o '_blank' depende del dispositivo o navegador utilizado.
Esto funciona bien en Chrome y FF, sin embargo, en Safari, mi InAppBrowser emite una alerta que dice "Nativo: InAppBrowser no está instalado o se está ejecutando en un navegador. Volviendo a window.open", y mi aplicación no abre nada. , lo cual tiene sentido porque Safari bloquea window.open
Pero si dentro de afterQueryCallback , pongo this.iab.create(data, this.type, 'location=no'); en la devolución de llamada de una ventana emergente de alerta ( AlertController que es async/await fn), luego abre una nueva pestaña nuevamente, incluso si todavía tiene esa cotización de alerta. ¿Es esto porque de alguna manera AlertController podría activar window.open() ?
¿Alguien puede explicar por qué y cómo puedo lograr esto en Safari sin una ventana emergente de alerta?
env probado: navegador safari (tanto en macos como en dispositivos), app ios