Zum Inhalt springen
WebViewGold Vibe Coding in den App Store
Deutsch
WebViewGold holen

Claude Code + Push

OneSignal-Push-Benachrichtigungen mit WebViewGold in eine Claude Code Web-App einbauen

Push ist das native Feature, das Reviewern als Erstes auffällt, und das, was Nutzer tatsächlich eingeschaltet lassen. Mit WebViewGold läuft OneSignal in der nativen Hülle; deine Web-App entscheidet nur, wann sie fragt, zu welchem Nutzer ein Gerät gehört und welchen Screen eine Benachrichtigung öffnet. Claude Code kann all das in einer Session schreiben, und dieser Guide liefert dir den Prompt, den Server-Code und den Testplan.

Ab $109 einmalig pro Plattform, oder unser Team erledigt alles ab $698.

  • Genehmigungsgarantie – oder Geld zurück innerhalb von 14 Tagen
  • Kein Programmieren nötig
  • Einmalzahlung, kostenlose Updates
  • 24/7 Support von echten Menschen
  • Made in Germany seit 2014 · ISO 27001

Was du hier verbindest und warum Reviewer darauf achten

WebViewGold liefert das OneSignal-SDK in beiden nativen Projekten mit. Sobald du es einschaltest, empfängt die App Pushes, auch wenn sie geschlossen ist. Deine Web-App behält drei Entscheidungen in der Hand: wann der Berechtigungsdialog des Systems erscheint, zu welchem Nutzer ein Gerät gehört und welche URL eine Benachrichtigung öffnet. Jede davon ist ein URL-Schema oder eine injizierte JavaScript-Variable, dokumentiert in der iOS-Push-Doku und der Android-Push-Doku.

Reviewer achten aus zwei Gründen darauf. Richtlinie 4.2 erwartet, dass eine webbasierte App mehr kann als eine Website, und ein funktionierender Push-Opt-in ist meist die erste native Fähigkeit, die sie zu sehen bekommen. Richtlinie 4.5.4 setzt die Grenzen: Die App muss ohne Push funktionieren, Benachrichtigungen dürfen keine sensiblen personenbezogenen Daten enthalten, und Werbe-Pushes brauchen ein ausdrückliches Opt-in in deiner UI plus eine Möglichkeit, sich wieder abzumelden. Ab Android 13 kommt eine Laufzeitberechtigung (POST_NOTIFICATIONS) hinzu, der Zeitpunkt deiner Anfrage zählt also auf beiden Plattformen.

Der Ablauf, bei dem du am Ende landest: Nach dem Onboarding navigiert die Web-App zu registerpush://; sobald der Nutzer zustimmt, liest sie onesignalplayerid und speichert die ID beim Nutzer; dein Server schickt einen Push an diese Subscription-ID mit einer url in den Additional Data, und WebViewGold öffnet diese URL, wenn die Benachrichtigung angetippt wird. Den Gesamtüberblick über die nativen Features findest du im Hub zu Push-Benachrichtigungen.

Was Claude Code übernimmt und was du machst

BereichClaude CodeDu
OneSignal-DashboardNichts; es hat keinen Zugriff auf dein DashboardDie App anlegen, die APNs-Zugangsdaten (iOS) und die Firebase-Zugangsdaten (Android) hinterlegen, die App ID kopieren und einen REST-API-Key erstellen
WebViewGold-ProjekteKann kPushEnabled, oneSignalID, PUSH_ENABLED und die ID in der build.gradle setzen, wenn die Projekte im Repository liegen; du prüfst das DiffCapabilities im Apple Developer Portal, die Bundle-ID der OneSignal-Extension, Signierung und Builds
Web-AppPush-Helper, Opt-in-Screen, Zeile in den Einstellungen, Register-Route, Send-Helper, Datenbank-Migration, Regeln in der CLAUDE.mdDen Plan freigeben, die Umgebungsvariablen setzen, deployen
TestsEin schriftlicher Testplan und auf Wunsch eine versteckte Debug-Seite, die Push-Status und Subscription-ID anzeigtEin echtes iPhone und ein echtes Android-Handy, TestFlight und interner Test

