La bibliothèque
Verrouiller les fonctions payantes
Vendez toute l'application avec Paywall.gate, ou certaines fonctions avec Paywall.start et une vérification par fonction. Cette page liste chaque appel public et chaque constante de la bibliothèque, et comment fonctionnent les essais.
Toute l'application ou certaines fonctions
Paywall.gate(views) | Paywall.start(views) | |
|---|---|---|
| Utilisation | Une application payée en entier | Une application qui vend certaines fonctions |
| Au lancement, bloquée | L'écran d'achat à la place de votre application | Votre application, comme d'habitude |
| Pendant un essai | Votre application, comme d'habitude | Votre application, comme d'habitude |
| À la fin de l'essai | L'écran d'achat à chaque lancement, intitulé « Essai terminé » | L'écran d'achat une fois, intitulé « Essai terminé » |
| BACK sur l'écran d'achat | Quitte l'application | Mène à votre application |
| Une fois payé | BACK ou START ouvre vos vues | BACK ou START mène à votre application |
| Chaque fonction payante | Rien à ajouter | Vérifie d'abord Paywall.unlocked() |
Les deux prennent le même tableau que celui que vous renverriez depuis getInitialView() : une vue, ou une vue et son délégué.
Verrouiller une fonction
Avec start, vérifiez là où commence chaque fonction payante : un bouton, un élément de menu, une page.
function onHistory() as Void {
if (Paywall.unlocked()) {
showHistory();
} else {
Paywall.open();
}
}- Un seul verrou ouvre tout. Un achat débloque toutes les fonctions payantes de l'application. Il y a un prix par application.
- Dans un aperçu, appelez seulement
active(),unlocked()ettrialLeft(). L'écran d'achat est réservé à l'application. - Les petites attentions de remerciement à montrer seulement aux acheteurs, pas pendant un essai, vérifient
Paywall.active().
Référence
Tout ici se trouve dans module Paywall (Pay.mc et le PayScope.mc que vous utilisez), sauf indication contraire dans le tableau.
Appels que vous faites
| Appel | Renvoie | Ce qu'il fait | Fonctionne dans |
|---|---|---|---|
Paywall.gate(views) | Les vues à renvoyer | Dans getInitialView(), pour une application payée en entier. Démarre l'essai, interroge le serveur au bon moment et, tant qu'elle est bloquée, renvoie l'écran d'achat à la place de votre application. Une fois payée, BACK ou START ouvre vos vues. | Appli |
Paywall.start(views) | Les vues à renvoyer | Dans getInitialView(), pour une application qui vend certaines fonctions. Démarre l'essai, interroge le serveur au bon moment et renvoie vos vues. Affiche l'écran d'achat une fois à la fin de l'essai. | Appli |
Paywall.unlocked() | Boolean | Payé, ou en essai (tout l'essai, avant qu'il démarre). La vérification de chaque fonction payante. | Application, aperçu |
Paywall.active() | Boolean | Payé, et confirmé par le serveur dans les 30 derniers jours. Vaut false pendant un essai. Un tampon « payé » de plus de 5 minutes dans le futur (horloge reculée) ne compte pas. | Application, aperçu |
Paywall.trialLeft() | Number | Jours d'essai entiers restants, arrondis au supérieur. Jamais plus que TRIAL_DAYS. Tout TRIAL_DAYS avant le début de l'essai ; 0 une fois terminé, ou sans essai. | Application, aperçu |
Paywall.open() | PaywallView | Affiche l'écran d'achat, ou renvoie celui déjà affiché. Pour le else d'une fonction payante, et un élément « Premium » dans vos paramètres. | Appli |
Paywall.keys() | Array | Les clés de stockage que votre « Supprimer les données » doit garder : "pp", "ts" et "te". | Appli |
Paywall.startTrial() | Void | Ancien appel. Démarre l'essai en temps au premier lancement ; rien sans TRIAL_DAYS. gate et start l'appellent. | Appli |
Paywall.launch() | Void | Ancien appel. Interroge le serveur quand le moment est venu, ou aussitôt si l'horloge de la montre a reculé. gate et start l'appellent. | Appli |
Paywall.showOver() | Void | Ancien appel, depuis le onShow() de votre premier écran. Dès lors, un achat fait hors de la montre ouvre le déblocage tout seul ; avec un essai, il ouvre l'écran d'achat une fois à la fin de l'essai. gate et start le font pour vous. | Appli |
Appelée par la bibliothèque elle-même
La bibliothèque les appelle elle-même. Ne les appelez pas depuis votre code.
| Fonction | Ce qu'il fait |
|---|---|
check() | Envoie une demande au serveur, jamais deux à la fois. Une demande sans réponse pendant une minute n'est plus comptée. |
onAnswer(code, data) | Traite la réponse du serveur. Ne garde qu'une réponse complète, avec une version et une prochaine vérification. En cas d'échec, met « Hors ligne » ou « Réessayez plus tard » et le délai avant la tentative suivante. |
take(d) | Enregistre une réponse, la fin de l'essai et « payé ». Ouvre le déblocage quand un achat arrive. |
first(views) | La partie commune de gate et start. |
close() | Quitte l'écran d'achat : vers vos vues une fois payé (ou après l'écran de fin d'essai de start), hors d'une application gate bloquée, ou retour là où open() a été appelé. |
cheer() | Le son de réussite de la montre et une vibration, si la montre les a activés. |
Constantes
| Constante | Valeur | Ce que c'est |
|---|---|---|
K_ANS | "pa" | Clé de stockage : la dernière réponse du serveur. |
K_PAID | "pp" | Clé de stockage : quand le serveur a dit « payé » pour la dernière fois, en secondes. Absente : pas payé. |
K_TRIAL | "ts" | Clé de stockage : la fin de l'essai. Fixée au premier lancement, puis par le serveur. |
K_OVER | "te" | Clé de stockage : l'écran « Essai terminé » a été affiché. |
STALE | 2592000 | 30 jours en secondes : la durée pendant laquelle « payé » compte sans nouvelle réponse du serveur. |
DAY | 86400 | Un jour en secondes. |
Variables du module
L'état propre de l'écran d'achat. Lisez-les si besoin ; ne les définissez jamais.
| Variable | Ce qu'elle contient |
|---|---|
listener | L'écran d'achat ouvert, ou null. |
status | La ligne de problème (« Hors ligne » ou « Réessayez plus tard »), ou null. |
busy, sentAt | Une demande est en cours, et quand elle est partie. |
hold, held | Combien de temps le serveur peut garder une demande pendant que l'écran d'achat est affiché (15 secondes au début, divisé par deux si le téléphone l'interrompt). |
changedAt, limit | Quand l'écran a changé pour la dernière fois, et combien de secondes il peut rester ouvert sans changement. |
fails, nextAt | Demandes échouées d'affilée, et quand la prochaine peut partir. |
shown | Le premier écran de votre application est affiché : un achat peut ouvrir le déblocage tout seul. |
quick | L'écran d'achat s'est ouvert : sa première demande revient aussitôt. |
app, whole | Vos vues pendant que l'écran d'achat les remplace, et si gate a été utilisé. |
Classes
| Classe | Ce que c'est |
|---|---|
PaywallView | L'écran d'achat. Il dessine l'écran du serveur et joue le déblocage. |
PaywallDelegate | Les boutons de l'écran d'achat : START et BACK. |
PayReply | L'objet de rappel de la requête web. |
PayBg | Cadrans et champs de données seulement : le service d'arrière-plan qui interroge le serveur. |
PaywallConfig
| Constante | Ce que c'est |
|---|---|
URL | Obligatoire. L'adresse de votre application, depuis votre tableau de bord. |
TRIAL_DAYS | Applications : facultatif, omettez-le pour ne pas proposer d'essai. Cadrans et champs de données : obligatoire, 0 pour aucun essai. |
Cadrans et champs de données
Les cadrans et les champs de données utilisent lib/watch/face, dont le module Paywall a ses propres appels. active(), unlocked() et trialLeft() fonctionnent comme ci-dessus.
| Appel | Ce qu'il fait |
|---|---|
Paywall.startTrial() | À chaque démarrage, depuis getInitialView() : démarre l'essai la première fois, et laisse une page de connexion terminée réveiller l'arrière-plan. |
Paywall.schedule(false) | À chaque démarrage, depuis getInitialView() : programme la prochaine vérification en arrière-plan. |
Paywall.take(d) | Depuis onBackgroundData(d) : enregistre la réponse de l'arrière-plan et programme la prochaine vérification. |
Paywall.soon() | Depuis onSettingsChanged() : une vérification dès que Garmin le permet, et à nouveau la notification de connexion tant qu'il est bloqué. |
Paywall.drawQr(dc, x, y, side) | Dessine le QR code sur side de large, sur un carré blanc centré en x, y. Rien avant la première réponse. |
Paywall.book(n) | Appelée par la bibliothèque : programme une vérification en arrière-plan, jamais moins de 5 minutes après la précédente. |
K_SIGN | "pg" : clé de stockage de la notification de connexion (1 à envoyer, 2 envoyée). |
Toute la configuration est dans Cadrans et champs de données.
Essais
- Définissez
TRIAL_DAYSdansPaywallConfig, comme l'essai gratuit de votre tableau de bord. Omettez-le pour ne pas proposer d'essai : « Essai terminé » ne s'affiche alors jamais. - L'essai démarre au premier lancement.
Paywall.unlocked()vaut true jusqu'à sa fin. - Réinstaller ne le relance jamais. Notre serveur compte l'essai depuis la première fois qu'il a vu cette montre, et son décompte remplace celui de la montre dès la première réponse.
- Reculer l'horloge ne le prolonge pas. Le serveur envoie le temps restant, pas une date, et la montre ne compte jamais plus de jours que
TRIAL_DAYS. - Le titre de l'écran d'achat affiche « 7 jours restants », puis « Dernier jour », puis « Essai terminé ».
Un essai compté par votre application
Pour un essai à l'usage plutôt qu'en jours, omettez TRIAL_DAYS, gardez votre propre compteur en stockage (y compris lors de « Supprimer les données ») et vérifiez active() :
// 20 free sessions, then Premium
if (Paywall.active() || sessionsUsed < 20) {
startSession();
} else {
Paywall.open();
}Ce que stocke la bibliothèque
- Applications :
"pa"(la réponse),"pp"(dernière confirmation de « payé »),"ts"(fin de l'essai) et"te"(« Essai terminé » affiché). - Cadrans et champs de données :
"pa","pp","ts"et"pg", plus la propriétéunlockpour le lien des paramètres. - Utilisez d'autres noms pour vos propres clés.