Saltar al contenido
WebViewGold Del vibe coding a la App Store
Español
Consigue WebViewGold

Claude Code

Una Agent Skill que enseña a Claude Code el puente JavaScript de WebViewGold

Una Agent Skill es una carpeta con un archivo SKILL.md que Claude Code solo carga cuando una tarea la necesita. Eso la convierte en el sitio ideal para el puente de WebViewGold: esquemas de URL exactos, variables inyectadas y particularidades de cada plataforma que importan cada vez que el agente toca una función nativa y nunca en otro caso. Aquí tienes una skill completa, verificada con la documentación de WebViewGold y lista para .claude/skills/.

Desde $109 de pago único por plataforma, o deja que nuestro equipo lo haga todo desde $698.

  • Garantía de aprobación – o te devolvemos el dinero en 14 días
  • Sin programar
  • Pago único, actualizaciones gratuitas
  • Soporte humano 24/7
  • Hecho en Alemania desde 2014 · ISO 27001

Por qué una skill y no un CLAUDE.md más largo

CLAUDE.md se lee al inicio de cada sesión, así que cada línea cuesta contexto en todas las tareas, incluidas las muchas que no tienen nada que ver con funciones nativas. Las skills funcionan al revés. Claude Code solo tiene a la vista la descripción corta de cada skill; el SKILL.md completo se carga cuando escribes /webviewgold-bridge o cuando Claude ve que una petición coincide con la descripción. Los archivos de apoyo de la carpeta de la skill solo se cargan cuando las instrucciones remiten a ellos.

Para un puente JavaScript eso es ideal. La tabla de esquemas, las firmas de los callbacks y los apaños para iOS son material de referencia preciso que el agente debe copiar al pie de la letra, y no pintan nada mientras corrige un fallo de CSS. Tu CLAUDE.md conserva una sola línea ("funciones nativas: consulta la skill webviewgold-bridge") y los detalles viven en un único lugar que se mantiene al día.

Una skill tampoco es un servidor MCP. MCP conecta a Claude con un sistema en vivo como GitHub, una base de datos o un navegador. El puente no necesita una conexión en vivo; necesita conocimiento correcto y un archivo auxiliar, y eso es justo lo que empaqueta una skill.

La estructura de carpetas

Tres archivos. Solo SKILL.md es obligatorio; los otros dos sirven para que siga siendo corto.

text
.claude/skills/webviewgold-bridge/
├── SKILL.md            rules, scheme table, patterns (loads with the skill)
├── platform-notes.md   iOS vs Android differences and native switches (loads on demand)
└── templates/
    └── native.ts       helper module Claude copies into src/lib/

SKILL.md

La description es la línea más importante: decide cuándo carga Claude la skill, así que nombra las funciones y las palabras que la gente escribe de verdad. Si sueles hablarle a Claude en español, puedes añadir ahí términos como "compartir" o "vibrar". Todos los esquemas de la tabla aparecen en la documentación de WebViewGold, por ejemplo en las páginas de push, biometría y menú de compartir.

