React-native-iap: buySubscription ignorando feedback do usuário

Criado em 6 out. 2018  ·  32Comentários  ·  Fonte: dooboolab/react-native-iap

Versão do react-native-iap

2.3.0

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

Android

Comportamento esperado

let sub = await RNIApp.buySubscription ("some");

deve esperar que o usuário pressione comprar no modal de pagamentos no aplicativo

Comportamento real

Não consigo verificar se o usuário aceitou a assinatura, pois ao fazer:

let sub = await RNIApp.buySubscription ("some");
if (sub) {
fazer algumas coisas ..
}

o bloco if (sub) é executado imediatamente após a abertura do pop-up, mas o usuário ainda não aceita a inscrição

Ambiente testado (emulador? Dispositivo real?)

Dispositivo real

Alguma ideia?

Existem outros métodos, como getAvailablePurchases, que também retorna uma promessa e funciona bem

O problema é que buySubscription deve retornar o retorno de chamada da entrada do usuário e não é

⌚️ regression 📱 iOS

Comentários muito úteis

No momento, estamos trabalhando nisso. Além disso, qualquer pessoa que esteja enfrentando isso, você chamou getSubscriptions antes de realmente chamar buySubscription ?

Todos 32 comentários

Estou usando RN 57, também, a assinatura é feita, posso verificar na playstore se a compra está ok, mas a promessa buySubscription está retornando indefinida

qualquer ajuda?

Bem, eu faço o downgrade para 2.2.2 e funciona ... então acho que vocês perderam algo em seu novo lançamento

@ marcosmartinez7 Desculpe pela quebra, você poderia tentar 2.3.1 ?

Oi obrigado!

Eu não tenho tempo agora, mas vou

@ marcosmartinez7 Obrigado, volte.

O @dooboolab Issue também está presente no iOS. Tentei 2.3.1 e também 2.3.2 . Conforme mencionado por @ marcosmartinez7 2.2.2 funciona bem

Acho que está corrigido em 2.3.3 . Reabra quando isso ainda estiver ocorrendo.

@dooboolab Desculpe, acabei de instalar e vincular novamente 2.3.5 . await RNIap.buySubscription(iapProductId) ainda retorna undefined imediatamente no iOS

@ Gaia-Nutrition Acho que seu problema é diferente porque o código ios não mudou. Você poderia tentar desvincular e vincular novamente?

@dooboolab Eu tentei vincular e desvincular. Sempre que eu mudo de volta para 2.2.2 ele começa a funcionar novamente. Mas vou verificar novamente amanhã. Talvez eu tente instalar manualmente o componente nativo

@dooboolab Ok, agora 2.3.6 . Ainda recebendo undefined . Eu adoraria ajudar a resolver esse problema. Deixe-me saber o que posso fazer para ajudar!

Alguém pode confirmar isso? Isso não deve acontecer especialmente no iOS.

@dooboolab posso confirmar que no iOS versão 2.3.6 não executa as promessas, mas a versão 2.2.2 sim (usando um dispositivo iPhone 5, React Native 0.56)

Também estou enfrentando esse problema em 2.3.7. Quando tento usar await a próxima linha é chamada imediatamente ao invés de esperar pela promessa, e quando eu uso RNIap.buySubscription(subId).then(purchase => {}) ele trava com erro não pode ler propriedade então de indefinido

No momento, estamos trabalhando nisso. Além disso, qualquer pessoa que esteja enfrentando isso, você chamou getSubscriptions antes de realmente chamar buySubscription ?

Acabei de testar a compra no aplicativo RNExample. Comprei uma assinatura com o método buyProductWithoutFinishTransaction ().
Sugiro testar como RNExample. E atualizar o Xcode, construir a configuração para 'legado' .. Acho que o processo de construção no Xcode mudou esta atualização.
E use o testador de sandbox recém-feito.

@JJMoon muito interessante. A combinação de buyProductWithoutFinishTransaction() e finishTransaction() funciona em 2.3.7 enquanto buySubscription() diretamente ainda falha!

@ Gaia-Nutrition OK. Em seguida, use buyProductWithoutFinishTransaction e finishTransaction vez de buySubscription . A ação de compra é exatamente a mesma.

@ Gaia-Nutrition Você pode tentar 2.3.8 ? Além disso, você chamou getSubscriptions antes de buySubscription ?

@dooboolab 2.3.8 ainda falha usando buySubscription e novamente: Sim, eu chamei getSubscriptions antes. Não acho que buyProductWithoutFinishTransaction() funcionaria de outra forma.

Testei buySubscription no dispositivo iOS no modo sandbox.
Conseguiu sucesso, mas mostra alguma mensagem de erro.
E a assinatura renovável automática não emite recibo.
Eu sugiro usar buyProductWithoutFinishTransaction e finishTransaction em vez de buySubscription.
Atualmente não tenho nenhum dispositivo para teste, rastrearei esse problema mais tarde.

Parece que este é apenas um problema em iOS atualmente. Estou certo?

@dooboolab Não, também ocorrendo no Android. A função retorna undefined mesmo antes de a primeira linha em buyItemByType ser chamada.

@dooboolab O problema é causado no index.js: 105. Você deve alterar as linhas para algo como

export const buySubscription = (sku, oldSku, prorationMode) => Platform.select({ ios: () => RNIapIos.buyProduct(sku), android: () => RNIapModule.buyItemByType(ANDROID_ITEM_TYPE_SUBSCRIPTION, sku, oldSku, -1), })();
(Eu sei que isso ignora prorationMode)

No entanto, após a assinatura com sucesso, há um problema:

E/UncaughtException: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference at com.dooboolab.RNIap.RNIapModule$11.onPurchasesUpdated(RNIapModule.java:427) at com.android.billingclient.api.BillingClientImpl$1.onReceive(BillingClientImpl.java:136) at com.android.billingclient.api.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:303) at com.android.billingclient.api.LocalBroadcastManager.access$000(LocalBroadcastManager.java:44) at com.android.billingclient.api.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:114) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6938) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

@mfentross Em qual versão de react-native-iap você está? Há uma linha vazia em RNIapModule.java:427 . Por favor, tente novamente para o mais recente.

Culpa minha: editei algumas linhas. Mas a solução para o problema principal é editar a função buySubscription para

`
export const buySubscription = (sku, oldSku, prorationMode) =>
Platform.select ({
ios: () => RNIapIos.buyProduct (sku),
android: () => {
if (! prorationMode) prorationMode = -1;
return RNIapModule.buyItemByType (ANDROID_ITEM_TYPE_SUBSCRIPTION, sku, oldSku, prorationMode);
},
}) ();

`

Havia alguns colchetes desnecessários.

@mfentross meu mal. Perdi a instrução return . Acabei de publicar em 2.3.11 . Então agora o android está funcionando?

@dooboolab Obrigado, agora funciona 👍

@mfentross @JJMoon Ok! Portanto, temos apenas o problema do iOS.

@JJMoon Ele diz que se envolver o método com async e await , ele funciona. No entanto, não tenho certeza de como isso poderia ser possível. Empacotar com async e await é redundante no valor de retorno, não é?

Publiquei para 2.3.13 . Espero que todos vocês experimentem isso.

Reabra quando isso ainda estiver ocorrendo. Obrigado por todas as ajudas.

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