La biblioteca
Bloquear funciones de pago
Vende toda la app con Paywall.gate, o algunas funciones con Paywall.start y una comprobación por función. Esta página enumera cada llamada y constante pública de la biblioteca, y cómo funcionan las pruebas.
Toda la app o algunas funciones
Paywall.gate(views) | Paywall.start(views) | |
|---|---|---|
| Úsala para | Una app que se paga entera | Una app que vende algunas funciones |
| Al iniciar, bloqueada | La pantalla de compra en lugar de tu app | Tu app, como siempre |
| Durante una prueba | Tu app, como siempre | Tu app, como siempre |
| Cuando termina la prueba | La pantalla de compra en cada inicio, con el título "Prueba acabó" | La pantalla de compra una vez, con el título "Prueba acabó" |
| BACK en la pantalla de compra | Sale de la app | Va a tu app |
| Al pagar | BACK o START abre tus vistas | BACK o START lleva a tu app |
| Cada función de pago | Nada que añadir | Comprueba Paywall.unlocked() primero |
Ambas reciben el mismo array que devolverías desde getInitialView(): una vista, o una vista y su delegado.
Bloquear una función
Con start, comprueba dónde empieza cada función de pago: un botón, un elemento de menú, una página.
function onHistory() as Void {
if (Paywall.unlocked()) {
showHistory();
} else {
Paywall.open();
}
}- Un solo candado lo abre todo. Una compra desbloquea todas las funciones de pago de la app. Hay un precio por app.
- En un glance, llama solo a
active(),unlocked()ytrialLeft(). La pantalla de compra es solo para la app. - Los detalles de agradecimiento que solo deben ver los compradores, no durante una prueba, comprueban
Paywall.active().
Referencia
Todo esto está en module Paywall (Pay.mc y el PayScope.mc que uses), salvo que la tabla diga otra cosa.
Llamadas que haces tú
| Llamada | Devuelve | Qué hace | Funciona en |
|---|---|---|---|
Paywall.gate(views) | Las vistas que devolver | En getInitialView(), para una app que se paga entera. Inicia la prueba, consulta al servidor cuando toca y, mientras está bloqueada, devuelve la pantalla de compra en lugar de tu app. Una vez pagada, BACK o START abre tus vistas. | App |
Paywall.start(views) | Las vistas que devolver | En getInitialView(), para una app que vende algunas funciones. Inicia la prueba, consulta al servidor cuando toca y devuelve tus vistas. Muestra la pantalla de compra una vez cuando termina la prueba. | App |
Paywall.unlocked() | Boolean | Pagado, o en la prueba (incluso antes de que empiece). La comprobación de cada función de pago. | App, glance |
Paywall.active() | Boolean | Pagado, y confirmado por el servidor en los últimos 30 días. False durante una prueba. Una marca de "pagado" más de 5 minutos en el futuro (hora atrasada) no cuenta. | App, glance |
Paywall.trialLeft() | Number | Días completos de prueba que quedan, redondeados hacia arriba. Nunca más que TRIAL_DAYS. Todo TRIAL_DAYS antes de que empiece la prueba; 0 cuando termina, o sin prueba. | App, glance |
Paywall.open() | PaywallView | Abre la pantalla de compra, o devuelve la que ya se muestra. Para el else de una función de pago y un elemento "Premium" en tus ajustes. | App |
Paywall.keys() | Array | Las claves de almacenamiento que tu "Borrar datos" debe conservar: "pp", "ts" y "te". | App |
Paywall.startTrial() | Void | Llamada antigua. Inicia la prueba por tiempo en el primer inicio; nada sin TRIAL_DAYS. gate y start la llaman. | App |
Paywall.launch() | Void | Llamada antigua. Consulta al servidor cuando llega su momento, o al instante si la hora del reloj ha retrocedido. gate y start la llaman. | App |
Paywall.showOver() | Void | Llamada antigua, desde el onShow() de tu primera pantalla. A partir de ahí, una compra hecha lejos del reloj abre el desbloqueo por sí sola; con prueba, abre la pantalla de compra una vez cuando termina la prueba. gate y start lo hacen por ti. | App |
La llama la propia biblioteca
La biblioteca las llama ella misma. No las llames desde tu código.
| Función | Qué hace |
|---|---|
check() | Envía una consulta al servidor, nunca dos a la vez. Una consulta sin respuesta durante un minuto deja de contar. |
onAnswer(code, data) | Gestiona la respuesta del servidor. Solo conserva una respuesta completa, con versión y próxima consulta. Si falla, pone "Sin red" o "Más tarde" y la espera antes del siguiente intento. |
take(d) | Guarda una respuesta, el fin de la prueba y "pagado". Abre el desbloqueo cuando llega una compra. |
first(views) | La parte común de gate y start. |
close() | Sale de la pantalla de compra: a tus vistas una vez pagada (o tras la pantalla de fin de prueba de start), fuera de una app gate bloqueada, o de vuelta a donde se llamó a open(). |
cheer() | El tono de éxito del reloj y una vibración, si el reloj los tiene activados. |
Constantes
| Constante | Valor | Qué es |
|---|---|---|
K_ANS | "pa" | Clave de almacenamiento: la última respuesta del servidor. |
K_PAID | "pp" | Clave de almacenamiento: cuándo dijo el servidor "pagado" por última vez, en segundos. Ninguna: no pagado. |
K_TRIAL | "ts" | Clave de almacenamiento: cuándo termina la prueba. Se fija en el primer inicio y luego la fija el servidor. |
K_OVER | "te" | Clave de almacenamiento: ya se mostró la pantalla "Prueba acabó". |
STALE | 2592000 | 30 días en segundos: cuánto vale "pagado" sin una nueva respuesta del servidor. |
DAY | 86400 | Un día en segundos. |
Variables del módulo
El estado propio de la pantalla de compra. Léelas si lo necesitas; nunca les asignes un valor.
| Variable | Qué contiene |
|---|---|
listener | La pantalla de compra abierta, o null. |
status | La línea de problema ("Sin red" o "Más tarde"), o null. |
busy, sentAt | Hay una consulta en curso, y cuándo salió. |
hold, held | Cuánto puede retener el servidor una consulta mientras se muestra la pantalla de compra (15 segundos al principio, la mitad si el teléfono la corta). |
changedAt, limit | Cuándo cambió la pantalla por última vez, y cuántos segundos puede seguir abierta sin cambios. |
fails, nextAt | Consultas fallidas seguidas, y cuándo puede salir la siguiente. |
shown | La primera pantalla de tu app está abierta: una compra puede abrir el desbloqueo por sí sola. |
quick | La pantalla de compra se ha abierto: su primera consulta vuelve al instante. |
app, whole | Tus vistas mientras la pantalla de compra ocupa su lugar, y si se usó gate. |
Clases
| Clase | Qué es |
|---|---|
PaywallView | La pantalla de compra. Dibuja la pantalla del servidor y reproduce el desbloqueo. |
PaywallDelegate | Los botones de la pantalla de compra: START y BACK. |
PayReply | El objeto de callback de la petición web. |
PayBg | Solo esferas y campos de datos: el servicio en segundo plano que consulta al servidor. |
PaywallConfig
| Constante | Qué es |
|---|---|
URL | Obligatorio. La dirección de tu app, de tu panel. |
TRIAL_DAYS | Apps: opcional, omítelo si no hay prueba. Esferas y campos de datos: obligatorio, 0 si no hay prueba. |
Esferas y campos de datos
Las esferas y los campos de datos usan lib/watch/face, cuyo module Paywall tiene sus propias llamadas. active(), unlocked() y trialLeft() funcionan como arriba.
| Llamada | Qué hace |
|---|---|
Paywall.startTrial() | En cada inicio, desde getInitialView(): inicia la prueba la primera vez y permite que una página de inicio de sesión terminada despierte el segundo plano. |
Paywall.schedule(false) | En cada inicio, desde getInitialView(): programa la siguiente consulta en segundo plano. |
Paywall.take(d) | Desde onBackgroundData(d): guarda la respuesta del segundo plano y programa la siguiente consulta. |
Paywall.soon() | Desde onSettingsChanged(): una consulta en cuanto Garmin lo permite, y de nuevo la notificación de inicio de sesión mientras está bloqueada. |
Paywall.drawQr(dc, x, y, side) | Dibuja el código QR de side de ancho sobre un cuadrado blanco, centrado en x, y. Nada antes de la primera respuesta. |
Paywall.book(n) | La llama la biblioteca: programa una consulta en segundo plano, nunca antes de 5 minutos después de la anterior. |
K_SIGN | "pg": clave de almacenamiento de la notificación de inicio de sesión (1 por enviar, 2 enviada). |
Toda la configuración está en Esferas y campos de datos.
Pruebas
- Define
TRIAL_DAYSenPaywallConfig, igual que la prueba gratuita de tu panel. Omítelo si no hay prueba: así "Prueba acabó" nunca aparece. - La prueba empieza en el primer inicio.
Paywall.unlocked()es true hasta que termina. - Reinstalar nunca la reinicia. Nuestro servidor cuenta la prueba desde la primera vez que vio ese reloj, y su cuenta sustituye a la del reloj en la primera respuesta.
- Atrasar el reloj no la alarga. El servidor envía el tiempo restante, no una fecha, y el reloj nunca cuenta más días que
TRIAL_DAYS. - El título de la pantalla de compra muestra "Prueba: 7 d", luego "Último día" y luego "Prueba acabó".
Una prueba que cuenta tu app
Para una prueba por uso en vez de por días, omite TRIAL_DAYS, guarda tu propio contador en el almacenamiento (y que sobreviva a "Borrar datos") y comprueba active():
// 20 free sessions, then Premium
if (Paywall.active() || sessionsUsed < 20) {
startSession();
} else {
Paywall.open();
}Qué guarda la biblioteca
- Apps:
"pa"(la respuesta),"pp"(cuándo se confirmó "pagado" por última vez),"ts"(el fin de la prueba) y"te"("Prueba acabó" mostrado). - Esferas y campos de datos:
"pa","pp","ts"y"pg", más la propiedadunlockpara el enlace de los ajustes. - Usa otros nombres para tus propias claves.