AllGPT AI Store

Entwickler-Dokumentation

WebApps bauen & API-Schlüssel sicher einbinden

Diese Anleitung zeigt Schritt für Schritt, wie du eine WebApp für den AllGPT AI Store erstellst, in der Sandbox veröffentlichst und einen API-Schlüssel so anbindest, dass er niemals in deinem veröffentlichten Code landet.

1 · Überblick

Eine WebApp ist eine ganz normale Website aus HTML, CSS und JavaScript. Du lädst sie als ZIP im Studio hoch, und Besucher starten sie direkt im Browser – ohne Download, ohne Installation. Der Store liefert deine Dateien in einer isolierten Sandbox aus: Deine App läuft abgeschirmt von den anderen Inhalten und hat keinen Zugriff auf Konten, Cookies oder die Verwaltung des Stores.

Viele kleine Tools brauchen eine externe API (KI, Karten, Wetter …), die einen Schlüssel verlangt. Würdest du den Schlüssel direkt in deine HTML/JS schreiben, könnte ihn jeder im Browser-Quelltext lesen und missbrauchen. Dagegen gibt es den Schlüssel-Proxy: Du hinterlegst den Schlüssel einmal im Studio, und deine WebApp ruft die API nur über einen kurzen Pfad wie /api/… auf. Der Store setzt den echten Schlüssel erst auf dem Server ein und leitet die Antwort zurück. Der Browser – und damit auch deine App – sieht den Schlüssel nie.

Kurz gesagt: Deine App sagt fetch('/api/chat'). Der Store macht daraus intern den echten Aufruf https://api.example.com/chat mit deinem Schlüssel – für deine App unsichtbar.

2 · Schnellstart in fünf Schritten

  1. WebApp bauen – eine index.html plus CSS/JS, die ohne Server auskommt (statische Dateien).
  2. Als ZIP packen – die Dateien in ein ZIP legen. Die Startseite muss in der ZIP erreichbar sein (z. B. index.html ganz oben). Tipp: Hast du versehentlich den ganzen Ordner gepackt (meine-webapp/index.html), erkennt der Store das und legt die Dateien automatisch eine Ebene höher.
  3. Im Studio eine App anlegen – Studio → Neue App, beim Angebot „WebApp (Sandbox)" aktivieren (zusammen mit „Android (APK)", wenn du beides anbieten willst), ZIP hochladen, Startseite eintragen, Beschreibungen ausfüllen.
  4. Veröffentlichen – die Version geht erst nach der Freigabe durch den Betreiber in den Store; danach startet sie über „WebApp öffnen" (Einreichung und Prüfung: Abschnitt 12).
  5. (Optional) API-Schlüssel hinterlegen – im Abschnitt API-Schlüssel den Schlüssel speichern und in der App über den Präfix-Pfad aufrufen (Abschnitt 5 und 6).

3 · Projekt & ZIP richtig bauen

Deine WebApp ist ein Ordner mit statischen Dateien. Ein typischer Aufbau:

meine-webapp/
├─ index.html      ← Startseite (die du im Studio einträgst)
├─ app.js          ← deine Logik
├─ style.css       ← dein Design
└─ img/logo.png    ← Bilder, Schriften, …

Zum Veröffentlichen packst du den Inhalt in ein ZIP – die Dateien sollten direkt im ZIP liegen. Ist stattdessen genau ein Ordner im ZIP (z. B. meine-webapp/index.html), entfernt der Store diesen Ordner beim Auspacken automatisch, damit index.html und alle relativen Verweise funktionieren. Bei mehreren Ordnern im ZIP trägst du den Unterordner als Startseite ein, z. B. build/index.html.

Eigene Dateien: relative Pfade benutzen

Deine App läuft im Store nicht auf der Wurzel /, sondern unter einem Unterpfad wie /web/<sitzung>/<app>/index.html. Deshalb verweist du innerhalb deiner App relativ auf eigene Dateien – ohne führenden Slash:

<!-- richtig: relativ zur index.html -->
<link rel="stylesheet" href="style.css">
<script src="app.js"></script>
<img src="img/logo.png" alt="">

<!-- falsch: /app.js würde im Store ins Leere führen -->
<script src="/app.js"></script>
Build-Tools (Vite, React, Vue …): Diese erzeugen oft absolute Pfade wie /assets/main.js. Stelle den Basis-Pfad deines Builders auf ./ (bei Vite: base: './'), damit alle Verweise relativ werden. Sonst finden die Dateien im Store ihren Pfad nicht.

