Docs

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 paraUna app que se paga enteraUna app que vende algunas funciones
Al iniciar, bloqueadaLa pantalla de compra en lugar de tu appTu app, como siempre
Durante una pruebaTu app, como siempreTu app, como siempre
Cuando termina la pruebaLa 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 compraSale de la appVa a tu app
Al pagarBACK o START abre tus vistasBACK o START lleva a tu app
Cada función de pagoNada que añadirComprueba 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.

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

LlamadaDevuelveQué haceFunciona en
Paywall.gate(views)Las vistas que devolverEn 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 devolverEn 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()BooleanPagado, o en la prueba (incluso antes de que empiece). La comprobación de cada función de pago.App, glance
Paywall.active()BooleanPagado, 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()NumberDí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()PaywallViewAbre 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()ArrayLas claves de almacenamiento que tu "Borrar datos" debe conservar: "pp", "ts" y "te".App
Paywall.startTrial()VoidLlamada antigua. Inicia la prueba por tiempo en el primer inicio; nada sin TRIAL_DAYS. gate y start la llaman.App
Paywall.launch()VoidLlamada 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()VoidLlamada 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ónQué 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

ConstanteValorQué 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ó".
STALE259200030 días en segundos: cuánto vale "pagado" sin una nueva respuesta del servidor.
DAY86400Un 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.

VariableQué contiene
listenerLa pantalla de compra abierta, o null.
statusLa línea de problema ("Sin red" o "Más tarde"), o null.
busy, sentAtHay una consulta en curso, y cuándo salió.
hold, heldCuá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, limitCuándo cambió la pantalla por última vez, y cuántos segundos puede seguir abierta sin cambios.
fails, nextAtConsultas fallidas seguidas, y cuándo puede salir la siguiente.
shownLa primera pantalla de tu app está abierta: una compra puede abrir el desbloqueo por sí sola.
quickLa pantalla de compra se ha abierto: su primera consulta vuelve al instante.
app, wholeTus vistas mientras la pantalla de compra ocupa su lugar, y si se usó gate.

Clases

ClaseQué es
PaywallViewLa pantalla de compra. Dibuja la pantalla del servidor y reproduce el desbloqueo.
PaywallDelegateLos botones de la pantalla de compra: START y BACK.
PayReplyEl objeto de callback de la petición web.
PayBgSolo esferas y campos de datos: el servicio en segundo plano que consulta al servidor.

PaywallConfig

ConstanteQué es
URLObligatorio. La dirección de tu app, de tu panel.
TRIAL_DAYSApps: 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.

LlamadaQué 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_DAYS en PaywallConfig, 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():

source/MainDelegate.mc
// 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 propiedad unlock para el enlace de los ajustes.
  • Usa otros nombres para tus propias claves.
Esc