Docs

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)
UtilisationUne application payée en entierUne application qui vend certaines fonctions
Au lancement, bloquéeL'écran d'achat à la place de votre applicationVotre application, comme d'habitude
Pendant un essaiVotre application, comme d'habitudeVotre application, comme d'habitude
À la fin de l'essaiL'écran d'achat à chaque lancement, intitulé « Essai terminé »L'écran d'achat une fois, intitulé « Essai terminé »
BACK sur l'écran d'achatQuitte l'applicationMène à votre application
Une fois payéBACK ou START ouvre vos vuesBACK ou START mène à votre application
Chaque fonction payanteRien à ajouterVé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.

source/MainDelegate.mc
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() et trialLeft(). 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

AppelRenvoieCe qu'il faitFonctionne dans
Paywall.gate(views)Les vues à renvoyerDans 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 à renvoyerDans 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()BooleanPayé, ou en essai (tout l'essai, avant qu'il démarre). La vérification de chaque fonction payante.Application, aperçu
Paywall.active()BooleanPayé, 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()NumberJours 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()PaywallViewAffiche 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()ArrayLes clés de stockage que votre « Supprimer les données » doit garder : "pp", "ts" et "te".Appli
Paywall.startTrial()VoidAncien appel. Démarre l'essai en temps au premier lancement ; rien sans TRIAL_DAYS. gate et start l'appellent.Appli
Paywall.launch()VoidAncien 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()VoidAncien 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.

FonctionCe 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

ConstanteValeurCe 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é.
STALE259200030 jours en secondes : la durée pendant laquelle « payé » compte sans nouvelle réponse du serveur.
DAY86400Un jour en secondes.

Variables du module

L'état propre de l'écran d'achat. Lisez-les si besoin ; ne les définissez jamais.

VariableCe qu'elle contient
listenerL'écran d'achat ouvert, ou null.
statusLa ligne de problème (« Hors ligne » ou « Réessayez plus tard »), ou null.
busy, sentAtUne demande est en cours, et quand elle est partie.
hold, heldCombien 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, limitQuand l'écran a changé pour la dernière fois, et combien de secondes il peut rester ouvert sans changement.
fails, nextAtDemandes échouées d'affilée, et quand la prochaine peut partir.
shownLe premier écran de votre application est affiché : un achat peut ouvrir le déblocage tout seul.
quickL'écran d'achat s'est ouvert : sa première demande revient aussitôt.
app, wholeVos vues pendant que l'écran d'achat les remplace, et si gate a été utilisé.

Classes

ClasseCe que c'est
PaywallViewL'écran d'achat. Il dessine l'écran du serveur et joue le déblocage.
PaywallDelegateLes boutons de l'écran d'achat : START et BACK.
PayReplyL'objet de rappel de la requête web.
PayBgCadrans et champs de données seulement : le service d'arrière-plan qui interroge le serveur.

PaywallConfig

ConstanteCe que c'est
URLObligatoire. L'adresse de votre application, depuis votre tableau de bord.
TRIAL_DAYSApplications : 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.

AppelCe 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_DAYS dans PaywallConfig, 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() :

source/MainDelegate.mc
// 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é unlock pour le lien des paramètres.
  • Utilisez d'autres noms pour vos propres clés.
Esc