Empezando
-
Instalar el paquete
Ventana de terminal npm i @capgo/inappbrowserVentana de terminal pnpm add @capgo/inappbrowserVentana de terminal yarn add @capgo/inappbrowserVentana de terminal bun add @capgo/inappbrowser -
Sincronización con proyectos nativos
Ventana de terminal npx cap syncVentana de terminal pnpm cap syncVentana de terminal yarn cap syncVentana de terminal bunx cap sync
Importe el complemento y utilice sus dos puntos de entrada principales:
import { InAppBrowser, ToolBarType, BackgroundColor } from '@capgo/inappbrowser';
// 1) Simple custom tab / SFSafariViewControllerconst openExternal = async () => { await InAppBrowser.open({ url: 'https://capgo.app', isPresentAfterPageLoad: true, preventDeeplink: false, });};
// 2) Full WebView with navigation, headers, share, messaging, etc.const openWebView = async () => { await InAppBrowser.openWebView({ url: 'https://capgo.app', title: 'Capgo', toolbarType: ToolBarType.NAVIGATION, backgroundColor: BackgroundColor.BLACK, activeNativeNavigationForWebview: true, showReloadButton: true, shareSubject: 'Check this page', shareDisclaimer: { title: 'Disclaimer', message: 'You are about to share content', confirmBtn: 'Continue', cancelBtn: 'Cancel', }, });};
// Messaging between app and the opened WebViewconst setupListeners = async () => { await InAppBrowser.addListener('urlChangeEvent', (event) => { console.log('URL changed to:', event.url); });
await InAppBrowser.addListener('messageFromWebview', (event) => { console.log('Message from web:', event.detail); });
await InAppBrowser.addListener('closeEvent', () => { console.log('WebView closed'); });};
// Send data to the WebViewconst sendData = async () => { await InAppBrowser.postMessage({ detail: { action: 'refresh-profile' } });};
// Close and reload helpersconst closeBrowser = () => InAppBrowser.close();const reloadPage = () => InAppBrowser.reload();API Referencia
Section titled “API Referencia”abierto(opciones: OpenOptions)
Section titled “abierto(opciones: OpenOptions)”Abre una URL en una pestaña personalizada/SFSafariViewController.
interface OpenOptions { /** Target URL to load */ url: string; /** Present after the page finishes loading */ isPresentAfterPageLoad?: boolean; /** Prevent deep links from opening external apps */ preventDeeplink?: boolean;}
await InAppBrowser.open({ url: 'https://example.com', preventDeeplink: true });openWebView (opciones: OpenWebViewOptions)
Section titled “openWebView (opciones: OpenWebViewOptions)”Carga un WebView con todas las funciones con interfaz de usuario de navegación, encabezados, credenciales, secuencias de comandos y mensajes.
interface OpenWebViewOptions { url: string; headers?: Record<string, string>; credentials?: { username: string; password: string }; materialPicker?: boolean; shareDisclaimer?: { title: string; message: string; confirmBtn: string; cancelBtn: string; }; toolbarType?: ToolBarType; shareSubject?: string; title?: string; backgroundColor?: BackgroundColor; activeNativeNavigationForWebview?: boolean; disableGoBackOnNativeApplication?: boolean; isPresentAfterPageLoad?: boolean; isInspectable?: boolean; isAnimated?: boolean; showReloadButton?: boolean; closeModal?: boolean; closeModalTitle?: string; closeModalDescription?: string; closeModalOk?: string; closeModalCancel?: string; visibleTitle?: boolean; toolbarColor?: string; toolbarTextColor?: string; showArrow?: boolean; ignoreUntrustedSSLError?: boolean; preShowScript?: string; preShowScriptInjectionTime?: 'documentStart' | 'pageLoad'; proxyRequests?: string; buttonNearDone?: { ios: { iconType: 'sf-symbol' | 'asset'; icon: string }; android: { iconType: 'asset' | 'vector'; icon: string; width?: number; height?: number }; }; textZoom?: number; preventDeeplink?: boolean; authorizedAppLinks?: string[]; enabledSafeBottomMargin?: boolean; useTopInset?: boolean; enableGooglePaySupport?: boolean; blockedHosts?: string[]; width?: number; height?: number; x?: number; y?: number;}
await InAppBrowser.openWebView({ url: 'https://new-page.com', toolbarType: ToolBarType.NAVIGATION, showReloadButton: true,});Valores de ToolBarType: activity (cerrar + compartir), compact (solo cerrar), navigation (atrás/adelante + cerrar), blank (sin barra de herramientas). Valores BackgroundColor: white o black.
cerrar(¿opciones?)
Section titled “cerrar(¿opciones?)”Cierra la pestaña WebView/personalizado.
Opciones:
isAnimated?: boolean- Si se anima la acción de cierre
recargar()
Section titled “recargar()”Vuelve a cargar la página WebView actual.
volver()
Section titled “volver()”Vuelve al historial de WebView y devuelve { canGoBack: boolean }.
setUrl({ url: string })
Section titled “setUrl({ url: string })”Reemplaza la URL de WebView actual.
executeScript({ code: string })
Section titled “executeScript({ code: string })”Inyecta JavaScript en WebView.
postMessage({ detail: Record<string, any> })
Section titled “postMessage({ detail: Record<string, any> })”Envía datos desde la aplicación nativa a WebView (recibirlos en JS a través de window.addEventListener('messageFromNative', ...)).
getCookies({ url, includeHttpOnly? })
Section titled “getCookies({ url, includeHttpOnly? })”Devuelve cookies para la URL.
clearCookies({ url }) / clearAllCookies() / clearCache()
Section titled “clearCookies({ url }) / clearAllCookies() / clearCache()”Ayudantes de gestión de cookies y caché.
actualizarDimensiones(opciones: DimensionOptions)
Section titled “actualizarDimensiones(opciones: DimensionOptions)”Cambie el tamaño/posición de WebView en tiempo de ejecución (width, height, x, y).
eliminarTodos los oyentes()
Section titled “eliminarTodos los oyentes()”Anule el registro de todos los oyentes del complemento.
Eventos
Section titled “Eventos”Evento de cambio de URL
Section titled “Evento de cambio de URL”Se activa cuando la URL cambia en el navegador.
interface UrlChangeEvent { url: string;}
InAppBrowser.addListener('urlChangeEvent', (event) => { console.log('New URL:', event.url);});messageFromWebview
Section titled “messageFromWebview”Se activa cuando se llama a window.mobileApp.postMessage(...) dentro de WebView.
InAppBrowser.addListener('messageFromWebview', (event) => { console.log('Payload from web:', event.detail);});cerrarEvento
Section titled “cerrarEvento”Se activa cuando se cierra el navegador.
InAppBrowser.addListener('closeEvent', () => { console.log('Browser closed');});botónCerca de hechoClic
Section titled “botónCerca de hechoClic”Se activa cuando se presiona el botón personalizado agregado con buttonNearDone.
InAppBrowser.addListener('buttonNearDoneClick', (event) => { console.log('Button near done tapped', event);});confirmarBtnClicked
Section titled “confirmarBtnClicked”Se activa cuando se acepta un cuadro de diálogo de confirmación (exención de responsabilidad o modo de cierre).
InAppBrowser.addListener('confirmBtnClicked', (event) => { console.log('Confirm accepted, current URL:', event.url);});navegadorPageLoaded / pageLoadError
Section titled “navegadorPageLoaded / pageLoadError”Eventos del ciclo de vida para el éxito o el fracaso de la carga de WebView.
InAppBrowser.addListener('browserPageLoaded', () => console.log('Page loaded'));InAppBrowser.addListener('pageLoadError', () => console.log('Page failed to load'));Uso avanzado
Section titled “Uso avanzado”OAuth Implementación de flujo
Section titled “OAuth Implementación de flujo”import { InAppBrowser } from '@capgo/inappbrowser';
export class OAuthService { private listeners: any[] = [];
async authenticate(authUrl: string, redirectUri: string) { return new Promise<string>((resolve, reject) => { // Listen for URL changes const urlListener = InAppBrowser.addListener('urlChangeEvent', (event) => { if (event.url.startsWith(redirectUri)) { // Extract OAuth code/token from URL const url = new URL(event.url); const code = url.searchParams.get('code');
if (code) { InAppBrowser.close(); resolve(code); } else { const error = url.searchParams.get('error'); reject(new Error(error || 'OAuth failed')); } } });
this.listeners.push(urlListener);
// Open OAuth provider InAppBrowser.open({ url: authUrl, preventDeeplink: true, }); }); }
cleanup() { this.listeners.forEach(listener => listener.remove()); this.listeners = []; }}Interfaz de usuario personalizada del navegador
Section titled “Interfaz de usuario personalizada del navegador”const openCustomBrowser = async () => { await InAppBrowser.open({ url: 'https://example.com', isPresentAfterPageLoad: true, preventDeeplink: false, });};Manejo de enlaces externos
Section titled “Manejo de enlaces externos”import { InAppBrowser } from '@capgo/inappbrowser';
export class LinkHandler { async openExternalLink(url: string) { // Check if URL should open in browser if (this.shouldOpenInBrowser(url)) { await InAppBrowser.open({ url, preventDeeplink: true, }); } else { // Handle internally window.location.href = url; } }
private shouldOpenInBrowser(url: string): boolean { // External domains const externalDomains = ['youtube.com', 'twitter.com', 'facebook.com']; const urlDomain = new URL(url).hostname;
return externalDomains.some(domain => urlDomain.includes(domain)); }}Mejores prácticas
Section titled “Mejores prácticas”-
Eliminar siempre a los oyentes
const listener = await InAppBrowser.addListener('urlChangeEvent', handler);// When donelistener.remove(); -
Manejar estados del navegador
let browserOpen = false;const launch = async () => {browserOpen = true;await InAppBrowser.openWebView({ url: 'https://example.com' });};InAppBrowser.addListener('closeEvent', () => {browserOpen = false;}); -
Valide las URL antes de abrirlas
const isValidUrl = (url: string): boolean => {try {new URL(url);return true;} catch {return false;}};if (isValidUrl(url)) {await InAppBrowser.open({ url });} -
Personalizar según la plataforma
import { Capacitor } from '@capacitor/core';const options = {url: 'https://example.com',preventDeeplink: Capacitor.getPlatform() === 'ios',};
Notas de plataforma
Section titled “Notas de plataforma”- Utiliza
SFSafariViewController - Soporta iOS 11.0+
- Respeta las inserciones del Área Segura
- Admite estilos de presentación personalizados
Android
Section titled “Android”- Utiliza pestañas personalizadas de Chrome
- Vuelve a WebView si Chrome no está disponible
- Soporta Android 5.0 (API 21)+
- Personalización de la barra de herramientas compatible a través de
toolbarType,toolbarColor,buttonNearDone, etc.
- Se abre en una nueva pestaña/ventana del navegador
- Opciones de personalización limitadas
- No hay eventos de cambio de URL