React-native-iap: buySubscription não resolve ao alterar assinaturas no iOS

Criado em 26 set. 2018  ·  14Comentários  ·  Fonte: dooboolab/react-native-iap

Versão do react-native-iap

2.2.2

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

iOS

Comportamento esperado

buySubscription deve ser resolvido ao mudar de assinatura mensal para anual, em vez de rejeitar e retornar um erro, forçando a cláusula catch.

Comportamento real

Se estiver atualmente inscrito em um plano, mudar para outro fará com que buySubscription detecte e retorne o seguinte erro:
screen shot 2018-09-27 at 1 21 10 am

Ambiente testado (emulador? Dispositivo real?)

Dispositivo real, iPhone 6

Passos para reproduzir o comportamento

Isso ocorre quando as caixas de diálogo de modificação de assinatura aparecem no aplicativo, perguntando se você gostaria de mudar de sua assinatura atual para a recém-selecionada. Ao tocar nesta caixa de diálogo, o erro é lançado em vez da promessa resolvida esperada. Parece que este caso de uso não foi contabilizado ou algo assim.

Isso está quebrando para mim agora porque não há como confirmar se eles realmente compraram ou validar os recibos para esses casos. Informe-nos se souber de uma solução alternativa ou solução, ou se houver algo que eu possa fazer para ajudar (embora eu não tenha experiência com Obj-C). A única solução possível em que posso pensar agora é se buySubscriptions retorna um erro, verificando esse erro e se ele corresponde a esse erro, em seguida, confirmando a compra. Mas isso é muito perigoso, pois torna a validação do recibo impossível e algum outro erro (como incapacidade de se conectar ao servidor ou algo assim) pode produzir o mesmo código de erro, dando ao usuário a assinatura sem realmente ter que pagar por isso. Em outras palavras, não consigo pensar em nenhuma solução alternativa viável no momento. Estou faltando alguma coisa aqui? Há algum motivo para eu não precisar que a promessa de buySubscriptions seja resolvida? Ficaria muito grato em ouvir de alguém.

EDITAR : isso pode ser uma consequência óbvia do que já descrevi, mas depois de tentar modificar sua assinatura, esta compra não é adicionada ao seu histórico de compras. Não há nenhuma indicação do lado do usuário de que esta compra não está sendo bem-sucedida - o usuário prossegue com o fluxo de compra das caixas de diálogo com êxito, concluindo com uma dizendo "Está tudo pronto".

EDIT2 : Às vezes funciona, mas ainda não tenho certeza de como reproduzir, informarei se eu encontrar uma maneira. Quando funciona, a primeira caixa de diálogo solicita minha senha e prossegue normalmente como se eu ainda não tivesse outra assinatura, ao contrário de quando a primeira caixa de diálogo é "Confirmar compra" e pergunta se eu quero modificar minha assinatura, que é o que aparece quando não está funcionando. Quando funciona, a assinatura adquirida é adicionada ao meu histórico de compras conforme o esperado.

EDIT3 : Eu tirei uma foto da mensagem de erro errada antes. Eu agora corrigi. A mensagem de erro diz: "Erro: ocorreu um erro desconhecido ou inesperado. Tente novamente mais tarde." Além disso, você pode querer considerar o método usado para comprar produtos em react-native-in-app-utils. Eles usam um método diferente e as diferenças podem ajudar a explicar por que isso está acontecendo, embora eu não tenha usado essa biblioteca e por isso não posso confirmar que isso não aconteceria lá.

🍗 enhancement 🐛 bug 📱 iOS

Comentários muito úteis

Pesquisei novamente hoje e acho que encontrei algo digno de nota. O que parece estar acontecendo é o que foi encontrado neste erro: https://github.com/bizz84/SwiftyStoreKit/issues/269. Ao alternar entre assinaturas de renovação automática no mesmo grupo, a transação não é realizada porque o usuário não será cobrado até que a assinatura atual expire. Mas ele foi registrado com sucesso e o pagamento será processado assim que a assinatura atual terminar, mas não antes disso. Portanto, o retorno da transação falhou porque nenhuma transação está realmente ocorrendo ainda. Portanto, não acho que algo esteja realmente errado no processo de pagamento, apenas que a transação devolvida é registrada como um erro. Mas eu ainda tenho que testar isso, já que acabei de me deparar com ele e meu depurador está com problemas e está ficando tarde, então não vou tentar resolver isso até amanhã. Seria ótimo se alguém pudesse tentar confirmar nesse meio tempo (ou seja, alternando entre as assinaturas e, em seguida, ver se a transação da segunda aparece no seu histórico de compras depois que a primeira expirou ou algo assim). Se é isso o que está acontecendo, seria ótimo se pudéssemos descobrir uma maneira de lidar com isso. Se o erro que ele gera for específico para este processo, poderíamos simplesmente transmiti-lo como o valor de retorno da promessa para que possamos lidar corretamente (por exemplo, não gerar uma mensagem de erro para o usuário, atualizar as informações de inscrição do usuário). Adoraria ouvir a opinião de alguém sobre se isso é válido e como proceder.