Erlaubte Dateitypen

Der Store entpackt nur bekannte Web-Typen und lehnt alles andere ab (Schutz vor Server-Skripten). Erlaubt sind u. a.: html, css, js, mjs, json, svg, png, jpg, webp, gif, avif, ico, woff, woff2, ttf, otf, mp3, wav, ogg, mp4, webm, wasm, glb, gltf, txt, csv, xml, vtt. Keine .php, .py, .exe o. Ä.

Grenzen für das Paket

  • ZIP insgesamt: maximal 128 MB.
  • Einzelne Datei im Paket: maximal 128 MB, höchstens 1200 Dateien.
  • Beim Entpacken wird geprüft: keine Pfade, die nach oben zeigen (..), keine Verknüpfungen, keine gepackten „Zip-Bombs".

4 · Die Sandbox: was geht und was nicht

Deine App läuft in einem Browser-iFrame ohne gleiche Herkunft. Das ist gut für Sicherheit, hat aber Folgen, die du kennen solltest:

FunktionIn der Sandbox
HTML, CSS, JS, WebAssembly ausführenJa
Eigene Dateien nachladen (relativ)Ja
Externe Seiten/Bilder/Laden per https (CDNs, Schriften)Ja
Formulare, Dialoge, Popups, DownloadsJa
Aufrufe an /api/… (Schlüssel-Proxy, Abschnitt 6)Ja
localStorage, sessionStorage, CookiesErsatz im RAM
IndexedDBGesperrt
Zugriff auf Store-Konto, andere Apps oder die Store-VerwaltungGesperrt
Kein dauerhafter lokaler Speicher: Der Store stellt localStorage, sessionStorage und Cookies als Ersatz im Arbeitsspeicher bereit – deine App kann sie normal benutzen, ihre Daten gehen aber beim Neuladen verloren und bleiben nie auf dem Gerät des Nutzers. Für echtes Persistieren nutzt du eine eigene API über den Schlüssel-Proxy oder bittest den Nutzer, Daten selbst zu halten (z. B. Datei-Download/Upload).

5 · API-Schlüssel im Studio anlegen

Öffne deine WebApp im Studio. Ganz unten (bzw. im Abschnitt API-Schlüssel) klickst du auf „+ Schlüssel hinzufügen". (Der Abschnitt erscheint erst, nachdem die App mindestens als Entwurf gespeichert ist.) Du füllst folgende Felder aus:

FeldBedeutungBeispiel
NameNur für dich sichtbarOpenAI
Präfix in deiner AppDer Pfad, den deine App benutzt. Muss mit / beginnen./api oder /openai
API-GrundadresseDie echte Adresse des Anbieters, immer https, ohne Pfad/Query.https://api.openai.com
Übertragung alsWohin der Schlüssel gehört: Header oder Query-Parameter.Header
Header-/Query-NameName des Headers bzw. Parameters.Authorization · oder key
Header-Wert (optional)Mit {} als Platzhalter, z. B. für Bearer.Bearer {}
Geheimer SchlüsselDer eigentliche Schlüssel. Wird nur gespeichert, nie angezeigt.sk-…
Zwei übliche Muster:
  • OpenAI-Stil: Übertragung Header, Name Authorization, Header-Wert Bearer {}.
  • Google-Maps-Stil: Übertragung Query-Parameter, Name key.

Nach dem Speichern zeigt die Karte nur noch „Schlüssel gesetzt" – der Wert selbst wird nie wieder im Browser angezeigt und ist auch nicht im Code deiner App.

6 · Den Schlüssel in deiner WebApp nutzen

Deine App ruft die API jetzt über dein Präfix auf – mit führendem Slash und relativ zur Domain, nicht mit der echten Anbieter-URL. Der Store erkennt den Präfix und leitet automatisch weiter.

Wenn dein Präfix /api und die Grundadresse https://api.openai.com ist, gilt diese Übersetzung:

Dein Code                 →   tatsächlicher Aufruf durch den Store
fetch('/api/v1/chat')     →   https://api.openai.com/v1/chat   (+ Schlüssel)

Beispiel: POST mit JSON

