Remote-Konfiguration
Balancing, Preise und Feature-Flags ändern, ohne ein Update zu veröffentlichen. Jede Antwort ist signiert, wird auf dem Gerät geprüft und für das Offline-Spiel zwischengespeichert.
Codekommentare und API-Namen bleiben auf Englisch, damit sie zu den SDKs passen.
Werttypen#
Legen Sie Schlüssel auf der Seite Remote-Konfiguration an. Werte werden als Text mit einem Typ gespeichert, der dem SDK sagt, wie sie zu lesen sind:
| Typ | Beispiel | Limit |
|---|---|---|
string | Welcome back! | Bis zu 10.000 Zeichen |
number | 25 | Jede endliche Zahl |
boolean | false | true oder false |
json | {"sale": 0.2} | Bis zu 50.000 Byte |
Werte lesen#
Getter schlagen nie fehl: Sie liefern Ihren Fallback-Wert, wenn ein Schlüssel fehlt oder sich nicht umwandeln lässt.
int damage = Majacloud.RemoteConfig.GetInt("enemy_damage", 25);
float speed = Majacloud.RemoteConfig.GetFloat("player_speed", 4.5f);
bool maintenance = Majacloud.RemoteConfig.GetBool("maintenance_mode", false);
string welcome = Majacloud.RemoteConfig.GetString("welcome_message", "Hi!");
ShopConfig shop = Majacloud.RemoteConfig.GetJson<ShopConfig>("shop");var damage := Majacloud.remote_config.get_int("enemy_damage", 25)
var speed := Majacloud.remote_config.get_float("player_speed", 4.5)
var maintenance := Majacloud.remote_config.get_bool("maintenance_mode", false)
var welcome := Majacloud.remote_config.get_string("welcome_message", "Hi!")
var shop = Majacloud.remote_config.get_json("shop", {})const damage = mc.remoteConfig.getInt('enemy_damage', 25);
const speed = mc.remoteConfig.getNumber('player_speed', 4.5);
const maintenance = mc.remoteConfig.getBool('maintenance_mode', false);
const welcome = mc.remoteConfig.getString('welcome_message', 'Hi!');
const shop = mc.remoteConfig.getJson('shop', {});Abruf und Aktualisierungen#
Unity und Godot rufen die Konfiguration beim Spielstart ab; im Web rufen Sie fetch() selbst auf. Spätere Abrufe senden das ETag, sodass eine unveränderte Konfiguration nur eine winzige 304-Antwort kostet.
Majacloud.RemoteConfig.ConfigUpdated += config => ApplyBalance();
var fetch = await Majacloud.RemoteConfig.FetchAsync(); // 304 when nothing changed
if (fetch.Ok) Debug.Log("Config v" + fetch.Value.Version + (fetch.Value.Changed ? " (new)" : ""));Majacloud.remote_config.updated.connect(apply_balance)
var fetch := await Majacloud.remote_config.fetch() # 304 when nothing changed
if fetch.ok:
print("Config v", fetch.value.version, " changed: ", fetch.value.changed)mc.remoteConfig.on('updated', () => applyBalance());
const fetch = await mc.remoteConfig.fetch(); // 304 when nothing changed
if (fetch.ok) console.log('Config v' + fetch.value.version, fetch.value.changed);curl -i https://majacloud.majanite.com/v1/config -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY"
# Next time, send the ETag: 304 Not Modified when nothing changed
curl -i https://majacloud.majanite.com/v1/config -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H 'If-None-Match: "<etag>"'Offline und Caching#
Die zuletzt geprüfte Konfiguration wird auf dem Gerät zwischengespeichert und beim Start geladen, sodass Getter offline und schon vor Abschluss des ersten Abrufs funktionieren. Scheitert ein Abruf am Netzwerk, bleibt die zwischengespeicherte Kopie erhalten; eine Konfiguration, die älter als die zwischengespeicherte ist, wird abgelehnt.
Signaturprüfung#
data ist die base64url-Nutzlast, checksum ihr SHA-256-Hash und signature eine RSA-SHA256-Signatur über data, erstellt mit dem privaten Schlüssel in storage/keys/. Die SDKs prüfen alle drei sowie Projekt-ID und Version, bevor sie eine Konfiguration verwenden.
| SDK | Herkunft des öffentlichen Schlüssels |
|---|---|
| Unity | Tools ▸ Majacloud ▸ Setup ▸ Test connection |
| Godot | Project ▸ Tools ▸ Majacloud: Test connection |
| Web | Die Option configPublicKey (das PEM auf der Seite API-Schlüssel) |
| REST | GET /v1/project → config_public_key_pem |
storage/keys/ in Ihre Backups auf: Spiele haben den zugehörigen öffentlichen Schlüssel fest hinterlegt.Sie können eine Antwort mit OpenSSL selbst prüfen:
# Verify a config response yourself (what every SDK does before using it)
curl -s https://majacloud.majanite.com/v1/project -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" | jq -r .project.config_public_key_pem > public.pem
curl -s https://majacloud.majanite.com/v1/config -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" > response.json
jq -j .data response.json > data.txt
jq -r .signature response.json | base64 --decode > signature.bin
openssl dgst -sha256 -verify public.pem -signature signature.bin data.txt # Verified OK
jq -r .data response.json | tr '_-' '/+' | base64 --decode 2>/dev/null | jq . # the payloadVerlauf und Wiederherstellung#
Jede Änderung wird versioniert. Das Dashboard bewahrt den Verlauf je nach Tarif 7 bis 365 Tage auf und stellt jeden früheren Wert mit einem Klick wieder her.