Todos 14 comentários

Você poderia tentar a versão recente agora, que é 2.3.15 ?

Sim, vou dar uma volta em algum momento hoje

@kevinEsherick Qual é o seu resultado para este?

Ainda não funciona. Se eu tiver uma assinatura mensal e mudar para anual, ela atingirá a cláusula catch. Houve alguns momentos em que funcionou aleatoriamente, mas ainda não encontrei uma maneira de reproduzir. Vou mantê-lo atualizado sobre o que eu encontrar e, por favor, faça o mesmo por mim. Obrigado!

@kevinEsherick Como você "mudou" a assinatura? Acho que você "cancela" a assinatura mensal e "compra novamente" a assinatura anual. Isso está certo?

No iOS, você não pode trocar de assinatura acessando o aplicativo de configurações para gerenciar suas assinaturas e, em seguida, escolhendo um produto diferente dentro do mesmo grupo?

@JJMoon Não, simplesmente compro a assinatura mensal no aplicativo e, em seguida, compro a assinatura anual no aplicativo. Eles estão renovando automaticamente assinaturas no mesmo grupo de assinaturas. Se duas assinaturas (A e B) estiverem no mesmo grupo no iTunes Connect, comprar B enquanto é assinante de A deve cancelar automaticamente A e assiná-lo B. Você acha que é um problema com este pacote não suportar esta funcionalidade? Em caso afirmativo, podemos encontrar uma maneira de implementar isso?

Eu também estou enfrentando esse problema. Algum progresso?

Não. Não tive muito tempo para lidar com isso recentemente. Eu vou olhar para isso novamente em breve.

Analisando um pouco e percebi que parece que a Apple reconhece a mudança na assinatura pelo menos até certo ponto. Se eu mudar de, digamos, mensal para anual, ele mostra o modal apropriado com a linguagem sobre como modificar sua assinatura. Quando faço uma compra anual, ocorre um erro e o buySubscription não resolve. MAS, quando eu volto para fazer uma compra novamente, desta vez voltando para a assinatura mensal, a API da Apple sabe que estou na assinatura anual e mostra o modal "Quer modificar sua assinatura ..." novamente. Ainda não tenho certeza de como isso se manifesta na produção, pois isso é tudo em sandbox. Vou examinar isso em algum momento esta noite, mas isso pode significar que as coisas estão bem no lado da Apple e que é apenas um erro do lado do cliente. Se for esse o caso, pode não ser mais um bug crítico, mas ainda precisa de uma correção.

Pesquisei novamente hoje e acho que encontrei algo digno de nota. O que parece estar acontecendo é o que foi encontrado neste erro: https://github.com/bizz84/SwiftyStoreKit/issues/269. Ao alternar entre assinaturas de renovação automática no mesmo grupo, a transação não é realizada porque o usuário não será cobrado até que a assinatura atual expire. Mas ele foi registrado com sucesso e o pagamento será processado assim que a assinatura atual terminar, mas não antes disso. Portanto, o retorno da transação falhou porque nenhuma transação está realmente ocorrendo ainda. Portanto, não acho que algo esteja realmente errado no processo de pagamento, apenas que a transação devolvida é registrada como um erro. Mas eu ainda tenho que testar isso, já que acabei de me deparar com ele e meu depurador está com problemas e está ficando tarde, então não vou tentar resolver isso até amanhã. Seria ótimo se alguém pudesse tentar confirmar nesse meio tempo (ou seja, alternando entre as assinaturas e, em seguida, ver se a transação da segunda aparece no seu histórico de compras depois que a primeira expirou ou algo assim). Se é isso o que está acontecendo, seria ótimo se pudéssemos descobrir uma maneira de lidar com isso. Se o erro que ele gera for específico para este processo, poderíamos simplesmente transmiti-lo como o valor de retorno da promessa para que possamos lidar corretamente (por exemplo, não gerar uma mensagem de erro para o usuário, atualizar as informações de inscrição do usuário). Adoraria ouvir a opinião de alguém sobre se isso é válido e como proceder.

Espero que esse problema possa ser resolvido pelos métodos que mencionei.
Fechando ...

Tem o mesmo comportamento, alguma providência para resolver isso?

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