React-native-iap: getAvailablePurchases no iOS permite que apareça uma caixa de diálogo "Sign in to iTunes Store"

Criado em 1 out. 2019  ·  21Comentários  ·  Fonte: dooboolab/react-native-iap

Versão do react-native-iap

3.4.13

Versão do react-native

0,60,5

Plataformas em que você enfrentou o erro (IOS ou Android ou ambos?)

iOS

Comportamento esperado

getAvailablePurchases não tem efeitos colaterais

Comportamento real

Chamar getAvailablePurchases no iOS permite que apareça uma caixa de diálogo "Sign in to iTunes Store".

Isso não acontece no Android.

IMG_0020

Estou chamando getAvailablePurchases durante o início do aplicativo para restaurar os itens comprados. Pela documentação eu entendi que essa é a forma comum, certo?

Para restaurar os itens comprados, estou chamando getAvailablePurchases base nas alterações do AppState . Infelizmente, o AppState não é acionado apenas na inicialização do aplicativo, mas também p.ex. após retornar ao aplicativo de uma caixa de diálogo (causada pelo aplicativo) p.ex. Faça login no iTunes ... :(

Para o usuário, isso é incomodativo. Especialmente se o usuário não tiver a intenção de comprar algo, ele não gostaria de inserir suas credenciais para se livrar desta caixa de diálogo.

Ambiente testado (emulador? Dispositivo real?)

dispositivo real

Passos para reproduzir o comportamento

chame getAvailablePurchases

❓ question 📱 iOS 🙏 help wanted 🚶🏻 stale

Comentários muito úteis

Existe uma maneira de saber antes de chamar getAvailablePurchases que o prompt aparecerá? Ou seja, como posso detectar se o usuário está conectado ao iTunes ou não?

Todos 21 comentários

Quando em desenvolvimento, isso mostra que você pode fazer o login com sua conta sandbox. Não acredito que os documentos sejam muito claros sobre isso.

Acho que para produção também pode mostrar um prompt sempre que chamar essa função, certo? A maneira como implementei isso é que chamo isso quando o usuário pressiona "restaurar compra" e depois que purchaseUpdatedListener é chamado. Para saber se o usuário tem uma assinatura no futuro, eu a armazeno no back-end e a apresento para o aplicativo.

Ei, @voxspox, @alexpchin está certo. @alexpchin Como estamos trabalhando na ponte, presumimos que as pessoas podem saber um pouco sobre IAP em nativo. Colocar todas as coisas que já existem em cada plataforma é um fardo para os mantenedores. Se houver trabalhos no documento que você acha que podem ser úteis, sinta-se à vontade para adicionar qualquer coisa e enviar PR .

@mifi Nunca vi um aplicativo com o botão "restaurar minhas compras". Do ponto de vista da experiência do usuário, esse botão é um fardo e também desnecessário, porque o aplicativo deve saber o que eu comprei;)

@hyochan também recebo o prompt após distribuir o aplicativo por meio do TestFlight (presumo que este seja o modo de produção ?!)

Eu vi alguns aplicativos com essa função. Não me lembro bem agora, mas acho que é necessário (ou exigido pela apple) em alguns casos. Também nos exemplos de diretrizes da loja de aplicativos da Apple, eles têm este botão:
https://developer.apple.com/app-store/subscriptions/

Além disso, achei que seria uma experiência de usuário ruim se o usuário precisasse inserir seu Apple ID ao abrir meu aplicativo, acho que seria confuso. (Já vi isso acontecer antes se a sessão expirar ou algo acontecer com SSL MITM, o que costuma ser o caso com páginas de destino wi-fi públicas)

editar: na verdade parece que a apple requer isso

Existe uma maneira de saber antes de chamar getAvailablePurchases que o prompt aparecerá? Ou seja, como posso detectar se o usuário está conectado ao iTunes ou não?

1+ mesmo

Olá pessoal, alguma resposta sobre isso? como eu entendo que esta é uma funcionalidade de depuração, mas estou testando com o testflight e quero evitar que isso aconteça, é possível sair do modo sandbox de alguma forma?

Enquanto isso, encontrei uma solução para mim. Eu introduzi uma nova variável isRestorePurchasesEnabled que é armazenada permanentemente pelo meu aplicativo.

Iniciar:

isRestorePurchasesEnabled = false

Ao iniciar o aplicativo:

if (Android || isRestorePurchasesEnabled) {
  call getAvailablePurchases
  on error.code === 'E_USER_CANCELLED' -> isRestorePurchasesEnabled= false
}

