Aller au contenu
WebViewGold Du vibe coding à l'App Store
Français
Obtenir WebViewGold

Claude Code

Un Agent Skill qui apprend à Claude Code le pont JavaScript de WebViewGold

Un Agent Skill est un dossier contenant un fichier SKILL.md que Claude Code ne charge que lorsqu'une tâche en a besoin. C'est donc l'endroit idéal pour le pont WebViewGold : des schémas d'URL exacts, des variables injectées et des particularités de plateforme qui comptent chaque fois que l'agent touche à une fonctionnalité native, et jamais le reste du temps. Voici un skill complet, vérifié par rapport à la documentation WebViewGold et prêt pour .claude/skills/.

Dès $109 en paiement unique par plateforme, ou notre équipe s'occupe de tout dès $698.

  • Garantie d'approbation – ou remboursement sous 14 jours
  • Aucun codage requis
  • Paiement unique, mises à jour gratuites
  • Support humain 24/7
  • Conçu en Allemagne depuis 2014 · ISO 27001

Pourquoi un skill plutôt qu'un CLAUDE.md plus long

CLAUDE.md est lu au début de chaque session : chacune de ses lignes coûte donc du contexte à chaque tâche, y compris les nombreuses tâches qui n'ont rien à voir avec les fonctionnalités natives. Les skills fonctionnent dans l'autre sens. Claude Code ne garde en vue que la courte description de chaque skill ; le SKILL.md complet se charge quand vous tapez /webviewgold-bridge ou quand Claude constate qu'une demande correspond à la description. Les fichiers d'appui du dossier du skill ne se chargent que lorsque les instructions y renvoient.

Pour un pont JavaScript, c'est idéal. La table des schémas, les signatures des callbacks et les contournements pour iOS sont des références précises que l'agent doit recopier à l'identique, et elles n'ont aucun intérêt pendant qu'il corrige un bug CSS. Votre CLAUDE.md garde une seule ligne (« fonctionnalités natives : voir le skill webviewgold-bridge »), et les détails vivent à un seul endroit, tenu à jour.

Un skill n'est pas non plus un serveur MCP. MCP connecte Claude à un système vivant comme GitHub, une base de données ou un navigateur. Le pont n'a besoin d'aucune connexion en direct : il lui faut des connaissances exactes et un fichier utilitaire, et c'est précisément ce qu'un skill rassemble.

L'arborescence du dossier

Trois fichiers. Seul SKILL.md est obligatoire ; les deux autres permettent de le garder court.

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 est la ligne la plus importante : c'est elle qui décide quand Claude charge le skill, elle nomme donc les fonctionnalités et les mots que les gens tapent vraiment. Chaque schéma de la table figure dans la documentation WebViewGold, par exemple sur les pages push, biométrie et feuille de partage.

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 nous a permis d'avoir le temps de mise sur le marché le plus court et le plus efficace jamais possible parmi toutes les autres plates-formes d'application que nous avons essayées au cours des 5 dernières années. Je ne sais pas pourquoi je ne vous ai pas découvert plus tôt, mais je suis vraiment, vraiment content de l'avoir fait. Nous approchons actuellement les 6000 téléchargements d'application sur l'App Store iOS et Google Play Store sans aucun problème!

Antonio Davila · CodeCanyon

platform-notes.md

Ce qu'il faut activer dans les projets natifs pour chaque fonctionnalité, et les points où iOS et Android diffèrent. Claude lit ce fichier quand il vous indique quels réglages activer. La note sur la biométrie reflète la documentation telle qu'elle est aujourd'hui : la page iOS documente trois callbacks, la page Android seulement la demande d'authentification.

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

L'utilitaire que le skill demande à Claude de recopier. C'est le seul endroit qui connaît le jeton du user agent, et il gère trois détails que les agents oublient souvent : l'appel discret via une iframe pour le retour haptique, tiré de la documentation haptique iOS, un seul changement de location par exécution de script sur iOS (voir MultiAPICall), et l'effacement d'une variable périmée avant la lecture d'une valeur fraîche.

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);
}

Installez et testez le skill