OneSignal einschalten und Claude Code den Web-Teil machen lassen

Plane etwa eine Stunde ein, das meiste davon in den Konsolen von Apple und Firebase.

  1. Eine OneSignal-App für beide Plattformen anlegen

    Füge iOS mit deinen APNs-Zugangsdaten hinzu (OneSignal empfiehlt einen .p8-Auth-Key; ein Push-Zertifikat funktioniert auch) und Android mit der JSON-Datei des Firebase-Dienstkontos, nach der OneSignal fragt. Kopiere die OneSignal App ID und erstelle einen REST-API-Key für deinen Server.

  2. iOS: Config.swift und Capabilities

    Setze kPushEnabled auf true, füge die App ID in oneSignalID ein und setze askforpushpermissionatfirstrun auf false, damit du den Zeitpunkt des Dialogs selbst bestimmst. Aktiviere im Apple Developer Portal Push Notifications und App Groups für die App ID. Das Target der OneSignal-Extension braucht deine Bundle-ID plus .OneSignalNotificationServiceExtension.

  3. Android: Config.java und build.gradle

    Setze PUSH_ENABLED auf true, füge die App ID in ONE_SIGNAL_APP_ID in der build.gradle (Module: app) ein und setze requirePush auf false. Ersetze ic_stat_onesignal_default.png durch dein eigenes einfarbiges Icon, sonst sehen Nutzer eine generische Glocke.

  4. Die App im User-Agent markieren

    Setze useragent_iphone und useragent_ipad (iOS) sowie USER_AGENT (Android) auf einen normalen mobilen User-Agent, gefolgt von WebViewGoldApp, damit isNativeApp() die App von Safari oder Chrome unterscheiden kann. Das CLAUDE.md-Template erklärt die Konvention.

  5. Den Prompt im Plan-Modus ausführen

    Drücke Shift+Tab, bis Claude Code den Plan-Modus anzeigt (oder starte es mit claude --permission-mode plan), füge den Prompt unten ein und gib den Plan erst frei, wenn er die Dateien und die Tabelle auflistet, die du erwartest. Lass es dann implementieren, lies das Diff und deploye.

  6. Bauen und installieren

    Archiviere die iOS-App für TestFlight und lade das Android-Bundle in den internen Test hoch. Wenn du dafür lieber kein Xcode und kein Android Studio installieren willst, baut der Cloud Builder beide Apps im Browser und lädt sie für dich hoch.

Großartige Möglichkeit, eine Web-App in eine native App zu verwandeln! Schnelle Umsetzung und ein toller Weg, Apps in die App Stores zu bringen, ohne eine komplett native App entwickeln zu müssen!

Kevin Joling · FlightConnections & TrainConnections · Trustpilot

Der Claude Code Prompt

Passe Tabellenname, Routen und die Beispiel-Benachrichtigungen an deine App an. Der Prompt sagt dem Agenten, wo die maßgeblichen Schema-Namen stehen, damit er keine erfindet.

In Claude Code einfügen (zuerst im Plan-Modus)
Unsere Web-App läuft auch in nativen iOS- und Android-Apps, die mit WebViewGold gebaut sind. OneSignal-Push ist in den nativen Projekten eingeschaltet. Die Web-App soll im richtigen Moment um Erlaubnis fragen und die Subscription-ID des Geräts an unseren Server melden, und der Server verschickt gezielte Benachrichtigungen. Lies vor dem Schreiben von Code die Abschnitte zu Push Notifications für iOS und Android in https://www.webviewgold.com/llms-full.txt und verwende nur URL-Schemata und Variablen, die dort dokumentiert sind. Beginne mit einem Plan und warte auf meine Freigabe.

