Docs

A biblioteca

Bloquear recursos pagos

Venda o app inteiro com Paywall.gate, ou alguns recursos com Paywall.start e uma verificação por recurso. Esta página lista cada chamada e constante pública da biblioteca, e como funcionam os testes.

App inteiro ou alguns recursos

Paywall.gate(views)Paywall.start(views)
Use paraUm app pago por inteiroUm app que vende alguns recursos
Na abertura, bloqueadoA tela de compra no lugar do seu appSeu app, como sempre
Durante um testeSeu app, como sempreSeu app, como sempre
Quando o teste terminaA tela de compra a cada abertura, com o título "Teste encerrado"A tela de compra uma vez, com o título "Teste encerrado"
BACK na tela de compraSai do appVai para o seu app
Depois de pagoBACK ou START abre suas viewsBACK ou START vai para o seu app
Cada recurso pagoNada a adicionarVerifica Paywall.unlocked() antes

Ambos recebem o mesmo array que você retornaria de getInitialView(): uma view, ou uma view e seu delegate.

Bloquear um recurso

Com start, verifique onde cada recurso pago começa: um botão, um item de menu, uma página.

source/MainDelegate.mc
function onHistory() as Void {
    if (Paywall.unlocked()) {
        showHistory();
    } else {
        Paywall.open();
    }
}
  • Um cadeado abre tudo. Uma compra libera todos os recursos pagos do app. Há um preço por app.
  • Num glance, chame só active(), unlocked() e trialLeft(). A tela de compra é só do app.
  • Agradecimentos que devem aparecer só para compradores, e não durante o teste, verificam Paywall.active().

Referência

Tudo aqui fica em module Paywall (Pay.mc e o PayScope.mc que você usa), salvo indicação contrária na tabela.

Chamadas que você faz

ChamadaRetornaO que fazFunciona em
Paywall.gate(views)As views a retornarEm getInitialView(), para um app pago por inteiro. Inicia o teste, consulta o servidor na hora certa e, enquanto bloqueado, retorna a tela de compra no lugar do seu app. Depois de pago, BACK ou START abre suas views.App
Paywall.start(views)As views a retornarEm getInitialView(), para um app que vende alguns recursos. Inicia o teste, consulta o servidor na hora certa e retorna suas views. Mostra a tela de compra uma vez quando o teste termina.App
Paywall.unlocked()BooleanPago, ou no teste (todo ele, inclusive antes de começar). A verificação para cada recurso pago.App, glance
Paywall.active()BooleanPago, e confirmado pelo servidor nos últimos 30 dias. False durante um teste. Um registro de "pago" mais de 5 minutos no futuro (hora atrasada) não conta.App, glance
Paywall.trialLeft()NumberDias inteiros de teste restantes, arredondados para cima. Nunca mais que TRIAL_DAYS. Todo o TRIAL_DAYS antes de o teste começar; 0 quando termina, ou sem teste.App, glance
Paywall.open()PaywallViewAbre a tela de compra, ou retorna a que já está aberta. Para o else de um recurso pago e um item "Premium" nas suas configurações.App
Paywall.keys()ArrayAs chaves de armazenamento que seu "Excluir dados" precisa manter: "pp", "ts" e "te".App
Paywall.startTrial()VoidChamada antiga. Inicia o teste por tempo na primeira abertura; nada sem TRIAL_DAYS. gate e start a chamam.App
Paywall.launch()VoidChamada antiga. Consulta o servidor quando chega a hora, ou na hora se a hora do relógio voltou. gate e start a chamam.App
Paywall.showOver()VoidChamada antiga, a partir do onShow() da sua primeira tela. Daí em diante, uma compra feita longe do relógio abre o desbloqueio sozinha; com teste, abre a tela de compra uma vez quando o teste termina. gate e start fazem isso por você.App

Chamado pela própria biblioteca

A biblioteca chama estas sozinha. Não as chame do seu código.

FunçãoO que faz
check()Envia uma consulta ao servidor, nunca duas ao mesmo tempo. Uma consulta sem resposta por um minuto deixa de contar.
onAnswer(code, data)Trata a resposta do servidor. Só guarda uma resposta completa, com versão e próxima verificação. Em caso de falha, define "Offline" ou "Tente mais tarde" e a espera até a próxima tentativa.
take(d)Guarda uma resposta, o fim do teste e o "pago". Abre o desbloqueio quando uma compra chega.
first(views)A parte em comum de gate e start.
close()Sai da tela de compra: para suas views depois de pago (ou após a tela de fim do teste de start), para fora de um app gate bloqueado, ou de volta para onde open() foi chamado.
cheer()O som de sucesso do relógio e uma vibração, se estiverem ativados.

Constantes

