-
Notifications
You must be signed in to change notification settings - Fork 1
Best Practices
Tipps, Limits und häufige Fehlerquellen für die UserApp-Entwicklung.
Auf dem Server gibt es kein console.log. Nutze den Logger:
var logger = KnuddelsServer.getDefaultLogger();
logger.debug('Debug-Info'); // Niedrigste Stufe
logger.info('Allgemeine Info'); // Standard
logger.warn('Warnung'); // Auffällig
logger.error('Fehler'); // Fehler
logger.fatal('Kritisch'); // SchwerwiegendDie Log-Ausgabe siehst du über /apps im Channel.
Im Frontend (www/) funktioniert console.log normal. Nutze die Browser-Entwicklertools im Knuddels-Client (falls verfügbar) oder teste lokal im Browser.
| Limit | Wert |
|---|---|
| Request-Größe | max. 10 kB |
| Response-Größe | max. 50 kB |
| Gleichzeitige Requests | max. 50 |
| Daten-Limit | 50 MB pro 10 min |
| Request-Limit | 100 Requests pro 10 min |
(Alle Daten-Mengen inkl. Header-Daten)
| Limit | Wert |
|---|---|
| Persistenz pro Schlüssel | max. 102.400 Zeichen |
| Limit | Wert |
|---|---|
| sendEvent-Daten (Server ↔ UI) | max. 10.000 Zeichen |
| Öffentliche Nachrichten | max. 30 Nachrichten in 15 Sek. |
| Knuddel-Transfer displayReasonText | max. 2.000 Zeichen |
| Limit | Wert |
|---|---|
| Popup/Overlay Größe | 50–1000 px (Breite und Höhe) |
| KnuddelAmount Dezimalstellen | max. 2 |
| GlobalApp-ID Länge | 1–25 Zeichen (alphanumerisch) |
Das Versenden von vielen Nachrichten oder Events in kurzer Zeit kann vom Server gedrosselt werden. Achte auf Datensparsamkeit:
- Bündle mehrere Datenänderungen in einem Event
- Verwende Debouncing im Client
- Sende nur die Daten, die sich tatsächlich geändert haben
Ursache: window.location oder Direktlinks zu anderen HTML-Dateien verwendet.
Lösung: Vermeide window.location und direkte Navigation zu anderen HTML-Dateien, da dadurch der Client-Bezug verloren geht. Nutze stattdessen:
- Mehrere
AppContent-Instanzen für verschiedene Seiten -
replaceWithAppContent()zum Seitenwechsel - Oder ein Single-Page-Konzept mit dynamischem DOM
Ursache: Cache-Problem nach FTP-Upload auf den Live-Server.
Lösung:
- Warte nach dem Upload einige Minuten, bis die Dateien synchronisiert sind
- Klicke dann erneut auf "update/restart" in
/apps - Nutze
Client.includeJS()undClient.includeCSS()statt direkter HTML-Einbindung, um Cache-Probleme zu vermeiden
Ursache: Fehlende Apple Developer ID.
Lösung: Trage appleDeveloperId in der app.config ein:
appleDeveloperId = DEINE_APPLE_DEVELOPER_IDLösung: Nutze den Logger (siehe oben).
Teile deinen Server-Code in mehrere Dateien:
// main.js
KnuddelsServer.require('config.js');
KnuddelsServer.require('commands.js');
KnuddelsServer.require('game.js');
KnuddelsServer.require('persistence.js');Der Server kann jederzeit unerwartet herunterfahren. Deine App muss damit umgehen können:
// Innerhalb von var App = { ... };
onAppStart: function() {
// Zustand aus der Persistence wiederherstellen
var lastState = KnuddelsServer.getPersistence().getObject('lastState', null);
if (lastState) {
// Spiel fortsetzen...
}
},
onShutdown: function() {
// Aktuellen Zustand sichern
KnuddelsServer.getPersistence().setObject('lastState', getCurrentState());
},Für die meisten Apps ist es üblich, das Frontend zu öffnen, wenn ein Nutzer den Channel betritt oder wenn der AppServer neu startet:
// Innerhalb von var App = { ... };
onUserJoined: function(user) {
if (user.canShowAppViewMode(AppViewMode.Popup)) {
var pageData = {
username: user.getNick(),
alter: user.getAge()
};
var htmlFile = new HTMLFile("index.html", pageData);
var popup = AppContent.popupContent(htmlFile, 480, 720);
popup.setResponsive(true);
user.sendAppContent(popup);
}
},Verwende Direct Connection (directConnection in app.config) nur wenn:
- Niedrige Latenz unbedingt nötig ist (z.B. Echtzeit-Spiele)
- Große Datenmengen übertragen werden
Vermeide es bei einfachen Apps, da manche Nutzer Verbindungsprobleme damit haben.
UserApps laufen auf Desktop und mobilen Geräten:
- Setze immer
popup.setResponsive(true) - Nutze das Viewport-Meta-Tag:
<meta name="viewport" content="width=device-width, initial-scale=1.0"> - Teste auf verschiedenen Bildschirmgrößen
- Prüfe immer
user.canShowAppViewMode()bevor du UI sendest
- Nicknames im Client sanitizen – Zeige Nicknames nie unsanitized in HTML an (XSS-Gefahr)
- Nutzereingaben validieren – Prüfe serverseitig alle Daten, die vom Client kommen
- Keine Geheimnisse im Frontend – Der Client-Code ist für Nutzer einsehbar
- Erste Schritte – Voraussetzungen, Einrichtung, deine erste App
-
Projektstruktur – Dateien, Ordner und
app.config - Dev-Server – Entwicklungsumgebung und Testen
-
App-Lifecycle und Hooks –
onAppStart,onUserJoinedund Co. -
Server-API Grundlagen –
KnuddelsServer,Channel,Logger - Client-Server-Kommunikation – Events zwischen Frontend und Backend
-
Benutzer und Nachrichten –
User,BotUser, Nachrichten senden - HTML-UI und AppContent – Popups, Overlays, Globale Apps-UI
-
Datenspeicherung –
AppPersistence,UserPersistence -
Knuddel und Zahlungen – Transfers, Käufe,
KnuddelAccount - Toplisten – Ranglisten und Highscores
- Globale Apps – Apps im "Apps & Spiele"-Menü
- Quests – Aufgaben für Nutzer
- Externe Server-Kommunikation – HTTP-Requests an externe APIs
- Tutorials – Übersicht aller Tutorials
- Tic-Tac-Toe – Multiplayer-Spiel mit Bestenliste
- Best Practices – Tipps, Limits und häufige Fehler
- FAQ – Häufig gestellte Fragen
- KCode-Formatierung – Nachrichten-Formatierung mit KCode