Na compra:

isRestorePurchasesEnabled = true
requestSubscription ...

Configurações:

Button "restore purchases" -> isRestorePurchasesEnabled = true

O usuário nunca verá o prompt de conexão do iTunes novamente. A restauração só acontece após a compra ter sido feita e assim as credenciais já foram digitadas + armazenadas e o prompt não será mostrado.
O único caso em que o prompt será mostrado, mas apenas uma vez, é se o usuário fizer logout em Configurações / iTunes / Conta Sandbox. Não sei se isso está lá no modo de produção.

Olá, parece que não houve nenhuma atividade sobre este problema recentemente. O problema foi corrigido ou ainda requer a atenção da comunidade? Este problema pode ser resolvido se nenhuma outra atividade ocorrer. Você também pode rotular esse problema como "Para discussão" ou "Bom primeiro problema" e eu o deixarei em aberto. Obrigado por suas contribuições.

Olá,
Estou muito confuso sobre um assunto, alguém pode me ajudar?
Quero construir um controlador que verifique se o usuário ainda possui o produto ou não?
Como posso detectar o cancelamento do usuário usando esta biblioteca para apple e google play store?
Eu nem sei se está relacionado a esse método getAvailablePurchase.
Obrigado.

  • mesmo

Eu gostaria de descobrir se isso também aconteceria na produção, em vez de apenas no TestFlight.
No momento, estamos usando esta função enquanto o aplicativo é carregado, em vez de pressionar um botão.

A Apple ainda nos aconselha a não chamar essa função no aplicativo automaticamente ou inicializar

Não restaure compras automaticamente, especialmente quando seu aplicativo é iniciado. Restaurar as compras solicita as credenciais da App Store do usuário, o que interrompe o fluxo do seu aplicativo.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text = Restore% 20Completed% 20Transactions, de% 20your% 20app's% 20completed% 20transactions.

A maneira que implementei é enviar o recibo para o back-end quando o usuário pressiona a compra ou restaura a compra. Em seguida, o back-end pode fornecer ao aplicativo o status da assinatura no futuro.

A Apple ainda nos aconselha _não_ para chamar esta função no aplicativo automaticamente ou inicializar

Não restaure compras automaticamente, especialmente quando seu aplicativo é iniciado. Restaurar as compras solicita as credenciais da App Store do usuário, o que interrompe o fluxo do seu aplicativo.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text = Restore% 20Completed% 20Transactions, de% 20your% 20app's% 20completed% 20transactions.

A maneira que implementei é enviar o recibo para o back-end quando o usuário pressiona a compra ou restaura a compra. Em seguida, o back-end pode fornecer ao aplicativo o status da assinatura no futuro.

Para uma assinatura de renovação automática, como você obtém o recibo mais recente sem fazer upload do cliente?

Executando uma pesquisa periódica no back-end que valida periodicamente todas as compras como esta, pegue o recibo mais recente da validação (que vem do servidor google / apple) e salve-o de volta no banco de dados.

Executando uma pesquisa periódica no back-end que valida periodicamente todas as compras como esta, pegue o recibo mais recente da validação (que vem do servidor google / apple) e salve-o de volta no banco de dados.

Olá @mifi, obrigado pela resposta rápida! Eu armazenei latestReceipt no servidor após a transação original. Portanto, ao pesquisar com o latestReceipt um novo latestReceipt é retornado?

Sim, a função iap.validate no back-end chamará as apis apple / google que retornarão o recibo mais recente. isso pode ser visto facilmente ao testar assinaturas renováveis ​​com um intervalo de desenvolvimento (5 minutos por período de assinatura)

Obrigado @mifi Isso realmente ajudou a minha compreensão! Pareceu estranho enviar o "latestReceipt" para receber o "latestReceipt"

Olá, parece que não houve nenhuma atividade sobre este problema recentemente. O problema foi corrigido ou ainda requer a atenção da comunidade? Este problema pode ser resolvido se nenhuma outra atividade ocorrer. Você também pode rotular esse problema como "Para discussão" ou "Bom primeiro problema" e eu o deixarei em aberto. Obrigado por suas contribuições.

Encerrando este problema após um período prolongado de inatividade. Se esse problema ainda estiver presente na versão mais recente, sinta-se à vontade para criar um novo problema com informações atualizadas.

Esta página foi útil?
0 / 5 - 0 avaliações