async function frageKI(text) {
  const antwort = await fetch('/api/v1/chat/completions', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },   // KEIN Authorization hier!
    body: JSON.stringify({
      model: 'gpt-4o-mini',
      messages: [{ role: 'user', content: text }]
    })
  });
  if (!antwort.ok) throw new Error('API-Fehler ' + antwort.status);
  const daten = await antwort.json();
  return daten.choices[0].message.content;
}
Wichtig: Setze in deiner App keinen Authorization-Header und schreibe keinen Schlüssel in den Code. Der Store fügt den Header automatisch ein. Ein selbst gesetzter Authorization-Header wird aus Sicherheitsgründen verworfen.

Beispiel: GET mit Query (z. B. Karten/Wetter)

// Präfix /maps, Grundadresse https://maps.googleapis.com, Modus Query, Name "key"
const r = await fetch('/maps/geocode/json?address=Berlin');
const daten = await r.json();
// Der Store hängt intern &key=DEIN_GEHEIMER_SCHLUESSEL an.

Mit XMLHttpRequest (statt fetch)

Auch ältere XMLHttpRequest-Aufrufe werden automatisch umgeleitet, sobald der Pfad mit deinem Präfix beginnt:

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/status');   // wird über den Proxy geleitet
xhr.onload = () => console.log(JSON.parse(xhr.responseText));
xhr.send();

7 · App-Daten & Credits

Deine WebApp braucht einen Ort für Nutzerdaten – Chatverläufe, Einstellungen, Profile – und vielleicht ein Guthabensystem? Beides liefert der Store direkt mit: die App-Daten-API speichert pro Nutzer JSON-Dokumente in der Store-Datenbank (klein, verschlüsselt verwaltet, nicht auf dem öffentlichen Cloud-Stick), und das Credit-System verwaltet monatliche Guthaben mit einlösbaren Codes. Alles ohne eigenen Server.

So läuft's: Nutzer registriert sich in deiner App (POST /data/api/<app>/register) → erhält einen Geräte-Token (agd_…) → die App speichert Chats als Dateien (PUT /data/api/<app>/files/chats/1.json) und löst Credits ein. Du als Entwickler pflegst Codes und siehst Nutzer im Studio unter „App-Daten & Credits".

Endpunkte (Bearer = Geräte-Token agd_…)

Methode & PfadZweck
POST /data/api/<app>/register{"user":"name","pin":"optional"} → Geräte-Token + Konto. Mit PIN ist der Name geschützt; ohne PIN kann jeder, der den Namen kennt, weiterschreiben.
POST /data/api/<app>/loginNeuer Geräte-Token für ein bestehendes Konto (PIN nötig, wenn gesetzt). Mehrere Geräte = mehrere Tokens.
GET /data/api/<app>/meProfil, Credit-Stand, belegter Speicher, Dateiliste.
GET · PUT · DELETE /data/api/<app>/files/<pfad>Kleine JSON-/Textdokumente pro Nutzer (max. 8 MB je Datei, 48 MB gesamt). Pfade wie chats/1.json, Ordner inklusive.
POST /data/api/<app>/redeem{"code":"…"} – Nutzer löst deinen Credit-Code ein (pro Nutzer genau einmal, Fallunterschied egal).
POST /data/api/<app>/spend{"credits":15,"note":"bild"} – serverseitige Abbuchung; 402 bei leerem Wallet.
POST /data/api/<app>/search{"query":"pilz video","limit":6} – Volltextsuche über alle Chat-Verläufe des Nutzers (Stem-Matching, Treffer mit Ausschnitt + Chat-Titel). Ideal als KI-Werkzeug, um sich an frühere Gespräche zu erinnern.

Geräte-Tokens sind an eine App und einen Nutzer gebunden – das Token einer anderen App wird abgelehnt, und kein Token sieht Daten eines anderen Nutzers. Für deinen eigenen Backend-Prozess gibt es zusätzlich Daten-Schlüssel (agw_…, im Studio erstellbar): gleiche Endpunkte, aber mit ?user=NAME und Zugriff auf alle Kontos deiner App.

Credits & Codes (Studio)

  • Monatliches Guthaben (Standard 200) setzt sich automatisch zurück – keine Wartung.
  • Codes: Im Studio unter „App-Daten & Credits" beliebig viele anlegen (Code-Text, Credits, optional max. Einlösungen; aktivieren/deaktivieren/löschen). Deine Nutzer lösen sie selbst in der App ein.
  • Bonus geben: Pro Nutzer kannst du im Studio Credits gutschreiben (z. B. Support-Fall).
  • Abrechnung: /spend läuft serverseitig – dein Client kann nicht schummeln. Bewährt: spend vor dem teuren Aufruf, bei 402 den Code-Dialog öffnen.