Fonctionne de la même façon dans le terminal, les extensions IDE et les sessions cloud.

  1. Créez le dossier

    Créez .claude/skills/webviewgold-bridge/ à la racine du dépôt avec les trois fichiers ci-dessus et commitez-les. Pour un skill que vous voulez retrouver dans tous vos projets, utilisez plutôt ~/.claude/skills/webviewgold-bridge/.

  2. Adaptez-le à votre app

    Supprimez les lignes de la table qui concernent des fonctionnalités que vous n'avez pas activées dans les projets natifs. Un schéma lié à une fonctionnalité désactivée ne fait rien à l'exécution, et un agent qui le voit dans la table l'intégrera sans hésiter.

  3. Vérifiez que Claude le voit

    Tapez / dans Claude Code et cherchez webviewgold-bridge, ou demandez « quels skills pouvez-vous utiliser dans ce projet ? ». S'il manque, vérifiez que le frontmatter commence bien à la toute première ligne de SKILL.md.

  4. Laissez-le se déclencher tout seul

    Demandez une fonctionnalité sans nommer le skill : « Ajoutez un bouton de partage sur la page de recette. » Claude devrait charger le skill, utiliser shareapp:// via share() et conserver le bouton de copie du lien comme solution de repli dans le navigateur.

  5. Lancez-le explicitement quand vous le souhaitez

    /webviewgold-bridge ajoute un retour haptique de succès après le paiement charge le skill et transmet le reste de la ligne comme tâche.

  6. Relisez, déployez, testez sur un appareil

    Vérifiez que chaque appel est protégé par isNativeApp() et lisez la liste des réglages natifs que Claude vous signale. Déployez ensuite et testez dans la vraie app ; le push et Face ID ne fonctionnent pas dans un navigateur de bureau.

Faites adapter le skill à votre app par Claude Code

Utilisez-le au lieu de copier les fichiers à la main si vous voulez que le skill se limite aux fonctionnalités que vous avez réellement activées.

À coller dans Claude Code, à la racine de votre projet
Créez un Agent Skill dans .claude/skills/webviewgold-bridge/ pour ce dépôt. Notre web app tourne aussi dans des apps natives iOS et Android construites avec WebViewGold ; les fonctionnalités natives se déclenchent par des schémas d'URL et renvoient leurs valeurs via des variables JavaScript injectées ou des fonctions de callback globales.

