Docs

Die Bibliothek

Bezahlte Funktionen sperren

Verkaufe die ganze App mit Paywall.gate oder einzelne Funktionen mit Paywall.start und einer Prüfung pro Funktion. Diese Seite listet jeden öffentlichen Aufruf und jede Konstante der Bibliothek und wie Testphasen funktionieren.

Ganze App oder einzelne Funktionen

Paywall.gate(views)Paywall.start(views)
Nutze es fürEine App, die als Ganzes bezahlt wirdEine App, die einzelne Funktionen verkauft
Beim Start, gesperrtDer Kaufbildschirm statt deiner AppDeine App, wie gewohnt
Während einer TestphaseDeine App, wie gewohntDeine App, wie gewohnt
Wenn die Testphase endetDer Kaufbildschirm bei jedem Start, mit dem Titel „Test vorbei“Der Kaufbildschirm einmal, mit dem Titel „Test vorbei“
BACK auf dem KaufbildschirmVerlässt die AppGeht zu deiner App
Nach der ZahlungBACK oder START öffnet deine AnsichtenBACK oder START führt zu deiner App
Jede bezahlte FunktionNichts hinzuzufügenPrüft zuerst Paywall.unlocked()

Beide nehmen dasselbe Array, das du aus getInitialView() zurückgeben würdest: eine View oder eine View mit ihrem Delegate.

Eine Funktion sperren

Prüfe mit start dort, wo jede bezahlte Funktion beginnt: eine Taste, ein Menüeintrag, eine Seite.

source/MainDelegate.mc
function onHistory() as Void {
    if (Paywall.unlocked()) {
        showHistory();
    } else {
        Paywall.open();
    }
}
  • Ein Schloss öffnet alles. Ein Kauf öffnet jede bezahlte Funktion der App. Es gibt einen Preis pro App.
  • In einem Glance rufst du nur active(), unlocked() und trialLeft() auf. Den Kaufbildschirm gibt es nur in der App.
  • Kleine Dankeschöns, die nur Käufer sehen sollen, nicht in der Testphase, prüfen Paywall.active().

Referenz

Alles hier liegt in module Paywall (Pay.mc und dem PayScope.mc, das du nutzt), sofern die Tabelle nichts anderes sagt.

Deine Aufrufe

AufrufRückgabeWas es tutFunktioniert in
Paywall.gate(views)Die zurückzugebenden AnsichtenIn getInitialView(), für eine App, die als Ganzes bezahlt wird. Startet die Testphase, fragt den Server, wenn es Zeit ist, und gibt im gesperrten Zustand den Kaufbildschirm statt deiner App zurück. Nach dem Bezahlen öffnet BACK oder START deine Ansichten.App
Paywall.start(views)Die zurückzugebenden AnsichtenIn getInitialView(), für eine App, die einzelne Funktionen verkauft. Startet die Testphase, fragt den Server, wenn es Zeit ist, und gibt deine Ansichten zurück. Zeigt den Kaufbildschirm einmal am Ende der Testphase.App
Paywall.unlocked()BooleanBezahlt oder in der Testphase (die ganze, schon vor ihrem Start). Die Prüfung für jede bezahlte Funktion.App, Glance
Paywall.active()BooleanBezahlt und vom Server in den letzten 30 Tagen bestätigt. In der Testphase false. Ein „bezahlt“-Stempel mehr als 5 Minuten in der Zukunft (zurückgestellte Uhrzeit) zählt nicht.App, Glance
Paywall.trialLeft()ZahlVerbleibende ganze Tage der Testphase, aufgerundet. Nie mehr als TRIAL_DAYS. Vor dem Start der Testphase ganz TRIAL_DAYS; 0, sobald sie vorbei ist oder ohne Testphase.App, Glance
Paywall.open()PaywallViewÖffnet den Kaufbildschirm oder gibt den schon angezeigten zurück. Für else einer bezahlten Funktion und einen Eintrag „Premium“ in deinen Einstellungen.App
Paywall.keys()ArrayDie Speicherschlüssel, die dein „Daten löschen“ behalten muss: "pp", "ts" und "te".App
Paywall.startTrial()VoidÄlterer Aufruf. Startet die zeitliche Testphase beim ersten Start; ohne TRIAL_DAYS nichts. gate und start rufen ihn auf.App
Paywall.launch()VoidÄlterer Aufruf. Fragt den Server, wenn es Zeit ist, oder sofort, wenn die Uhrzeit zurückgestellt wurde. gate und start rufen ihn auf.App
Paywall.showOver()VoidÄlterer Aufruf, aus onShow() deines ersten Bildschirms. Ab dann öffnet ein Kauf, der nicht an der Uhr getätigt wurde, die Freischaltung von selbst; mit Testphase öffnet er einmal am Ende der Testphase den Kaufbildschirm. gate und start erledigen das für dich.App