Implementiere:
1. src/lib/native.ts (verwende die Datei weiter, wenn sie existiert): isNativeApp() prüft navigator.userAgent auf das Token WebViewGoldApp; callNative(url) setzt window.location.href nur innerhalb der App; readInjected(name, timeoutMs) fragt window[name] alle 100 ms ab und bricht nach dem Timeout mit einem Fehler ab.
2. src/lib/push.ts: askForPush() navigiert zu registerpush://. getPushStatus() navigiert zu checkNativePushPermissions:// und liefert window.nativePushEnabled (true oder false). syncPushId() navigiert zu getonesignalplayerid://, liest window.onesignalplayerid und sendet die ID per POST zusammen mit der Plattform (ios oder android, aus dem User-Agent) an /api/push/register. Löse niemals zwei Schemata im selben Skriptdurchlauf aus: Auf iOS funktionieren mehrere window.location.href-Aufrufe in einem Skript nicht, also staffle sie mit etwa einer Sekunde Abstand.
3. Ein Opt-in-Screen, der einmal nach dem Onboarding erscheint, nie auf dem ersten Screen und nur, wenn isNativeApp() true ist: ein Satz dazu, was wir schicken (Bestell-Updates und Antworten), ein Button „Benachrichtigungen aktivieren“ (askForPush, nach 3 Sekunden dann syncPushId) und ein Link „Jetzt nicht“, der den Screen per localStorage für 14 Tage ausblendet.
4. Einstellungen: eine Zeile „Benachrichtigungen“, die den Status aus getPushStatus() zeigt. Wenn sie aus sind, zeige „Einstellungen öffnen“, das zu settingsapp:// navigiert. Ergänze einen separaten Schalter „Produktneuigkeiten“, standardmäßig aus und im Nutzerprofil gespeichert; nur Nutzer, die ihn eingeschaltet haben, dürfen Werbe-Pushes bekommen (Apple-Richtlinie 4.5.4).
5. Rufe bei jedem App-Start eines angemeldeten Nutzers in der App einmal syncPushId() auf, weil sich die Subscription-ID nach einer Neuinstallation ändern kann.
6. Server: POST /api/push/register (authentifiziert; schreibt user_id, subscription_id, platform, last_seen_at per Upsert in eine Tabelle push_devices; leg die Migration an) und ein reiner Server-Helper sendPushToUser(userId, title, message, path), der die OneSignal REST API mit include_subscription_ids aufruft und die vollständige https-URL des Ziel-Screens in data.url setzt. Lies ONESIGNAL_APP_ID und ONESIGNAL_REST_API_KEY ausschließlich aus serverseitigen Umgebungsvariablen.
7. Rufe sendPushToUser überall dort auf, wo eine neue Antwort oder eine Änderung des Bestellstatus entsteht. Keine persönlichen oder sensiblen Details im Benachrichtigungstext.
8. Ergänze die Push-Regeln von oben in der CLAUDE.md.

Berichte, welche Dateien du geändert hast, die Migration, die Umgebungsvariablen, die ich setzen muss, und alles, was du nicht überprüfen konntest.

Die Register-Route und der Send-Helper

Next.js App Router mit TypeScript; bitte den Agenten, das an Express, eine Supabase Edge Function oder eine Cloud Function anzupassen, wenn das dein Stack ist. Der Wert data.url ist das, was WebViewGold beim Antippen der Benachrichtigung öffnet; das Feld Launch URL von OneSignal ist dafür das falsche.

typescript
// app/api/push/register/route.ts  (wird von der Web-App in der nativen Hülle aufgerufen)
import { NextResponse } from "next/server";
import { getUser, db } from "@/lib/server"; // deine Auth- und Datenbank-Helper

export async function POST(req: Request) {
  const user = await getUser(req);
  if (!user) return NextResponse.json({ error: "unauthorized" }, { status: 401 });

  const { subscriptionId, platform } = await req.json();
  if (typeof subscriptionId !== "string" || subscriptionId.length < 10) {
    return NextResponse.json({ error: "invalid subscription id" }, { status: 400 });
  }
  await db.pushDevices.upsert({ userId: user.id, subscriptionId, platform, lastSeenAt: new Date() });
  return NextResponse.json({ ok: true });
}