1. Lisez Config.swift et Config.java (dans native/ios et native/android, adaptez si besoin) et listez les fonctionnalités natives réellement activées.
2. Pour chaque fonctionnalité activée, ouvrez la page de documentation correspondante sous https://www.webviewgold.com/docs/iOS/ et https://www.webviewgold.com/docs/android/ et recopiez exactement le schéma, les paramètres et les variables renvoyées. Laissez de côté tout ce que vous ne trouvez pas dans la documentation et listez ces éléments à part pour moi.
3. Rédigez SKILL.md avec un frontmatter (name: webviewgold-bridge, et une description qui nomme les fonctionnalités et les mots qu'un utilisateur taperait), des règles courtes (garde isNativeApp, solution de repli dans le navigateur, multiapicall sur iOS pour plusieurs appels de données, variables injectées asynchrones, aucun schéma inventé), une table des schémas et une checklist pour terminer une tâche.
4. Mettez dans platform-notes.md les différences entre iOS et Android ainsi que les réglages requis dans Config.swift, Config.java, Info.plist et AndroidManifest.xml.
5. Mettez le module utilitaire dans templates/native.ts avec isNativeApp, callNative, callNativeQuietly (iframe), readInjected et callAndRead.

Gardez SKILL.md sous les 150 lignes et montrez-moi chaque fichier avant de l'enregistrer.

Skill, CLAUDE.md, sous-agent, commande, hook ou MCP ?

MécanismeSe chargeUsage dans un projet WebViewGold
CLAUDE.mdÀ chaque sessionDes règles permanentes et courtes : l'app tourne dans une WebView, les règles des stores, les routes protégées
Skill (SKILL.md)Quand une tâche correspond, ou via /nomDes connaissances de référence et des modèles, comme ce skill pour le pont
Sous-agentQuand Claude délègueUn travail qui exige son propre contexte et un rôle strict, comme le vérificateur de conformité aux stores
CommandeQuand vous la tapezUne procédure que vous lancez volontairement, comme /release-check
HookÀ un événement du cycle de vie, à chaque foisDes règles qui doivent tenir même si le modèle n'est pas d'accord, comme l'absence d'URL localhost dans les fichiers Config
Serveur MCPQuand ses outils sont appelésDes systèmes vivants : GitHub, votre base de données, un navigateur pour les captures d'écran

Pièges

  • Une description vague. « Aide WebViewGold » ne se déclenche jamais. Nommez les fonctionnalités et les verbes que les gens emploient : push, Face ID, scanner, partager, vibrer, noter l'app.
  • Deux sources de vérité. Si la table des schémas vit aussi dans CLAUDE.md, l'une des deux copies finit par être périmée. Gardez la table dans le skill et laissez CLAUDE.md y renvoyer.
  • Un skill qui devient un manuel. Gardez SKILL.md court et déplacez les détails dans des fichiers d'appui. Claude lit ce vers quoi les instructions renvoient, au moment où il en a besoin.
  • Sauter le test sur appareil. Le skill rend le code correct ; seule la vraie app prouve que la fonctionnalité est activée, autorisée et opérationnelle.
  • Un skill périmé après une mise à jour de WebViewGold. Quand vous passez à une nouvelle version de WebViewGold, demandez à Claude de revérifier la table par rapport à la documentation et aux nouveaux fichiers Config.
  • Installer des skills que vous n'avez pas lus. Les skills peuvent embarquer des scripts que Claude est susceptible d'exécuter. Lisez un skill tiers avant de l'ajouter, comme vous le feriez pour une dépendance.

Questions fréquentes

Les skills fonctionnent-ils dans Claude Code sur le web et dans GitHub Actions ?

Oui. Les skills de projet dans .claude/skills/ font partie du dépôt : les sessions cloud les chargent donc, et la GitHub Action de Claude Code peut lancer un skill quand le workflow fait d'abord un checkout du dépôt et passe /nom-du-skill comme prompt.

Claude chargera-t-il le skill automatiquement ?

Quand une demande correspond à la description, oui. Vous pouvez aussi le lancer vous-même avec /webviewgold-bridge. Si vous ne voulez qu'un usage manuel, ajoutez disable-model-invocation: true au frontmatter.

En quoi est-ce différent du guide du pont JavaScript ?

Le guide vous explique le pont et fournit un prompt d'intégration ponctuel. Le skill en est la version permanente pour l'agent : il se charge tout seul chaque fois qu'une tâche ultérieure touche à une fonctionnalité native, des mois après que vous en avez oublié les détails.

Cursor ou Codex peuvent-ils utiliser le même SKILL.md ?

SKILL.md suit le format ouvert Agent Skills, que plusieurs autres agents savent lire, mais chaque outil cherche dans son propre dossier. Consultez la documentation de l'outil concerné, ou utilisez les modèles de règles Cursor ou d'AGENTS.md de cette section.

Pourquoi un schéma fonctionne-t-il sur Android mais pas sur iOS ?

Généralement parce que plusieurs affectations de window.location.href ont été exécutées dans le même script. iOS n'en traite qu'une ; regroupez les appels de données avec multiapicall:// et déclenchez le retour haptique via une iframe temporaire, comme le fait l'utilitaire.

Trois façons de mettre votre app dans les stores

Même résultat, charge de travail différente de votre côté. Les trois formules incluent la garantie d'approbation et le support humain 24/7.

Faites-le vous-même

$109 par plateforme, paiement unique

La licence WebViewGold : un projet Xcode ou Android Studio prêt à l'emploi. Collez votre URL, définissez le nom et l'icône, activez les fonctionnalités, compilez et soumettez. Mises à jour gratuites à vie.

Voir les offres sur la page principale

Full Service

$698 par plateforme $798

Envoyez-nous votre URL et votre icône. Notre équipe configure, compile et livre votre app sous 72 heures, en marque blanche, projets sources inclus. Les deux plateformes pour $1,158.

Détails du Full Service Propulsé par WeSetupYourWebViewApp

Prix Soldes d'hiver valables jusqu'au 31 décembre 2026.

Prêt à publier votre app ?

Garantie d'approbation App Store & Google Play – ou remboursement sous 14 jours

Vous préférez déléguer ? Full Service : nous configurons, compilons et livrons sous 72 heures, dès $698 par plateforme. Des questions ? Chattez avec nous 24/7.

Les remboursements sont accordés aux conditions indiquées dans notre FAQ : un refus non lié au contenu par Apple et/ou Google, demandé dans les 14 jours suivant l'achat.