Von der Bibliothek selbst aufgerufen

Die Bibliothek ruft diese selbst auf. Ruf sie nicht aus deinem Code auf.

FunktionWas es tut
check()Sendet eine Anfrage an den Server, nie zwei gleichzeitig. Eine Anfrage, die eine Minute ohne Antwort bleibt, zählt nicht mehr.
onAnswer(code, data)Verarbeitet die Antwort des Servers. Behält nur eine vollständige Antwort, eine mit Version und nächster Prüfung. Bei einem Fehler setzt es „Offline“ oder „Später“ und die Wartezeit bis zum nächsten Versuch.
take(d)Speichert eine Antwort, das Ende der Testphase und „bezahlt“. Öffnet die Freischaltung, wenn ein Kauf eingeht.
first(views)Der gemeinsame Teil von gate und start.
close()Verlässt den Kaufbildschirm: nach dem Bezahlen zu deinen Ansichten (oder nach dem Testende-Bildschirm von start), aus einer gesperrten gate-App heraus oder zurück dorthin, wo open() aufgerufen wurde.
cheer()Der Erfolgston der Uhr und eine Vibration, falls an der Uhr eingeschaltet.

Konstanten

KonstanteWertWas es ist
K_ANS"pa"Speicherschlüssel: die letzte Antwort des Servers.
K_PAID"pp"Speicherschlüssel: wann der Server zuletzt „bezahlt“ gesagt hat, in Sekunden. Leer: nicht bezahlt.
K_TRIAL"ts"Speicherschlüssel: wann die Testphase endet. Beim ersten Start gesetzt, danach vom Server.
K_OVER"te"Speicherschlüssel: Der Bildschirm „Test vorbei“ wurde angezeigt.
STALE259200030 Tage in Sekunden: wie lange „bezahlt“ ohne neue Antwort des Servers gilt.
DAY86400Ein Tag in Sekunden.

Modulvariablen

Der eigene Zustand des Kaufbildschirms. Lies sie bei Bedarf; setze sie nie.

VariableWas es enthält
listenerDer offene Kaufbildschirm oder null.
statusDie Problemzeile („Offline“ oder „Später“) oder null.
busy, sentAtEine Anfrage läuft, und wann sie rausging.
hold, heldWie lange der Server eine Anfrage halten darf, solange der Kaufbildschirm angezeigt wird (zuerst 15 Sekunden, halbiert, wenn das Handy sie abbricht).
changedAt, limitWann sich der Bildschirm zuletzt geändert hat und wie viele Sekunden er ohne Änderung offen bleiben darf.
fails, nextAtFehlgeschlagene Anfragen in Folge, und wann die nächste raus darf.
shownDer erste Bildschirm deiner App ist offen: Ein Kauf darf die Freischaltung von selbst öffnen.
quickDer Kaufbildschirm hat sich geöffnet: Seine erste Anfrage kommt sofort zurück.
app, wholeDeine Ansichten, während der Kaufbildschirm an ihrer Stelle steht, und ob gate genutzt wurde.