Beispiel: Chat-App mit Credits

// Registrierung (einmalig, Token lokal merken)
const r = await fetch("/data/api/APP_ID/register", {
  method: "POST", headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ user: "Arnold" }),
}).then(x => x.json());
const H = { Authorization: `Bearer ${r.token}`, "Content-Type": "application/json" };

// Chat-Verlauf persistieren
await fetch("/data/api/APP_ID/files/chats/heute.json",
  { method: "PUT", headers: H, body: JSON.stringify(messages) });

// 15 Credits für ein Bild abbuchen – 402 = Wallet leer
const paid = await fetch("/data/api/APP_ID/spend",
  { method: "POST", headers: H, body: JSON.stringify({ credits: 15, note: "bild" }) });
if (paid.status === 402) showRedeemDialog();

// Code einlösen
await fetch("/data/api/APP_ID/redeem",
  { method: "POST", headers: H, body: JSON.stringify({ code: "Bester Freund" }) });
Nur JSON/Text, kleine Dokumente. Die API ist für Chat-Verläufe, Einstellungen und Profile gedacht – nicht als Medien-Host. Große Bilder/Video-Daten: nicht ins Chat-JSON betten, sondern als eigene files/media/<id>.json ablegen und per ID referenzieren.

8 · Komplettes Beispiel

Eine minimale, fertige WebApp, die einen hinterlegten API-Schlüssel über den Präfix /api nutzt. Lege die beiden Dateien in ein ZIP und lade es im Studio hoch (Startseite: index.html).

index.html

<!doctype html>
<html lang="de">
<head>
  <meta charset="utf-8">
  <title>KI-Grüße</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <h1>Frag die KI</h1>
  <input id="frage" placeholder="Deine Frage">
  <button id="los">Senden</button>
  <pre id="out"></pre>
  <script src="app.js"></script>
</body>
</html>

app.js

document.getElementById('los').addEventListener('click', async () => {
  const out = document.getElementById('out');
  out.textContent = 'Denke nach …';
  try {
    const antwort = await fetch('/api/v1/chat/completions', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        model: 'gpt-4o-mini',
        messages: [{ role: 'user', content: document.getElementById('frage').value }]
      })
    });
    const daten = await antwort.json();
    out.textContent = daten.choices[0].message.content;
  } catch (fehler) {
    out.textContent = 'Fehler: ' + fehler.message;
  }
});

In den Studio-Einstellungen dieser App trägst du dann den Schlüssel ein: Präfix /api, Grundadresse https://api.openai.com, Modus Header, Name Authorization, Wert Bearer {}, und deinen echten Schlüssel. Fertig – app.js enthält keinen Schlüssel.

9 · Häufige Fehler & Lösungen

SymptomUrsache & Lösung
App bleibt weiß, Konsole: „keine Datei gefunden" / 404 auf index.htmlIn der ZIP liegt ein einzelner Ordner mit deiner App? Das erkennt der Store jetzt automatisch. Sonst: falscher Ordner oder mehrere Top-Ordner – dann die Startseite mit Pfad eintragen (Abschnitt 3).
App lädt, aber CSS/JS/Bilder fehlen (404)Du hast absolute Pfade (/app.js) benutzt. Auf relative Pfade umstellen; bei Build-Tools base: './' setzen (Abschnitt 3).
fetch('/api/…') liefert 404 statt API-AntwortFührenden Slash vergessen oder Präfix stimmt nicht exakt. Aufruf muss mit dem im Studio gespeicherten Präfix beginnen, z. B. /api/….
„Diese Anfrage ist nicht erlaubt." beim API-AufrufDu hast Authorization, Cookie oder Store-Header selbst gesetzt. Lass sie weg – der Store ergänzt den Schlüssel.
„Die Zieladresse der API ist nicht erlaubt."Grundadresse ist kein https, zeigt auf localhost/ internes Netz oder enthält Query. Nur öffentliche https-Adressen ohne Pfad/Query erlaubt.
„Zu viele Anfragen in einer Minute."Rate-Limit (60/min pro Sitzung) erreicht. Aufrufe drosseln / cachen.
Antwort ist abgeschnittenEinzelne API-Antwort > 24 MB. Größere Antworten beim Anbieter per Paging stückeln.
localStorage.setItem wirft FehlerKann in der Sandbox nicht mehr passieren – der Store stellt einen RAM-Ersatz bereit (Abschnitt 4). Werte sind nach einem Neuladen leer; zum Persistieren die eigene API über den Schlüssel-Proxy nutzen.
„Die WebApp-Sitzung ist abgelaufen."Sitzung (12 h) abgelaufen. App schließen und neu über „WebApp öffnen" starten.

