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

Claude Code

La stack Claude Code + Supabase sur l'App Store et Google Play

Claude Code et Supabase forment une paire naturelle : l'agent écrit le schéma, les politiques et les edge functions, Supabase les exécute. Dans une app WebViewGold, cinq points demandent une attention qu'un navigateur n'a jamais exigée : l'authentification dans une WebView, les magic links, la suppression de compte, les ID utilisateur push et les achats via les stores. Voici la liste de configuration.

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

Supabase Auth dans une WebView

La connexion par e-mail et mot de passe fonctionne sans changement : la session vit dans le stockage de la WebView et persiste tant que le wrapper ne l'efface pas (deletecache dans Config.swift et CLEAR_CACHE_ON_STARTUP dans Config.java restent sur false). OAuth, c'est différent. Google refuse de finaliser une connexion dans une WebView intégrée (l'erreur disallowed_useragent), c'est pourquoi WebViewGold fournit un Social Login Helper : vous listez les préfixes d'URL du flux du fournisseur, et le wrapper ouvre cette partie dans une fenêtre de connexion dédiée que le fournisseur accepte, puis revient à votre app. Pour Supabase avec Google, le déclencheur est https://accounts.google.com, défini dans google_login_helper_triggers (Config.swift) et GOOGLE_LOGIN_HELPER_TRIGGERS (Config.java). Sign in with Apple n'a besoin de rien : le wrapper détecte appleid.apple.com automatiquement.

Concrètement : activez le fournisseur Apple dans le tableau de bord Supabase (Services ID, clé, Team ID, URL de retour), ajoutez le bouton à côté de celui de Google pour respecter la guideline 4.8, et demandez à Claude Code de brancher signInWithOAuth pour les deux, avec une redirection vers votre domaine de production.

Des magic links qui s'ouvrent dans l'app

Un magic link reçu par e-mail s'ouvre par défaut dans le navigateur. Les Universal Links et les App Links l'envoient plutôt dans l'app.

  1. Servez les fichiers d'association

    Demandez à Claude Code d'ajouter au projet web /.well-known/apple-app-site-association (un JSON avec votre Team ID et votre bundle ID, servi sans extension de fichier et avec un content type JSON) et /.well-known/assetlinks.json (votre nom de package et l'empreinte de votre certificat de signature). Sur Next.js, cela correspond au dossier public plus une règle d'en-tête.

  2. Activez la capacité dans le wrapper

    iOS : Associated Domains avec applinks:app.example.com dans Xcode et ShowExternalLink réglé sur true dans Config.swift. Android : l'intent filter de votre domaine dans AndroidManifest.xml et IS_DEEP_LINKING_ENABLED réglé sur true dans Config.java. Détails dans la documentation Universal Links et la documentation App Links.

  3. Faites pointer Supabase vers votre domaine

    Définissez la site URL et la liste des redirections autorisées sur https://app.example.com/auth/callback. Le lien de l'e-mail arrive alors sur votre domaine, que le système transmet à l'app quand elle est installée.

  4. Proposez un code en solution de repli

    Certaines apps de messagerie ouvrent les liens dans leur propre navigateur. Demandez à Claude Code d'ajouter une option OTP à six chiffres (ajoutez la variable du jeton au modèle d'e-mail du magic link dans le tableau de bord Supabase) pour qu'un utilisateur qui se retrouve dans Safari puisse quand même terminer dans l'app. Si vous utilisez le flux PKCE, cette solution de repli compte encore plus, car le code verifier n'existe que dans le contexte qui a lancé la connexion.

La suppression de compte sous forme d'edge function

Apple 5.1.1 et Google Play exigent la suppression dans l'app ; Supabase en fait une seule fonction, avec la clé service role conservée côté serveur.

Prompt pour Claude Code
Implémentez la suppression de compte pour cette app Supabase, comme l'exigent Apple et Google Play.
1. Créez une edge function Supabase delete-account qui : lit le JWT de l'utilisateur dans l'en-tête Authorization et le vérifie avec le client anon ; puis, à l'aide d'un client service role créé uniquement à l'intérieur de la fonction, supprime les lignes de l'utilisateur dans chaque table qui référence auth.users (listez-les à partir du schéma ; privilégiez des clés étrangères ON DELETE CASCADE là où elles manquent et écrivez la migration), supprime les fichiers de l'utilisateur dans les buckets de stockage, et appelle enfin auth.admin.deleteUser(userId). Renvoyez 204 en cas de succès et une erreur claire sinon.
2. Dans la web app, ajoutez Réglages - Supprimer le compte avec une boîte de dialogue de confirmation qui explique ce qui est supprimé, appelle la fonction avec la session courante, déconnecte l'utilisateur et affiche un écran de confirmation. S'il existe des abonnements RevenueCat, indiquez à l'utilisateur de les résilier d'abord dans les réglages de l'App Store ou de Google Play.
3. Ajoutez une page publique /delete-account qui explique la procédure aux utilisateurs qui n'ont pas l'app.
4. Ajoutez une phrase sur la suppression dans /privacy.
5. Écrivez un test qui crée un utilisateur jetable, insère des lignes, appelle la fonction et vérifie que tout a disparu.