// lib/push-server.ts  (nur Server, nie aus Client-Komponenten importieren)
export async function sendPushToUser(userId: string, title: string, message: string, path: string) {
  const devices = await db.pushDevices.findMany({ userId });
  if (devices.length === 0) return { sent: 0 };

  const res = await fetch("https://api.onesignal.com/notifications?c=push", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: "Key " + process.env.ONESIGNAL_REST_API_KEY,
    },
    body: JSON.stringify({
      app_id: process.env.ONESIGNAL_APP_ID,
      include_subscription_ids: devices.map((d) => d.subscriptionId),
      headings: { en: title },
      contents: { en: message },
      data: { url: "https://app.example.com" + path }, // wird von WebViewGold beim Antippen geöffnet
    }),
  });
  if (!res.ok) throw new Error("OneSignal " + res.status + ": " + (await res.text()));
  return { sent: devices.length };
}

Checkliste auf echten Handys

Simulatoren und Desktop-Browser können nichts davon beweisen. Nimm den TestFlight-Build auf einem iPhone und den Build aus dem internen Test auf einem Handy mit Android 13 oder neuer, beide frisch installiert.

  • Erster Start: Es erscheint kein Systemdialog, weil askforpushpermissionatfirstrun und requirePush auf false stehen.
  • Nach dem Onboarding erscheint dein Opt-in-Screen; „Benachrichtigungen aktivieren“ zeigt den Systemdialog; „Jetzt nicht“ blendet den Screen aus, und er bleibt auch beim nächsten Start ausgeblendet.
  • Nach der Zustimmung erscheint eine Zeile in push_devices, und das Gerät taucht in OneSignal unter Audience → Subscriptions auf.
  • Schick einen Test aus dem OneSignal-Dashboard, bei dem die Additional Data url auf eine tiefe Seite wie /orders/42 zeigt. Tippe ihn in drei Zuständen an: bei beendeter App, im Hintergrund und im Vordergrund. Jedes Mal öffnet sich diese Seite in der App.
  • Löse ein echtes Ereignis aus (eine Antwort an den Testnutzer) und prüfe, dass nur die Geräte dieses Nutzers den Push bekommen.
  • Verweigere auf einem zweiten Gerät die Berechtigung: Die Einstellungen zeigen, dass Benachrichtigungen aus sind, und „Einstellungen öffnen“ springt über settingsapp:// zum Systemscreen. Aktiviere sie dort wieder, kehre zurück, und der Status aktualisiert sich.
  • Lösche die App, installiere sie neu und melde dich an: Eine neue Subscription-ID wird registriert.

Stolperfallen

  • Zwei Schemata in einem Skriptdurchlauf auf iOS. Im selben Skript nacheinander mehrere Schemata auf window.location.href zu setzen, funktioniert auf iOS nicht (Android kommt damit klar). Staffle die Aufrufe mit Verzögerung oder nutze für die unterstützten Datenabfragen das dokumentierte multiapicall://getonesignalplayerid,getappversion (MultiAPICall-Doku).
  • Launch URL statt Additional Data. WebViewGold liest das Feld url aus den Additional Data. Lass kPushOpenDeeplinkInBrowser (iOS) und OPEN_NOTIFICATION_URLS_IN_SYSTEM_BROWSER (Android) auf false, wenn Links in der App aufgehen sollen.
  • Die ID zu früh lesen. onesignalplayerid wird asynchron injiziert und existiert eventuell erst, wenn sich das SDK registriert hat. Frag mit Timeout ab und versuch es beim nächsten App-Start erneut, statt still zu scheitern.
  • Sich auf den URL-Parameter verlassen. Mit kPushEnhanceUrl oder PUSH_ENHANCE_WEBVIEW_URL bekommt nur der erste Request ?onesignal_push_id=…; ein clientseitiger Router verliert ihn. Speichere ihn sofort in einem Cookie oder der Session, oder nutze autoInjectVariable / AUTO_INJECT_VARIABLES.
  • Ein Push-Dienst, der nicht eingeschaltet ist. registerpush:// tut nichts, wenn im Wrapper kein Push-Dienst aktiviert ist. Prüfe die Konfiguration, bevor du dein JavaScript debuggst.
  • Secrets im Client. Der REST-API-Key gehört ausschließlich in serverseitige Umgebungsvariablen. Claude Code braucht nie den echten Wert; gib ihm den Variablennamen.

