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ür | Eine App, die als Ganzes bezahlt wird | Eine App, die einzelne Funktionen verkauft |
| Beim Start, gesperrt | Der Kaufbildschirm statt deiner App | Deine App, wie gewohnt |
| Während einer Testphase | Deine App, wie gewohnt | Deine App, wie gewohnt |
| Wenn die Testphase endet | Der Kaufbildschirm bei jedem Start, mit dem Titel „Test vorbei“ | Der Kaufbildschirm einmal, mit dem Titel „Test vorbei“ |
| BACK auf dem Kaufbildschirm | Verlässt die App | Geht zu deiner App |
| Nach der Zahlung | BACK oder START öffnet deine Ansichten | BACK oder START führt zu deiner App |
| Jede bezahlte Funktion | Nichts hinzuzufügen | Prü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.
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()undtrialLeft()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
| Aufruf | Rückgabe | Was es tut | Funktioniert in |
|---|---|---|---|
Paywall.gate(views) | Die zurückzugebenden Ansichten | In 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 Ansichten | In 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() | Boolean | Bezahlt oder in der Testphase (die ganze, schon vor ihrem Start). Die Prüfung für jede bezahlte Funktion. | App, Glance |
Paywall.active() | Boolean | Bezahlt 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() | Zahl | Verbleibende 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() | Array | Die 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.
| Funktion | Was 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
| Konstante | Wert | Was 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. |
STALE | 2592000 | 30 Tage in Sekunden: wie lange „bezahlt“ ohne neue Antwort des Servers gilt. |
DAY | 86400 | Ein Tag in Sekunden. |
Modulvariablen
Der eigene Zustand des Kaufbildschirms. Lies sie bei Bedarf; setze sie nie.
| Variable | Was es enthält |
|---|---|
listener | Der offene Kaufbildschirm oder null. |
status | Die Problemzeile („Offline“ oder „Später“) oder null. |
busy, sentAt | Eine Anfrage läuft, und wann sie rausging. |
hold, held | Wie lange der Server eine Anfrage halten darf, solange der Kaufbildschirm angezeigt wird (zuerst 15 Sekunden, halbiert, wenn das Handy sie abbricht). |
changedAt, limit | Wann sich der Bildschirm zuletzt geändert hat und wie viele Sekunden er ohne Änderung offen bleiben darf. |
fails, nextAt | Fehlgeschlagene Anfragen in Folge, und wann die nächste raus darf. |
shown | Der erste Bildschirm deiner App ist offen: Ein Kauf darf die Freischaltung von selbst öffnen. |
quick | Der Kaufbildschirm hat sich geöffnet: Seine erste Anfrage kommt sofort zurück. |
app, whole | Deine Ansichten, während der Kaufbildschirm an ihrer Stelle steht, und ob gate genutzt wurde. |
Klassen
| Klasse | Was es ist |
|---|---|
PaywallView | Der Kaufbildschirm. Er zeichnet den Bildschirm des Servers und spielt die Freischaltung ab. |
PaywallDelegate | Die Tasten des Kaufbildschirms: START und BACK. |
PayReply | Das Callback-Objekt der Web-Anfrage. |
PayBg | Nur Zifferblätter und Datenfelder: der Hintergrunddienst, der den Server fragt. |
PaywallConfig
| Konstante | Was es ist |
|---|---|
URL | Erforderlich. Die Adresse deiner App, aus deinem Dashboard. |
TRIAL_DAYS | Apps: 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.
| Aufruf | Was 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_DAYSinPaywallConfig, 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():
// 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 Eigenschaftunlockfür den Einstellungslink. - Nutze andere Namen für deine eigenen Schlüssel.