Excellent travail! Je n'ai jamais codé quoi que ce soit, mais j'ai réussi à travailler avec cela. Facile et rapide! Avec une grande aide des créateurs!

Lucas Dubois · CodeCanyon

Rappels RLS avant la mise en ligne

La clé anon se trouve dans votre bundle client par conception, et une app publiée peut être téléchargée par n'importe qui. C'est la Row Level Security qui rend cela sûr.

  • Chaque table du schéma public a la RLS activée et des politiques explicites pour select, insert, update et delete utilisant auth.uid(). Demandez à Claude Code de lister les tables sans RLS et d'écrire les politiques manquantes.
  • Les buckets de stockage ont aussi des politiques ; un bucket public est public pour tout le monde, y compris pour des personnes qui n'ont jamais ouvert votre app.
  • La clé service role n'apparaît que dans les edge functions et le code serveur, jamais dans le bundle client Vite ou Next.js. Cherchez-la avec grep dans le résultat du build.
  • Les vues et les fonctions RPC respectent les droits de l'appelant ; déclarez les fonctions en security invoker, sauf si vous avez délibérément besoin des droits definer.
  • Des limites de fréquence sur l'authentification et sur les appels RPC coûteux, car les apps des stores attirent du trafic automatisé dès qu'elles sont publiées.

Enregistrer l'ID d'abonnement push sur le profil

Avec autoInjectVariable / AUTO_INJECT_VARIABLES réglé sur true, le wrapper injecte onesignalplayerid dans chaque page ; sinon, demandez-le avec getonesignalplayerid://. Enregistrez-le sur le profil pour qu'une edge function puisse cibler un utilisateur précis.

javascript
// after login, inside the native app only
import { supabase } from "./supabase";
import { isNativeApp, readInjected, callNative } from "./native";

export async function syncPushSubscription(userId) {
  if (!isNativeApp()) return;
  let playerId = window.onesignalplayerid; // present when auto-inject is on
  if (!playerId) {
    callNative("getonesignalplayerid://");
    playerId = await readInjected("onesignalplayerid", 3000).catch(function () { return null; });
  }
  if (!playerId) return;
  await supabase.from("profiles").update({ onesignal_player_id: playerId }).eq("id", userId);
}

// RLS policy to pair with it (SQL):
// create policy "users update own profile" on profiles for update
//   using (auth.uid() = id) with check (auth.uid() = id);

Le webhook RevenueCat et le reste du flux de paiement

Achat depuis la web app

Dans l'app, le bouton Passer à la version supérieure navigue vers revenuecat://purchase?external_id=SUPABASE_USER_ID&product=PRODUCT_ID. C'est en passant l'ID utilisateur Supabase comme external_id que le webhook peut rattacher l'achat à une ligne.

Edge function pour le webhook

Prompt : « Créez une edge function revenuecat-webhook qui vérifie l'en-tête Authorization configuré dans RevenueCat, insère ou met à jour l'événement dans une table subscriptions indexée par app_user_id, et définit un flag is_active selon le type d'événement. » Le client lit les droits via la RLS, jamais à partir du résultat d'achat côté client.

Le web reste sur Stripe

Les navigateurs peuvent garder Stripe. Stockez un seul modèle de droits (une table subscriptions avec une colonne source) pour que les fonctionnalités se débloquent de la même façon, quel que soit l'endroit où l'utilisateur a payé. Voir le guide de configuration RevenueCat.

Commission

Small Business Program d'Apple et palier à 15 % de Google : 15 % de commission jusqu'à 1 million de dollars par an, 30 % au-delà. Inscrivez-vous dans les deux consoles et informez-en RevenueCat.

Questions fréquentes

Ai-je besoin des SDK natifs Supabase pour les apps des stores ?

Non. C'est la web app avec supabase-js qui tourne dans WebViewGold. La couche native ajoute seulement le push, la biométrie, les achats et les deep links via des schémas d'URL.

La session Supabase survit-elle aux redémarrages de l'app ?

Oui, tant que le wrapper n'efface pas le stockage au lancement. Laissez deletecache (iOS) et CLEAR_CACHE_ON_STARTUP (Android) sur false et définissez une durée de session raisonnable dans le tableau de bord Supabase.

La connexion Google fonctionne dans le navigateur mais pas dans l'app. Pourquoi ?

Google bloque les WebViews intégrées. Définissez les déclencheurs du Social Login Helper pour accounts.google.com dans les deux configs WebViewGold ; le wrapper finalise alors la connexion dans une fenêtre acceptée et revient à votre app.

Claude Code peut-il écrire les politiques RLS en toute sécurité ?

Il rédige de bons premiers jets si vous lui donnez le schéma et les règles d'accès en langage clair. Relisez chaque politique, testez avec deux utilisateurs différents, et ne publiez jamais une table sans RLS sous prétexte qu'une démo a fonctionné.

Où vérifier l'achat, côté client ou côté serveur ?

Côté serveur. Le webhook RevenueCat vers une edge function fait foi ; le client se contente de lire la ligne qui en résulte. Les flags côté client peuvent être falsifiés dans n'importe quelle app téléchargeable.

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.