Klassen

KlasseWas es ist
PaywallViewDer Kaufbildschirm. Er zeichnet den Bildschirm des Servers und spielt die Freischaltung ab.
PaywallDelegateDie Tasten des Kaufbildschirms: START und BACK.
PayReplyDas Callback-Objekt der Web-Anfrage.
PayBgNur Zifferblätter und Datenfelder: der Hintergrunddienst, der den Server fragt.

PaywallConfig

KonstanteWas es ist
URLErforderlich. Die Adresse deiner App, aus deinem Dashboard.
TRIAL_DAYSApps: optional, weglassen für keine Testphase. Zifferblätter und Datenfelder: erforderlich, 0 für keine Testphase.

Zifferblätter und Datenfelder

Zifferblätter und Datenfelder nutzen lib/watch/face, dessen module Paywall eigene Aufrufe hat. active(), unlocked() und trialLeft() funktionieren wie oben.

AufrufWas es tut
Paywall.startTrial()Bei jedem Start, aus getInitialView(): startet beim ersten Mal die Testphase und lässt eine abgeschlossene Anmeldeseite den Hintergrund wecken.
Paywall.schedule(false)Bei jedem Start, aus getInitialView(): plant die nächste Prüfung im Hintergrund.
Paywall.take(d)Aus onBackgroundData(d): speichert die Antwort des Hintergrunds und plant die nächste Prüfung.
Paywall.soon()Aus onSettingsChanged(): eine Prüfung, sobald Garmin es erlaubt, und im gesperrten Zustand erneut die Anmelde-Benachrichtigung.
Paywall.drawQr(dc, x, y, side)Zeichnet den QR-Code side breit auf ein weißes Quadrat, zentriert bei x, y. Vor der ersten Antwort nichts.
Paywall.book(n)Von der Bibliothek aufgerufen: plant eine Prüfung im Hintergrund, frühestens 5 Minuten nach der letzten.
K_SIGN"pg": Speicherschlüssel für die Anmelde-Benachrichtigung (1 = senden, 2 = gesendet).

Die ganze Einrichtung steht unter Zifferblätter und Datenfelder.

Testphasen

  • Setze TRIAL_DAYS in PaywallConfig, gleich wie die kostenlose Testphase im Dashboard. Lass es weg für keine Testphase: Dann erscheint „Test vorbei“ nie.
  • Die Testphase beginnt beim ersten Start. Paywall.unlocked() ist true, bis sie endet.
  • Neu installieren startet sie nie neu. Unser Server zählt die Testphase ab dem ersten Kontakt mit dieser Uhr, und seine Zählung ersetzt bei der ersten Antwort die der Uhr.
  • Eine zurückgestellte Uhrzeit verlängert sie nicht. Der Server sendet die Restzeit, kein Datum, und die Uhr zählt nie mehr Tage als TRIAL_DAYS.
  • Der Titel des Kaufbildschirms zeigt „Noch 7 T.“, dann „Letzter Tag“, dann „Test vorbei“.

Eine Testphase, die deine App zählt

Für eine Testphase nach Nutzung statt nach Tagen lass TRIAL_DAYS weg, führe einen eigenen Zähler im Speicher (der auch „Daten löschen“ übersteht) und prüfe active():

source/MainDelegate.mc
// 20 free sessions, then Premium
if (Paywall.active() || sessionsUsed < 20) {
    startSession();
} else {
    Paywall.open();
}

Was die Bibliothek speichert

  • Apps: "pa" (die Antwort), "pp" (wann „bezahlt“ zuletzt bestätigt wurde), "ts" (Ende der Testphase) und "te" („Test vorbei“ angezeigt).
  • Zifferblätter und Datenfelder: "pa", "pp", "ts" und "pg", dazu die Eigenschaft unlock für den Einstellungslink.
  • Nutze andere Namen für deine eigenen Schlüssel.
Esc