ConstanteValorO que é
K_ANS"pa"Chave de armazenamento: a última resposta do servidor.
K_PAID"pp"Chave de armazenamento: quando o servidor disse "pago" pela última vez, em segundos. Ausente: não pago.
K_TRIAL"ts"Chave de armazenamento: quando o teste termina. Definida na primeira abertura, depois pelo servidor.
K_OVER"te"Chave de armazenamento: a tela "Teste encerrado" já apareceu.
STALE259200030 dias em segundos: quanto tempo o "pago" vale sem nova resposta do servidor.
DAY86400Um dia em segundos.

Variáveis do módulo

O estado da própria tela de compra. Leia se precisar; nunca os defina.

VariávelO que guarda
listenerA tela de compra aberta, ou null.
statusA linha de problema ("Offline" ou "Tente mais tarde"), ou null.
busy, sentAtUma consulta está pendente, e quando foi enviada.
hold, heldQuanto tempo o servidor pode segurar uma consulta enquanto a tela de compra aparece (15 segundos no início, pela metade se o celular a interromper).
changedAt, limitQuando a tela mudou pela última vez, e quantos segundos ela pode ficar aberta sem mudança.
fails, nextAtConsultas que falharam seguidas, e quando a próxima pode ser enviada.
shownA primeira tela do seu app está aberta: uma compra pode abrir o desbloqueio sozinha.
quickA tela de compra abriu: a primeira consulta volta na hora.
app, wholeSuas views enquanto a tela de compra fica no lugar delas, e se gate foi usado.

Classes

ClasseO que é
PaywallViewA tela de compra. Ela desenha a tela do servidor e exibe o desbloqueio.
PaywallDelegateOs botões da tela de compra: START e BACK.
PayReplyO objeto de callback da requisição web.
PayBgSó mostradores e campos de dados: o serviço em segundo plano que consulta o servidor.

PaywallConfig

ConstanteO que é
URLObrigatório. O endereço do seu app, do seu painel.
TRIAL_DAYSApps: opcional, omita para não ter teste. Mostradores e campos de dados: obrigatório, 0 para não ter teste.

Mostradores e campos de dados

Mostradores e campos de dados usam lib/watch/face, cujo module Paywall tem chamadas próprias. active(), unlocked() e trialLeft() funcionam como acima.

ChamadaO que faz
Paywall.startTrial()A cada início, a partir de getInitialView(): inicia o teste na primeira vez e deixa uma página de login concluída acordar o segundo plano.
Paywall.schedule(false)A cada início, a partir de getInitialView(): agenda a próxima verificação em segundo plano.
Paywall.take(d)A partir de onBackgroundData(d): guarda a resposta do segundo plano e agenda a próxima verificação.
Paywall.soon()A partir de onSettingsChanged(): uma verificação assim que a Garmin permitir, e a notificação de login de novo enquanto bloqueado.
Paywall.drawQr(dc, x, y, side)Desenha o QR code com side de largura num quadrado branco, centrado em x, y. Nada antes da primeira resposta.
Paywall.book(n)Chamado pela biblioteca: agenda uma verificação em segundo plano, nunca antes de 5 minutos após a anterior.
K_SIGN"pg": chave de armazenamento da notificação de login (1 para enviar, 2 enviada).

A configuração completa está em Mostradores e campos de dados.

Testes

  • Defina TRIAL_DAYS em PaywallConfig, igual ao teste grátis do seu painel. Omita para não ter teste: aí "Teste encerrado" nunca aparece.
  • O teste começa na primeira abertura. Paywall.unlocked() é true até ele terminar.
  • Reinstalar nunca o reinicia. Nosso servidor conta o período de teste desde a primeira vez que viu aquele relógio, e a contagem dele substitui a do relógio na primeira resposta.
  • Atrasar a hora não estica o prazo. O servidor envia o tempo restante, não uma data, e o relógio nunca conta mais dias que TRIAL_DAYS.
  • O título da tela de compra mostra "Faltam 7 dias", depois "Último dia", depois "Teste encerrado".

Um teste que seu app conta

Para um teste por uso em vez de dias, omita TRIAL_DAYS, mantenha seu próprio contador no armazenamento (e através de "Excluir dados") e verifique active():

source/MainDelegate.mc
// 20 free sessions, then Premium
if (Paywall.active() || sessionsUsed < 20) {
    startSession();
} else {
    Paywall.open();
}

O que a biblioteca guarda

  • Apps: "pa" (a resposta), "pp" (quando "pago" foi confirmado pela última vez), "ts" (o fim do teste) e "te" ("Teste encerrado" exibido).
  • Mostradores e campos de dados: "pa", "pp", "ts" e "pg", mais a propriedade unlock para o link nas configurações.
  • Use outros nomes para suas próprias chaves.
Esc