Häufig gestellte Fragen

Kann ich statt OneSignal Firebase Cloud Messaging nutzen?

Ja. Setze kFirebasePushEnabled in Config.swift mit deiner GoogleService-Info.plist und FIREBASE_PUSH_ENABLED in Config.java mit deiner google-services.json. Im Web-Code bleibt alles gleich, nur kommt die ID über getfirebaseplayerid:// als firebaseplayerid.

Ist Push für die Freigabe im App Store Pflicht?

Nein, und die App darf auch nicht davon abhängen (Richtlinie 4.5.4). Trotzdem ist Push eines der stärksten Signale für Richtlinie 4.2, dass deine App mehr ist als eine Website.

Kann ich Benachrichtigungen ohne Server verschicken?

Ja. Broadcasts aus dem OneSignal-Dashboard brauchen keinen Code, und lokale Erinnerungen, die mit sendlocalpushmsg:// geplant werden, funktionieren ganz ohne Push-Dienst. Einen Server brauchst du nur für Nachrichten an einzelne Nutzer.

Warum nicht gleich beim ersten Start um Erlaubnis fragen?

iOS zeigt den Systemdialog nur einmal. Lehnt der Nutzer ab, weil er deine App noch nicht kennt, lässt sich das nur noch in den Systemeinstellungen ändern. Wer nach einem Moment fragt, der den Nutzen erklärt, bekommt deutlich mehr Zustimmungen.

Funktioniert Web-Push über einen Service Worker in der App?

Verlass dich nicht darauf. In der WebViewGold-App läuft Push nativ über OneSignal, Firebase oder Pushwoosh. Web-Push, falls du ihn nutzt, behältst du nur für Besucher im Browser.

Drei Wege, deine App in die Stores zu bringen

Gleiches Ergebnis, unterschiedlich viel Arbeit auf deiner Seite. Alle drei kommen mit Genehmigungsgarantie und 24/7 Support von echten Menschen.

Selbst machen

$109 pro Plattform, einmalig

Die WebViewGold-Lizenz: ein fertiges Xcode- oder Android-Studio-Projekt. URL einfügen, Name und Icon setzen, Features einschalten, bauen und einreichen. Kostenlose Updates für immer.

Pakete auf der Hauptseite ansehen

Full Service

$698 pro Plattform $798

Schick uns deine URL und dein Icon. Unser Team konfiguriert, baut und liefert deine App innerhalb von 72 Stunden, White-Label, inklusive Quellprojekten. Beide Plattformen für $1,158.

Full-Service-Details Powered by WeSetupYourWebViewApp

Winter-Sale-Preise gültig bis 31. Dezember 2026.

Bereit, deine App zu veröffentlichen?

App Store & Google Play Genehmigungsgarantie – oder Geld zurück innerhalb von 14 Tagen

Lieber abgeben? Full Service: Wir konfigurieren, bauen und liefern innerhalb von 72 Stunden, ab $698 pro Plattform. Fragen? Chatte mit uns – 24/7.

Erstattungen erfolgen zu den in unseren FAQ genannten Bedingungen: eine nicht inhaltsbedingte Ablehnung durch Apple und/oder Google, geltend gemacht innerhalb von 14 Tagen nach dem Kauf.