La bibliothèque
Ajoutez la bibliothèque
La bibliothèque dessine chaque écran de paiement pour vous. Vous ajoutez ses dossiers, une permission, un petit fichier de config et une ligne de code.
Les fichiers
Téléchargez la bibliothèque depuis l'onglet Installer de votre application. Elle se décompresse dans un dossier wearcheckout.
| Chemin | Ce qu'il fait |
|---|---|
lib/ | Applications : la vérification avec notre serveur, l'écran d'achat dessiné d'après la réponse du serveur, son délai, et le déblocage avec son son et sa vibration. |
lib/ | active(), unlocked() et trialLeft(), annotés (:glance) : pour les applications sans service d'arrière-plan. |
lib/ | Les mêmes, annotés (:glance, :background) : pour les applications avec un service d'arrière-plan. Utilisez exactement l'un des deux. |
lib/, PayFaceScope.mc | Cadrans et champs de données : la vérification en arrière-plan, drawQr et le lien des paramètres. Voir Cadrans et champs de données. |
lib/ | Seulement si vous vendez Avis et réponses ou utilisez une page boutique : la demande d'avis, vos réponses et l'écran « Déjà acheté ? ». Voir Les extras dans votre application. Les montres antérieures à Connect IQ 3.1 l'ignorent. |
lib/ | Seulement si vous vendez Export vers le téléphone : les données de votre application dans un tableur, chiffré sur la montre, avec son lien envoyé au téléphone de l'acheteur. |
lib/ | Seulement si votre application utilise les flux de données : météo, soleil et lune, heures de prière, marées et plus. Voir Flux de données. |
lib/ | Les 4 lignes que l'écran d'achat affiche sans le serveur, en anglais. |
lib/ | Les mêmes 4 lignes dans les 7 autres langues. |
L'ajouter à votre projet
Décompressez la bibliothèque à côté du dossier de votre application :
IntervalTimer/
manifest.xml
monkey.jungle
resources/
source/
PaywallConfig.mc
wearcheckout/
lib/watch/...Ajoutez ensuite ses dossiers à votre jungle :
base.sourcePath = source;../wearcheckout/lib/watch/app;../wearcheckout/lib/watch/glance
base.resourcePath = resources;../wearcheckout/lib/watch/resources- Chemins relatifs uniquement. Un espace dans un chemin absolu casse la jungle.
- Ou copiez les fichiers. Copiée dans vos propres dossiers
sourceetresources(et chaque dossierresources-<lang>), la bibliothèque n'a besoin d'aucune ligne jungle. - Aucune annotation à définir. Une seule compilation sert toutes les montres. Le sous-écran de l'Instinct est détecté à l'exécution.
Avec un service d'arrière-plan
Si votre application a son propre service d'arrière-plan, utilisez glance-bg à la place de glance, annotez PaywallConfig (:glance, :background), et ajoutez la permission Background. Tout code (:background) pousse le compilateur à demander cette permission, d'où les deux versions.
base.sourcePath = source;../wearcheckout/lib/watch/app;../wearcheckout/lib/watch/glance-bgAutorisez le réseau
La montre interroge notre serveur via la connexion du téléphone, ou en Wi-Fi sur les montres qui l'ont. Ajoutez la permission Communications :
<iq:permissions>
<iq:uses-permission id="Communications"/>
</iq:permissions>PaywallConfig.mc
Téléchargez-le depuis l'onglet Installer de votre application : il contient la vraie adresse de votre application. L'adresse est publique, ce n'est pas un secret.
// PaywallConfig.mc: from your dashboard (Interval Timer). Public, not a secret.
import Toybox.Lang;
(:glance)
module PaywallConfig {
const URL = "https://pay.example/api/K7Q2/c"; // your app's address
const TRIAL_DAYS = 7;
}URL: l'adresse de votre application. Chaque vérification y est envoyée.TRIAL_DAYS: omettez-le pour ne pas proposer d'essai. Gardez la même durée que l'essai de votre tableau de bord : la montre ne compte jamais plus de jours queTRIAL_DAYS.- L'annotation correspond au
PayScope.mcque vous utilisez :(:glance), ou(:glance, :background)avecglance-bg.
La ligne unique
Dans getInitialView(), renvoyez vos vues via la bibliothèque :
return Paywall.gate([new MainView(), new MainDelegate()]); // the whole app is paid for
return Paywall.start([new MainView(), new MainDelegate()]); // or: only some features aregatelance l'essai, interroge le serveur au bon moment et, tant que l'application est bloquée, affiche l'écran d'achat à sa place. BACK quitte l'application. Une fois payée, BACK ou START ouvre vos propres vues.startouvre votre application comme d'habitude, avec l'écran d'achat une fois à la fin de l'essai. Chaque fonction payante vérifie ensuite d'abord :
if (Paywall.unlocked()) { showHistory(); } else { Paywall.open(); }Avec l'un ou l'autre, un achat fait sur le téléphone pendant que l'écran d'achat est fermé ouvre le déblocage tout seul dès que la montre l'apprend. Verrouiller les fonctions payantes liste chaque appel.
Un élément Premium dans vos paramètres
L'élément « Premium » d'un menu de paramètres ouvre l'écran d'achat. S'il est déjà affiché, vous retrouvez celui-là : il n'y en a jamais un second.
Paywall.open();Supprimer les données
Si votre application a une option « Supprimer les données », gardez les clés que renvoie Paywall.keys(). Le reste revient du serveur au prochain démarrage.
// Delete data: everything except the payment keys
var st = Application.Storage;
var keep = Paywall.keys();
var saved = [];
for (var i = 0; i < keep.size(); i++) {
saved.add(st.getValue(keep[i]));
}
st.clearValues();
for (var j = 0; j < keep.size(); j++) {
if (saved[j] != null) {
st.setValue(keep[j], saved[j]);
}
}Les extras dans votre application
Trois des extras payants ont besoin de leur propre dossier, pour que les applications sans eux restent légères. Statistiques des montres n'en a pas besoin.
Avis et réponses, et « Déjà acheté ? »
Ajoutez le dossier extras, puis activez-le avant la ligne unique :
base.sourcePath = source;../wearcheckout/lib/watch/app;../wearcheckout/lib/watch/glance;../wearcheckout/lib/watch/extrasPayExtras.on();
return Paywall.gate([new MainView(), new MainDelegate()]);- La demande d'avis s'affiche au jour 3, 7 ou 14 : les étoiles, puis un QR code qui ouvre votre page sur la boutique et un mot pour vous.
- Votre réponse s'affiche une fois par-dessus votre application. Sur les petites montres, une longue réponse tient sur deux écrans : START affiche la suite.
- « Déjà acheté ? » affiche une fois le code d'une nouvelle montre quand son acheteur a d'abord payé sur votre page boutique.
- Sans le dossier, les montres de cette application n'ont pas de demande, vos réponses attendent sur le serveur, et un acheteur de votre page boutique scanne l'écran d'achat normal. Les montres antérieures à Connect IQ 3.1 ignorent aussi le dossier.
Exporter vers le téléphone
Ajoutez le dossier export, proposez l'export tant que PayExport.ready() est vrai, et lancez-le avec une méthode qui renvoie une ligne à la fois :
base.sourcePath = source;../wearcheckout/lib/watch/app;../wearcheckout/lib/watch/glance;../wearcheckout/lib/watch/export// Row 0 is the header; rows 1 to n are your data.
function row(i as Number) as Array {
if (i == 0) { return ["Date", "Minutes"]; }
var s = sessions[i - 1];
return [s[:date], s[:minutes]];
}
if (PayExport.ready()) {
PayExport.start(method(:row), sessions.size());
}- Les valeurs peuvent être du texte, des nombres, vrai ou faux, ou
null. - La bibliothèque fait le reste : elle envoie les parties chiffrées, puis envoie le lien au téléphone de l'acheteur sous forme de notification Garmin Connect. L'acheteur la touche, et son téléphone ouvre le tableur. START renvoie le lien. Le lien nécessite que le téléphone de l'acheteur soit connecté à la montre.
- Les formules ne s'exécutent jamais. Un texte commençant par
=,+,-ou@est d'abord précédé d'un'.
Flux de données
Ajoutez le dossier feeds, puis demandez un flux là où votre application en a besoin. Votre méthode reçoit le code HTTP et la réponse :
base.sourcePath = source;../wearcheckout/lib/watch/app;../wearcheckout/lib/watch/glance;../wearcheckout/lib/watch/feedsPayFeeds.get("weather", {
"lat" => lat, "lon" => lon,
"tz" => System.getClockTime().timeZoneOffset
}, method(:onWeather));
function onWeather(code as Number, data as Dictionary or Null) as Void {
if (code == 200) {
temp = data["now"]["temp"];
WatchUi.requestUpdate();
}
}- Les flux : soleil, lune, heures de prière, horloge mondiale, taux de change, météo, alertes météo (États-Unis), séismes, aurores, marées (États-Unis) et jours fériés. Les paramètres et champs de chacun sont sur la page Flux de données du tableau de bord, où vous pouvez les essayer.
- Gardée sur la montre. Chaque réponse reste valable pendant son
ttl, en secondes. Redemandez plus tôt, pour le même flux et presque au même endroit, et la réponse gardée revient aussitôt sans nouvelle requête. - Les lieux sont en degrés. Les heures sont en secondes Unix, les unités métriques.
- Affichez la ligne de la source quand la carte du flux le demande, par exemple « Météo : MET Norway ».
- Les autres codes renvoient
null: 403 signifie que les Extras sont désactivés pour cette appli, 429 ou 503 signifie de réessayer plus tard, un code négatif vient de Garmin (pas de téléphone, pas de réseau). Les montres de test ont tous les flux gratuitement. - Coût : 2 $US par million de requêtes des montres en production, sur votre facture mensuelle. Une réponse gardée sur la montre ne coûte rien.
Statistiques des montres
Aucun code : le modèle de la montre accompagne chaque vérification. Pour voir aussi les versions de votre application, ajoutez une version à PaywallConfig :
const VERSION = "1.3";Langues
La bibliothèque parle anglais, allemand, français, espagnol, portugais, coréen et chinois (simplifié et traditionnel). La langue de la montre décide. Toute autre langue obtient l'anglais.
- Les écrans viennent de notre serveur dans la langue de la montre : corriger un texte ne demande aucune mise à jour de l'application.
- Seules 4 lignes sont stockées sur la montre, pour quand le serveur n'a pas encore répondu.
| Chaîne | Anglais | Quand elle s'affiche |
|---|---|---|
PwWait | Chargement… | Avant la première réponse |
PwPhone | Hors ligne | Pas de téléphone, de Bluetooth ni d'internet |
PwBusy | Réessayez plus tard | Le serveur n'a pas répondu correctement |
PwBack | BACK pour fermer | Sans aucune réponse à afficher |
Ajoutez une ligne jungle par langue. Gardez votre propre dossier en premier ; omettez cette partie pour une langue sans dossier dans votre application.
base.lang.deu = resources-deu;../wearcheckout/lib/watch/resources-deu
base.lang.fre = resources-fre;../wearcheckout/lib/watch/resources-fre
base.lang.spa = resources-spa;../wearcheckout/lib/watch/resources-spa
base.lang.por = resources-por;../wearcheckout/lib/watch/resources-por
base.lang.kor = resources-kor;../wearcheckout/lib/watch/resources-kor
base.lang.zhs = resources-zhs;../wearcheckout/lib/watch/resources-zhs
base.lang.zht = resources-zht;../wearcheckout/lib/watch/resources-zhtPoints à vérifier
- La chaîne du nom de votre application. Sans réponse à afficher, l'écran d'achat affiche votre chaîne
AppName. Gardez cette chaîne dans vos ressources. - Minuteurs. L'écran d'achat utilise un minuteur, et
PayExtrasun de plus. Les montres n'en autorisent que quelques-uns, et « Too Many Timers » ferme l'application : si la vôtre en utilise déjà deux ou plus, vérifiez que vous restez dans la limite. - Appuis longs. Maintenir un bouton trop longtemps ouvre le menu de la montre. L'écran d'achat ne réagit qu'aux appuis brefs.
- Les anciens appels fonctionnent toujours.
Paywall.startTrial(); Paywall.launch();dansgetInitialView(), etPaywall.showOver()dans leonShow()de votre premier écran, font ce quegateetstartfont en une ligne.