10 · Grenzen & Fair Use

Der Schlüssel-Proxy ist ein praktischer Helfer, kein Durchlaufruf zum Selbstkostenpreis. Diese Grenzen schützen dich und den Store:

GrenzeWert
Anfragen pro Sitzung und Minute60
Datenvolumen pro Sitzung (hoch + runter)256 MB
Maximale Größe einer API-Antwort24 MB
Maximale Größe einer API-Anfrage (Body)8 MB
Gültigkeit einer Sitzung12 Stunden
Schlüssel pro WebApp8
App-Daten pro Nutzer48 MB (Datei max. 8 MB, 120 Anfragen/min)
Nur öffentliche https-APIs. Adressen im internen Netz (Router, localhost, Cloud-Metadaten-Dienste) werden grundsätzlich blockiert, damit niemand über deinen Store interne Systeme angreifen kann.

11 · APK und WebApp zusammen anbieten

Ein Eintrag im Store ist nicht entweder/oder. Du kannst zu derselben App eine APK für Android und ein WebApp-ZIP hinterlegen – Besucher sehen dann auf derselben Produktseite beide Wege: „↓ APK herunterladen" und „▶ WebApp öffnen". Nutzer müssen nicht erst suchen, wo welche Version steht.

  1. Studio → App bearbeiten – beim Abschnitt Angebot beide Chips aktivieren: „Android (APK)" und „WebApp (Sandbox)".
  2. Beide Dateien hochladen – die APK-Datei und das WebApp-ZIP. Beide Abschnitte erscheinen unter Dateien & Version.
  3. Startseite angeben – gilt nur für das WebApp-Paket (z. B. index.html).
  4. Speichern – die Produktseite zeigt beide Buttons; API-Schlüssel, App-Daten und Credits sind wie bei einer WebApp nutzbar, weil das ZIP vorhanden ist.