markdown
---
name: webviewgold-bridge
description: Adds or debugs native iOS and Android features in this web app through the WebViewGold JavaScript bridge (URL schemes such as registerpush://, bioauth://, qrcode://, shareapp://, getonesignalplayerid://, rateapp://). Use when a task involves push notifications, Face ID, Touch ID or fingerprint login, QR or barcode scanning, the share sheet, haptics or vibration, saving images, app rating, the app version, opening app settings, or any behavior that must differ inside the native app.
---

# WebViewGold JavaScript bridge

This web app also ships as native iOS and Android apps built with WebViewGold. The apps load
the production URL in a WKWebView (iOS) or an Android WebView. Native features are triggered
by navigating to a URL scheme. Results come back as injected global variables or as calls to
global functions. There is no SDK to install and nothing to bundle.

## Rules
1. Detect the app with isNativeApp() from src/lib/native.ts. If that file does not exist,
   copy templates/native.ts from this skill. Never write a second user agent check.
2. Trigger schemes only through callNative(), callNativeQuietly() or callAndRead(). Every
   call needs a browser fallback: the web equivalent, or hide the control. No dead buttons.
3. Use only the schemes in the table below. For anything else, read the feature page under
   https://www.webviewgold.com/docs/iOS/ or https://www.webviewgold.com/docs/android/
   (full text: https://www.webviewgold.com/llms-full.txt). If it is not documented, tell
   the user it is not supported. Never invent a scheme, parameter or variable name.
4. iOS processes only one location change per script run. For several data calls at once
   use multiapicall://getonesignalplayerid,getappversion (comma-separated, no spaces; it
   works on Android too). Fire haptics on iOS through callNativeQuietly().
5. Injected variables arrive asynchronously. Read them with readInjected() or callAndRead(),
   never synchronously right after the call.
6. A scheme for a feature that is switched off in the native project does nothing. When you
   add a feature, list the native settings the user must enable (see platform-notes.md).
   Never edit signing, certificates, provisioning profiles or keystore settings.
7. Biometric success is a UI gate only. Sensitive actions still need a server-side check.

## Scheme reference
| Feature | Call | Result |
|---|---|---|
| Push permission prompt | registerpush:// | System permission dialog |
| Push permission status | checkNativePushPermissions:// | window.nativePushEnabled (true or false) |
| App settings | settingsapp:// | Opens the system settings of the app |
| OneSignal subscription ID | getonesignalplayerid:// | window.onesignalplayerid |
| Firebase push ID | getfirebaseplayerid:// | window.firebaseplayerid |
| Local notification | sendlocalpushmsg://push.send?s=SECONDS=msg!MESSAGE&!#TITLE&!#URL | Shown after SECONDS |
| Cancel local notifications | sendlocalpushmsg://push.send.cancel | Removes all scheduled ones |
| Biometrics | bioauth:// | iOS calls onBioAuthSuccess(), onBioAuthFailure(errorCode, errorMessage) or onBioAuthUnavailable() |
| QR code | qrcode:// | The scanned URL opens in the app |
| Barcode | barcodescanner:// | window.barcodescanresult |
| Share sheet | shareapp://message?=TEXT&url=URL | Native share dialog |
| Haptics | lighthaptic:// heavyhaptic:// successhaptic:// warninghaptic:// errorhaptic:// | Vibration; mediumhaptic:// is iOS only |
| Save image | savethisimage://?url=IMAGE_URL | Saved to the photo library |
| Rating | rateapp:// | System review dialog; the system decides whether it appears |
| App version | getappversion:// | window.versionNumber and window.bundleNumber |

## Patterns
- Push: ask after onboarding or a first success, never on the first screen. Explain in one
  sentence what we will send, then call registerpush://. In settings, use pushEnabled() and
  offer settingsapp:// when push is off. Save onesignalplayerid on the user profile via our API.
- Share: always encodeURIComponent TEXT and URL; share() in native.ts does it.
- QR codes: encode URLs on our own domain, because the scanned URL loads inside the app.
- Rating: only after a positive moment (order completed, task finished). Never at launch and
  never in exchange for a reward.
- Version: hide UI that older app builds cannot support by checking appVersion().

## Before you finish
- Every native call sits behind isNativeApp() and has a browser fallback.
- Your summary lists each scheme you used, the native switches to enable (platform-notes.md)
  and any platform-specific limits.
- Remind the user to test inside the real app on a device: push and biometrics cannot be
  tested in a desktop browser.

WebViewGold nos ha permitido el tiempo de mercado más corto y eficiente que jamás sea posible de todas las otras plataformas de aplicaciones que hemos probado durante los últimos 5 años. No sé por qué no lo había descubierto antes, ¡pero estoy muy, muy contento de haberlo hecho. Actualmente cerca de 6000 descargas de aplicaciones tanto en iOS App Store & Google Play Store sin ningún problema!

Antonio Davila · CodeCanyon

platform-notes.md

Qué hay que activar en los proyectos nativos para cada función y en qué se diferencian iOS y Android. Claude lee este archivo cuando te dice qué ajustes debes activar. La nota sobre biometría refleja la documentación tal como está hoy: la página de iOS documenta tres callbacks y la página de Android solo documenta el diálogo del sistema.

markdown
# Platform notes for the WebViewGold bridge

## User agent token
- iOS: Config.swift, useragent_iphone and useragent_ipad
- Android: Config.java, USER_AGENT
- Value: a normal mobile user agent string, a space, then WebViewGoldApp

## Push (OneSignal)
- iOS: kPushEnabled and oneSignalID in Config.swift. Set askforpushpermissionatfirstrun to
  false when the web app asks later with registerpush://. The App ID needs the Push
  Notifications and App Groups capabilities.
- Android: PUSH_ENABLED in Config.java, ONE_SIGNAL_APP_ID in app/build.gradle.
- Firebase instead of OneSignal: getfirebaseplayerid:// and window.firebaseplayerid.

## Variables without a call
- iOS autoInjectVariable, Android AUTO_INJECT_VARIABLES: values such as the push ID and the
  app version are injected automatically. readInjected() works either way.

## Biometrics
- iOS: add "Privacy - Face ID Usage Description" to Info.plist. Callbacks:
  onBioAuthSuccess(), onBioAuthFailure(errorCode, errorMessage), onBioAuthUnavailable().
- Android: the system BiometricPrompt, which may fall back to PIN or pattern. The Android
  docs describe the prompt but not the three callbacks: test on a device before relying on
  them, and keep a fallback.
- enableBioMetricAuth (both platforms) is a separate app lock on every launch and is
  independent of bioauth://.

## Camera features (qrcode://, barcodescanner://)
- iOS: camera usage description in Info.plist; qrcodelinks in Config.swift decides where
  scanned URLs open.
- Android: requireCamera and QR_CODE_URL_OPTIONS in Config.java.

## Haptics
- mediumhaptic:// exists on iOS only. Use lighthaptic:// or heavyhaptic:// on Android.

## Downloads
- savethisimage://?url=... saves an image. Other files download natively by extension:
  extentionARY (Config.swift) and downloadableExtension (Config.java).

## Rating
- rateapp:// shows the system review dialog, which the system rate-limits.
  iOS alternative: showcustomrateappdialog and ratemyappurl in Config.swift.

## Documentation
- iOS: https://www.webviewgold.com/docs/iOS/
- Android: https://www.webviewgold.com/docs/android/
- Full text for agents: https://www.webviewgold.com/llms-full.txt

templates/native.ts

El módulo auxiliar que la skill le pide a Claude que copie. Es el único sitio que conoce el token del user agent y resuelve tres detalles que los agentes suelen pasar por alto: la llamada silenciosa mediante iframe para los hápticos, tomada de la documentación de hápticos de iOS, un solo cambio de ubicación por ejecución de script en iOS (consulta MultiAPICall) y borrar una variable antigua antes de leer una nueva.

typescript
// templates/native.ts
// Copied into src/lib/native.ts by the webviewgold-bridge skill.
// The only file that knows how the web app detects the WebViewGold apps.

// Set in Config.swift (useragent_iphone, useragent_ipad) and Config.java (USER_AGENT)
const TOKEN = "WebViewGoldApp";

export function isNativeApp(): boolean {
  return typeof navigator !== "undefined" && navigator.userAgent.includes(TOKEN);
}

export function isAndroidApp(): boolean {
  return isNativeApp() && /Android/i.test(navigator.userAgent);
}

export function isIOSApp(): boolean {
  return isNativeApp() && !isAndroidApp();
}

// Navigate to a scheme. Returns false in normal browsers so callers can fall back.
export function callNative(scheme: string): boolean {
  if (!isNativeApp()) return false;
  window.location.href = scheme;
  return true;
}

// Fire-and-forget call through a temporary iframe, so it does not cancel a
// navigation in progress (the technique from the WebViewGold iOS haptics docs).
export function callNativeQuietly(scheme: string): boolean {
  if (!isNativeApp()) return false;
  const frame = document.createElement("iframe");
  frame.style.display = "none";
  frame.src = scheme;
  document.body.appendChild(frame);
  frame.remove();
  return true;
}

// Poll for a global variable the app injects (onesignalplayerid, nativePushEnabled ...)
export function readInjected<T = unknown>(name: string, timeoutMs = 3000): Promise<T> {
  return new Promise((resolve, reject) => {
    const started = Date.now();
    const tick = () => {
      const value = (window as any)[name];
      if (value !== undefined) return resolve(value as T);
      if (Date.now() - started > timeoutMs) return reject(new Error(name + " was not injected"));
      setTimeout(tick, 100);
    };
    tick();
  });
}

// Call a scheme and read a fresh result; clears a stale value first.
export async function callAndRead<T = unknown>(scheme: string, name: string, timeoutMs = 3000): Promise<T | null> {
  if (!isNativeApp()) return null;
  try { delete (window as any)[name]; } catch { /* variable not deletable, keep polling */ }
  window.location.href = scheme;
  return readInjected<T>(name, timeoutMs).catch(() => null);
}

export type Haptic = "light" | "heavy" | "success" | "warning" | "error";

export function haptic(kind: Haptic): void {
  const scheme = kind + "haptic://";
  if (isIOSApp()) callNativeQuietly(scheme);
  else callNative(scheme);
}

export function share(text: string, url: string): boolean {
  return callNative("shareapp://message?=" + encodeURIComponent(text) + "&url=" + encodeURIComponent(url));
}

export function pushEnabled(): Promise<boolean | null> {
  return callAndRead<boolean>("checkNativePushPermissions://", "nativePushEnabled", 2000);
}

export function appVersion(): Promise<string | null> {
  return callAndRead<string>("getappversion://", "versionNumber", 2000);
}

Instala y prueba la skill

Funciona igual en la terminal, en las extensiones para IDE y en las sesiones en la nube.

  1. Crea la carpeta

    Crea .claude/skills/webviewgold-bridge/ en la raíz del repositorio con los tres archivos de arriba y haz commit. Para una skill que quieras tener en todos tus proyectos, usa ~/.claude/skills/webviewgold-bridge/.

  2. Recórtala a tu app

    Borra de la tabla las filas de las funciones que no hayas activado en los proyectos nativos. Un esquema de una función desactivada no hace nada en tiempo de ejecución, y un agente que lo ve en la tabla lo integrará encantado.

  3. Comprueba que Claude la ve

    Escribe / en Claude Code y busca webviewgold-bridge, o pregunta "¿qué skills puedes usar en este proyecto?". Si no aparece, asegúrate de que el frontmatter empieza en la primerísima línea de SKILL.md.

  4. Deja que se active sola

    Pide una función sin nombrar la skill: "Añade un botón de compartir a la página de recetas". Claude debería cargar la skill, usar shareapp:// mediante share() y mantener el botón de copiar enlace como alternativa para el navegador.

  5. Ejecútala explícitamente cuando quieras

    /webviewgold-bridge añade hápticos de éxito después del checkout carga la skill y pasa el resto de la línea como tarea.

  6. Revisa, despliega y prueba en un dispositivo

    Comprueba que cada llamada está protegida con isNativeApp() y lee la lista de ajustes nativos que te indica Claude. Después despliega y prueba dentro de la app real; push y Face ID no funcionan en un navegador de escritorio.

Pide a Claude Code que adapte la skill a tu app

Úsalo en lugar de copiar los archivos a mano cuando quieras que la skill se limite a las funciones que realmente activaste.

Pégalo en Claude Code en la raíz de tu proyecto
Crea una Agent Skill en .claude/skills/webviewgold-bridge/ para este repositorio. Nuestra app web también se ejecuta dentro de apps nativas de iOS y Android creadas con WebViewGold; las funciones nativas se activan con esquemas de URL y devuelven valores mediante variables JavaScript inyectadas o funciones callback globales.

1. Lee Config.swift y Config.java (en native/ios y native/android; ajústalo si es distinto) y enumera qué funciones nativas están realmente activadas.
2. Para cada función activada, abre la página de documentación correspondiente en https://www.webviewgold.com/docs/iOS/ y https://www.webviewgold.com/docs/android/ y copia el esquema, los parámetros y las variables de retorno exactos. Deja fuera todo lo que no encuentres en la documentación y enuméramelo aparte.
3. Escribe SKILL.md con frontmatter (name: webviewgold-bridge y una description que nombre las funciones y las palabras que escribiría un usuario), reglas breves (protección con isNativeApp, alternativa para el navegador, multiapicall en iOS para varias llamadas de datos, variables inyectadas asíncronas, ningún esquema inventado), una tabla de esquemas y una lista de comprobación para terminar una tarea.
4. Pon en platform-notes.md las diferencias entre iOS y Android y los ajustes necesarios de Config.swift, Config.java, Info.plist y AndroidManifest.xml.
5. Pon el módulo auxiliar en templates/native.ts con isNativeApp, callNative, callNativeQuietly (iframe), readInjected y callAndRead.

Mantén SKILL.md por debajo de 150 líneas y muéstrame cada archivo antes de guardarlo.

¿Skill, CLAUDE.md, subagente, comando, hook o MCP?

MecanismoSe cargaPara qué usarlo en un proyecto de WebViewGold
CLAUDE.mdEn cada sesiónReglas permanentes breves: la app se ejecuta en un WebView, las reglas de las tiendas, las rutas protegidas
Skill (SKILL.md)Cuando una tarea coincide, o con /nombreConocimiento de referencia y plantillas, como esta skill del puente
SubagenteCuando Claude delegaTrabajo que necesita su propio contexto y un rol estricto, como el revisor para las tiendas
ComandoCuando lo escribesUn procedimiento que inicias a propósito, como /release-check
HookEn un evento del ciclo de vida, siempreReglas que deben cumplirse aunque el modelo no esté de acuerdo, como que no haya URLs localhost en los archivos Config
Servidor MCPCuando se llama a sus herramientasSistemas en vivo: GitHub, tu base de datos, un navegador para capturas

Errores habituales

  • Una description vaga. "Helper de WebViewGold" nunca se activa. Nombra las funciones y los verbos que usa la gente: push, Face ID, escanear, compartir, vibrar, valorar la app.
  • Dos fuentes de verdad. Si la tabla de esquemas también está en CLAUDE.md, una de las copias se queda desactualizada. Mantén la tabla en la skill y deja que CLAUDE.md remita a ella.
  • Una skill que se convierte en manual. Mantén SKILL.md corto y pasa los detalles a archivos de apoyo. Claude lee aquello a lo que remiten las instrucciones cuando lo necesita.
  • Saltarse la prueba en el dispositivo. La skill hace que el código sea correcto; solo la app real demuestra que la función está activada, tiene permiso y funciona.
  • Desactualizada tras una actualización de WebViewGold. Cuando pases a una nueva versión de WebViewGold, pide a Claude que vuelva a contrastar la tabla con la documentación y con los nuevos archivos Config.
  • Instalar skills que no has leído. Las skills pueden incluir scripts que Claude puede ejecutar. Lee una skill de terceros antes de añadirla, igual que harías con una dependencia.

Preguntas frecuentes

¿Funcionan las skills en Claude Code en la web y en GitHub Actions?

Sí. Las skills del proyecto en .claude/skills/ forman parte del repositorio, así que las sesiones en la nube las cargan, y la GitHub Action de Claude Code puede ejecutar una skill cuando el workflow hace primero checkout del repositorio y pasa /nombre-de-la-skill como prompt.

¿Cargará Claude la skill automáticamente?

Cuando una petición coincide con la description, sí. También puedes ejecutarla tú con /webviewgold-bridge. Si solo quieres usarla manualmente, añade disable-model-invocation: true al frontmatter.

¿En qué se diferencia de la guía del puente JavaScript?

La guía te explica el puente a ti y te da un prompt para una integración puntual. La skill es la versión permanente para el agente: se carga sola cada vez que una tarea posterior toca una función nativa, meses después de que hayas olvidado los detalles.

¿Pueden Cursor o Codex usar el mismo SKILL.md?

SKILL.md sigue el formato abierto Agent Skills y varios otros agentes pueden leerlo, pero cada herramienta busca en su propia carpeta. Consulta la documentación de esa herramienta o usa las plantillas de reglas de Cursor o de AGENTS.md de esta sección.

¿Por qué un esquema funciona en Android pero no en iOS?

Normalmente porque se ejecutaron varias asignaciones a window.location.href en el mismo script. iOS solo procesa una; combina las llamadas de datos con multiapicall:// y lanza los hápticos mediante un iframe temporal, como hace el módulo auxiliar.

Tres formas de llevar tu app a las tiendas

El mismo resultado, con distinta cantidad de trabajo por tu parte. Las tres incluyen la garantía de aprobación y soporte humano 24/7.

Hazlo tú mismo

$109 por plataforma, pago único

La licencia de WebViewGold: un proyecto de Xcode o Android Studio listo para usar. Pega tu URL, define nombre e icono, activa funciones, compila y envía. Actualizaciones gratuitas para siempre.

Ver planes en la página principal

Full Service

$698 por plataforma $798

Envíanos tu URL y tu icono. Nuestro equipo configura, compila y entrega tu app en 72 horas, en marca blanca y con los proyectos fuente. Ambas plataformas por $1,158.

Detalles del Full Service Con tecnología de WeSetupYourWebViewApp

Precios de la Oferta de invierno válidos hasta el 31 de diciembre de 2026.

¿Listo para lanzar tu app?

Garantía de aprobación en App Store & Google Play – o te devolvemos el dinero en 14 días

¿Prefieres delegarlo? Full Service: configuramos, compilamos y entregamos en 72 horas, desde $698 por plataforma. ¿Preguntas? Chatea con nosotros 24/7.

Los reembolsos se conceden bajo las condiciones indicadas en nuestras FAQ: un rechazo por motivos ajenos al contenido por parte de Apple y/o Google, reclamado dentro de los 14 días posteriores a la compra.