Scanner de QR codes
qrcode:// ouvre le scanner natif et charge l'URL scannée dans l'app : encodez donc des URL de votre propre domaine. Pour les codes-barres de produits, utilisez barcodescanner:// et lisez barcodescanresult.
Claude Code
WebViewGold expose les capacités natives à votre web app sous forme de schémas d'URL et de quelques variables JavaScript globales. C'est un travail idéal pour un agent : indiquez la documentation à Claude Code, dites-lui quelles fonctionnalités vous avez activées, et il les branche sur vos composants existants. Voici comment procéder sans noms d'API inventés.
Dès $109 en paiement unique par plateforme, ou notre équipe s'occupe de tout dès $698.
Votre web app demande une action au wrapper en naviguant vers un schéma, par exemple window.location.href = "bioauth://". Le wrapper intercepte la navigation, exécute l'action native et renvoie le résultat soit en appelant une fonction globale que vous avez définie (onBioAuthSuccess()), soit en injectant une variable globale (onesignalplayerid, nativePushEnabled, barcodescanresult), soit en chargeant une URL (le scanner QR ouvre l'URL scannée dans l'app). Aucun SDK à installer, rien à empaqueter.
Tout est documenté dans un seul fichier lisible par les machines : webviewgold.com/llms-full.txt. Demandez à Claude Code de lire la section concernée avant d'écrire du code, et il utilisera les noms de schémas exacts plutôt que des noms qui sonnent juste. Chaque schéma de cet article a été vérifié dans ce fichier.
Adaptez la liste des fonctionnalités à ce que vous avez activé dans Config.swift et Config.java.
Notre web app tourne aussi dans des apps natives iOS et Android construites avec WebViewGold. Les fonctionnalités natives se déclenchent en naviguant vers des schémas d'URL, et les résultats reviennent sous forme de variables JavaScript globales ou de fonctions de callback globales. Avant d'écrire la moindre ligne de code, récupérez https://www.webviewgold.com/llms-full.txt et lisez les sections suivantes : Push Notifications API, Biometric Authentication API, QR Code Scanner API, App Sharing Dialog API, Haptic Feedback API, File Downloader API, HTML5 Geolocation API. N'utilisez que des noms de schémas qui figurent dans ce fichier. Implémentez ensuite, dans src/lib/native.ts : isNativeApp() (le user agent contient le jeton WebViewGoldApp), callNative(scheme) (définit window.location.href uniquement quand isNativeApp() vaut true, sinon renvoie false) et un helper readInjected(name, timeoutMs) qui attend une variable globale injectée par le wrapper. Branchez ces fonctionnalités sur l'interface existante, chacune derrière isNativeApp() avec une solution de repli web : 1. Push : un bouton Activer les notifications qui appelle registerpush://, une ligne dans les réglages qui appelle checkNativePushPermissions:// et lit nativePushEnabled, et après la connexion un appel à getonesignalplayerid:// qui lit onesignalplayerid et l'enregistre sur le profil utilisateur via notre API. 2. Biométrie : un verrou Face ID / empreinte digitale pour la route /wallet avec bioauth:// et les trois callbacks onBioAuthSuccess, onBioAuthFailure(errorCode, errorMessage), onBioAuthUnavailable ; si la biométrie est indisponible, revenez à la nouvelle saisie du mot de passe que nous avons déjà. 3. Check-in par QR : un bouton Scanner qui appelle qrcode:// ; nos QR codes contiennent des URL de notre propre domaine, donc gérez la route /checkin qu'ils ouvrent. 4. Partage : remplacez le bouton de copie du lien par shareapp://message?=TEXT&url=URL en natif, avec encodeURIComponent sur les deux valeurs. 5. Haptique : successhaptic:// après une commande finalisée, errorhaptic:// en cas d'erreur de validation d'un formulaire, lighthaptic:// lors des changements d'onglet. Sur iOS, utilisez la technique de l'iframe décrite dans la documentation pour que l'haptique n'interrompe pas la navigation. 6. Téléchargements : les téléchargements d'images utilisent savethisimage://?url=IMAGE_URL ; les liens PDF restent des liens normaux. 7. Géolocalisation : gardez navigator.geolocation, mais affichez la première fois un écran d'explication avant la demande d'autorisation. Indiquez quelles options de Config.swift / Config.java et quelles entrées d'Info.plist ou d'AndroidManifest je dois activer pour chaque fonctionnalité.
Petit, indépendant de tout framework, et seul endroit du code qui connaît le user agent.
// src/lib/native.ts
export function isNativeApp() {
return typeof navigator !== "undefined" && navigator.userAgent.indexOf("WebViewGoldApp") !== -1;
}
export function callNative(scheme) {
if (!isNativeApp()) return false;
window.location.href = scheme;
return true;
}
// Wait for a variable the wrapper injects, e.g. onesignalplayerid or nativePushEnabled
export function readInjected(name, timeoutMs) {
return new Promise(function (resolve, reject) {
var started = Date.now();
(function check() {
if (typeof window[name] !== "undefined") return resolve(window[name]);
if (Date.now() - started > (timeoutMs || 3000)) return reject(new Error(name + " not injected"));
setTimeout(check, 100);
})();
});
}
Je suis très content d'avoir acheté cette application ! Extrêmement facile et excellente documentation. J'ai été en contact avec le service client, ils ont répondu très rapidement et très amicalement. Ils ont résolu ma question en un jour. 10/10 recommanderaient.
Nécessite un service push activé dans le wrapper (OneSignal via kPushEnabled et oneSignalID dans Config.swift, PUSH_ENABLED plus les ID dans build.gradle sur Android). Réglez askforpushpermissionatfirstrun (iOS) et requirePush (Android) sur false pour choisir vous-même le moment de la demande.
import { callNative, readInjected } from "./native";
// 1. Ask at the right moment (after onboarding, not on first launch)
export function askForPush() {
return callNative("registerpush://");
}
// 2. Is push currently allowed? Sets window.nativePushEnabled
export async function isPushEnabled() {
if (!callNative("checkNativePushPermissions://")) return null;
return readInjected("nativePushEnabled", 2000);
}
// 3. Store the OneSignal subscription ID on the user so the server can target this device
export async function syncPushId(saveToProfile) {
if (!callNative("getonesignalplayerid://")) return;
var id = await readInjected("onesignalplayerid", 3000);
await saveToProfile(id);
}
// 4. A local reminder in two hours, no push service needed
export function scheduleLocalReminder(title, message, url) {
var seconds = 2 * 60 * 60;
callNative("sendlocalpushmsg://push.send?s=" + seconds + "=msg!" + message + "&!#" + title + "&!#" + url);
}Sur iOS, le projet a besoin de la description d'utilisation de Face ID dans Info.plist (NSFaceIDUsageDescription) ; Android utilise le BiometricPrompt du système et n'a besoin de rien d'autre. Le wrapper appelle les fonctions globales, donc définissez-les sur window.
import { callNative } from "./native";
export function requireBiometrics(onPass, onFallback) {
window.onBioAuthSuccess = function () { onPass(); };
window.onBioAuthFailure = function (errorCode, errorMessage) {
console.warn("bioauth failed", errorCode, errorMessage);
onFallback();
};
window.onBioAuthUnavailable = function () { onFallback(); };
if (!callNative("bioauth://")) onFallback(); // browser: use the password re-entry instead
}
// Security note from the documentation: treat the success callback as a UI gate only.
// Keep sensitive actions behind a server-side session check as well.qrcode:// ouvre le scanner natif et charge l'URL scannée dans l'app : encodez donc des URL de votre propre domaine. Pour les codes-barres de produits, utilisez barcodescanner:// et lisez barcodescanresult.
shareapp://message?=TEXT&url=URL ouvre la boîte de dialogue de partage du système sur les deux plateformes. Encodez les deux valeurs. Sur Android, l'API ShareIntent permet en plus aux autres apps de partager du contenu vers la vôtre.
lighthaptic://, heavyhaptic://, successhaptic://, warninghaptic://, errorhaptic:// ; mediumhaptic:// est réservé à iOS. La documentation montre un helper à base d'iframe pour que l'appel n'annule pas une navigation en cours.
savethisimage://?url=… enregistre une image dans la photothèque. Les liens se terminant par .pdf, .docx, .xlsx, .mp3 et les autres extensions listées se téléchargent nativement ; étendez la liste avec extentionARY (Config.swift) ou downloadableExtension (Config.java), ou activez autodownloader / AUTO_DOWNLOAD_FILES pour les en-têtes Content-Disposition.
Le simple navigator.geolocation fonctionne ; le wrapper affiche la boîte de dialogue d'autorisation native. iOS exige HTTPS et le texte de description d'utilisation de la localisation dans Info.plist, Android exige requireLocation réglé sur true dans Config.java, avec les entrées correspondantes dans le manifest.
| Fonctionnalité | iOS (Config.swift / projet) | Android (Config.java / projet) |
|---|---|---|
| Push (OneSignal) | kPushEnabled, oneSignalID ; documentation | PUSH_ENABLED, ID dans build.gradle ; documentation |
| Biométrie | Description d'utilisation de Face ID dans Info.plist ; documentation | Aucun réglage nécessaire ; documentation |
| QR / code-barres | Description d'utilisation de la caméra ; qrcodelinks détermine où s'ouvrent les URL scannées ; documentation | requireCamera, QR_CODE_URL_OPTIONS ; documentation |
| Partage, haptique | Rien à activer ; documentation | Rien à activer ; documentation |
| Téléchargements | extentionARY, autodownloader ; documentation | downloadableExtension, AUTO_DOWNLOAD_FILES, requireStorage ; documentation |
| Géolocalisation | Description d'utilisation de la localisation dans Info.plist ; documentation | requireLocation ; documentation |
Il doit récupérer le fichier une fois. Si votre configuration bloque l'accès web, téléchargez le fichier dans le dépôt (par exemple docs/webviewgold-llms-full.txt) et référencez ce chemin dans CLAUDE.md.
Parce que le serveur peut alors envoyer une notification push à une personne précise (commande expédiée, nouvelle réponse). Sans cet ID, vous ne pouvez envoyer qu'à des segments.
Oui, pour les valeurs de Config.swift et Config.java et les textes d'autorisation. Gardez la signature et le provisioning hors de sa portée ; le guide de configuration des projets explique où placer la limite.
Rien de visible. registerpush:// sans service push actif, par exemple, n'a aucun effet. Activez d'abord la fonctionnalité dans le wrapper, puis testez l'appel.
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.
$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$349 par licence, extension en paiement unique
Ni Mac, ni Xcode, ni Android Studio : configurez dans le navigateur, nous compilons les deux apps dans le cloud et les transmettons à App Store Connect et à la Play Console.
Comment fonctionne le Cloud Builder Essayer la démo gratuite$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é parPrix Soldes d'hiver valables jusqu'au 31 décembre 2026.
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.