BereichGilt für
Titel, Beschreibung, Screenshots, Icon, Kategorieden ganzen Eintrag (beide Versionen)
Versionsnummer und „Was ist neu?"den ganzen Eintrag – ein Stand für APK und WebApp
Android-Voraussetzungdie APK
Startseite, API-Schlüssel-Proxy, App-Daten & Creditsdas WebApp-Paket
Freigabestatusdie konkreten Dateien – neue APK oder neues ZIP erfordert eine neue Prüfung (Abschnitt 12)
Sinnvolle Kombination: Die WebApp als sofort ausproilierbare Vorschau („ohne Download"), die APK als vollständige Version mit allen Offline-Funktionen. Beide gehören auf dieselbe Produktseite.

API in einer reinen nativen APK

Der Schlüssel-Proxy aus Abschnitt 5–6 funktioniert nur in der Sandbox, weil er an die WebApp-Sitzung gebunden ist. Eine native Android-App hat keine solche Sitzung und muss deshalb direkt mit der API sprechen. Das ist die ehrliche Grenze:

  • Store Cloud (Abschnitt „Weiter" in den Cloud-Docs) kann deine APK direkt mit einem agc_…-Schlüssel ansprechen – Dateispeicher, Multimode-Räume und Credits gibt es auch ohne Browser.
  • Ein in die APK eingebetteter Schlüssel ist auf jedem Gerät lesbar, sobald jemand die Datei entpackt. Lege dafür einen eigenen Schlüssel an, der nur in die Bucket-Präfixe deiner eigenen App schreiben darf, und rechne mit Missbrauch – oder betreibe einen eigenen kleinen Dienst, der den Schlüssel hält.
  • Drittanbieter-KIschlüssel (OpenAI & Co.) gehören nicht in eine APK. Wenn deine App KI-Funktionen braucht, die sofort und sicher laufen soll: WebApp-Version zusätzlich anbieten und den Proxy benutzen.

12 · Veröffentlichung & Freigabe

Nichts geht automatisch online, nur weil eine Datei hochgeladen wurde. Jede Version, die ein Entwickler veröffentlicht, durchläuft diese Stufen:

  1. Hochladen – die Datei liegt zunächst privat in deinem Konto. Entwürfe sind nur für dich sichtbar.
  2. Automatische Vorprüfung – direkt nach dem Upload zeigt dir das Studio den Prüfbericht unter der APK (Abschnitt „Was geprüft wird").
  3. Veröffentlichen – der Knopf Veröffentlichen reicht die Version bei der Store-Leitung ein. Status: Wartet auf Freigabe. Öffentlich ist sie jetzt noch nicht.
  4. Manuelle Entscheidung – der Admin prüft den Bericht und entscheidet in der Inbox: freigeben oder ablehnen mit Begründung.
  5. Sichtbar – nur ausdrücklich freigegebene Dateien sind im Store zu sehen und herunterladbar. Auf der Produktseite stehen Version, Größe, Freigabedatum, SHA-256 und die Berechtigungen der APK.
Eine neue Datei beendet die alte Freigabe. Die Freigabe ist an den SHA-256-Hash der APK bzw. des ZIP gebunden. Ersetzt du eine Datei – auch „nur schnell" –, fällt der Eintrag automatisch zurück auf „Wartet auf Freigabe" und ist so lange unsichtbar, bis neu entschieden wurde.

Was automatisch geprüft wird

PrüfungWas der Store macht
Format & ContainerGültiges ZIP-Archiv mit AndroidManifest.xml; Größe im Rahmen von 512 MB
PrüfsummeSHA-256 wird berechnet und auf der Produktseite angezeigt
Manifest (binär)Paketname, Versionname/-code, minSdk und targetSdk werden gelesen
BerechtigungenAlle uses-permission-Einträge werden aufgelistet; eine Auswahl als problematisch eingestufter Berechtigungen wird gesondert markiert
SignaturErkannt wird, ob signiert ist und mit welchem Verfahren (v1 aus dem ZIP, v2/v3/v3.1/v4 aus dem Signaturblock) – nicht, ob die Signatur kryptografisch gültig ist
v1-DigesteBei APKs bis 64 MB werden in der Signaturdatei gespeicherte Hashes mit den tatsächlichen Dateien verglichen (erkennt nachträgliche Änderungen)
Debug-Spurenandroid:debuggable aus dem Manifest und ein debug.keystore im Paket werden gemeldet
VirenscannerNur wenn der Betreiber einen Scanner konfiguriert hat (STORE_SCAN_COMMAND); sonst steht im Bericht „nicht eingerichtet"

Was ausdrücklich nicht geprüft wird

  • Keine kryptografische Verifikation der Signatur: Der Store liest, dass und womit signiert wurde, prüft aber weder Zertifikatskette noch die Signaturblöcke selbst. Ein Signatureintrag beweist nicht, wer signiert hat.
  • Kein Code-Review und keine Verhaltensanalyse: Es wird nicht getestet, was die App auf dem Gerät tut.
  • Keine Malware-Garantie: Ohne konfigurierten Scanner erfolgt gar kein Virencheck; mit Scanner ist das Ergebnis ein Hinweis, kein Freispruch.
  • Keine Bewertung von Berechtigungen: Die Liste und die Markierung auffälliger Einträge sind Entscheidungshilfe – die Einschätzung trifft der Mensch.
Vertrauen bleibt eigene Arbeit. Ein freigegebener Eintrag bedeutet: Der Betreiber hat den Prüfbericht gesehen und diese Datei bewusst veröffentlicht. Prüfe vor der Installation trotzdem selbst, wem du deine Daten gibst.

Statuswerte im Studio

StatusBedeutung
EntwurfNicht veröffentlicht, nur für dich sichtbar
Wartet auf FreigabeVeröffentlicht und eingereicht; im Store noch unsichtbar
VeröffentlichtFreigegeben – sichtbar und herunterladbar
Freigabe abgelehntPrivat geblieben; der Grund steht im Studio bei deiner App. Speichern nach einer Besserung reicht für die erneute Prüfung

Noch Fragen? Schreib eine Bewertung / Feedback bei deiner App oder wende dich an den Store-Betreiber. Viel Erfolg beim Bauen! · WebApp fertig? Die Store Cloud gibt denselben Entwicklern 512 MB Objektspeicher, Multimode Mehrspieler-Räume und App-Daten & Credits für deine Nutzer. · Zurück zum Store · Studio