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 para | Um app pago por inteiro | Um app que vende alguns recursos |
| Na abertura, bloqueado | A tela de compra no lugar do seu app | Seu app, como sempre |
| Durante um teste | Seu app, como sempre | Seu app, como sempre |
| Quando o teste termina | A 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 compra | Sai do app | Vai para o seu app |
| Depois de pago | BACK ou START abre suas views | BACK ou START vai para o seu app |
| Cada recurso pago | Nada a adicionar | Verifica 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.
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()etrialLeft(). 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
| Chamada | Retorna | O que faz | Funciona em |
|---|---|---|---|
Paywall.gate(views) | As views a retornar | Em 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 retornar | Em 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() | Boolean | Pago, ou no teste (todo ele, inclusive antes de começar). A verificação para cada recurso pago. | App, glance |
Paywall.active() | Boolean | Pago, 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() | Number | Dias 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() | PaywallView | Abre 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() | Array | As chaves de armazenamento que seu "Excluir dados" precisa manter: "pp", "ts" e "te". | App |
Paywall.startTrial() | Void | Chamada antiga. Inicia o teste por tempo na primeira abertura; nada sem TRIAL_DAYS. gate e start a chamam. | App |
Paywall.launch() | Void | Chamada 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() | Void | Chamada 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ção | O 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
| Constante | Valor | O 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. |
STALE | 2592000 | 30 dias em segundos: quanto tempo o "pago" vale sem nova resposta do servidor. |
DAY | 86400 | Um dia em segundos. |
Variáveis do módulo
O estado da própria tela de compra. Leia se precisar; nunca os defina.
| Variável | O que guarda |
|---|---|
listener | A tela de compra aberta, ou null. |
status | A linha de problema ("Offline" ou "Tente mais tarde"), ou null. |
busy, sentAt | Uma consulta está pendente, e quando foi enviada. |
hold, held | Quanto 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, limit | Quando a tela mudou pela última vez, e quantos segundos ela pode ficar aberta sem mudança. |
fails, nextAt | Consultas que falharam seguidas, e quando a próxima pode ser enviada. |
shown | A primeira tela do seu app está aberta: uma compra pode abrir o desbloqueio sozinha. |
quick | A tela de compra abriu: a primeira consulta volta na hora. |
app, whole | Suas views enquanto a tela de compra fica no lugar delas, e se gate foi usado. |
Classes
| Classe | O que é |
|---|---|
PaywallView | A tela de compra. Ela desenha a tela do servidor e exibe o desbloqueio. |
PaywallDelegate | Os botões da tela de compra: START e BACK. |
PayReply | O objeto de callback da requisição web. |
PayBg | Só mostradores e campos de dados: o serviço em segundo plano que consulta o servidor. |
PaywallConfig
| Constante | O que é |
|---|---|
URL | Obrigatório. O endereço do seu app, do seu painel. |
TRIAL_DAYS | Apps: 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.
| Chamada | O 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_DAYSemPaywallConfig, 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():
// 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 propriedadeunlockpara o link nas configurações. - Use outros nomes para suas próprias chaves.