React-native-iap: [Android] PurchaseUpdatedListener запускается только один раз, а не при каждой транзакции подписки

Созданный на 21 сент. 2020  ·  27Комментарии  ·  Источник: dooboolab/react-native-iap

Версия react-native-iap

"react-native-iap": "4.5.4",

Версия react-native

"react-native": "0.61.4",

Платформы, на которых вы столкнулись с ошибкой (IOS или Android или оба?)

Android, не тестировался на iOS

Ожидаемое поведение

buyUpdatedListener запускается каждый раз при получении покупки

Фактическое поведение

buyUpdatedListener запускается только один раз для первого получателя, затем ничего не происходит

Протестированная среда (Эмулятор? Настоящее устройство?)

Настоящее устройство, запустите в dev env с тестовой учетной записью Google (подписка повторяется каждые 5 минут - электронная почта приходит, а квитанция нет).

Упрощенный код, который я использую:

import React from 'react';
import { Text, View, TouchableOpacity, Alert } from 'react-native';
import RNIap, {
  purchaseUpdatedListener,
  purchaseErrorListener,
} from 'react-native-iap';

import { SpinnerOverlay } from '../components/SpinnerOverlay';

import { itemSkus } from '../config/in-app';
import { validateRecipt } from '../utils/validateRecipt';
import { logger } from '../utils/logger';

export class SubscriptionScreenInner extends React.Component {
  purchaseUpdateSubscription = null;
  purchaseErrorSubscription = null;

  constructor(props) {
    super(props);
    this.state = {
      products: [],
      productsLoaded: false,
      isProcessing: false
    };
  }

  componentDidMount = async () => {
    try {
      if (itemSkus) {
        await RNIap.initConnection();
        await RNIap.flushFailedPurchasesCachedAsPendingAndroid();
        const products = await RNIap.getSubscriptions(itemSkus);
        this.setState({ products, productsLoaded: true });

        this.purchaseUpdateSubscription = purchaseUpdatedListener(
          async (purchase) => {
            try {
              const receipt = purchase.transactionReceipt;
              if (receipt) {
                const validate = await validateRecipt(purchase);

                if (validate) {
                  await RNIap.finishTransaction(purchase, false);
                  this.props.fetchUserProfile();
                  this.resetScreenState();
                  Alert.alert('receipt validated', 'cool');
                }
              }
            } catch (error) {
              this.resetScreenState();
              logger('Validate recipt error', error);
            }
          }
        );

        this.purchaseErrorSubscription = purchaseErrorListener((error) => {
          this.resetScreenState();
          logger('Purchase error during loading', error);
        });
      }
    } catch (error) {
      logger('Store prroducts error', error);
    }
  };

  componentWillUnmount() {
    if (this.purchaseUpdateSubscription) {
      this.purchaseUpdateSubscription.remove();
    }

    if (this.purchaseErrorSubscription) {
      this.purchaseErrorSubscription.remove();
    }

    RNIap.endConnection();
  }

  requestSubscription = async (sku) => {
    this.setState({ isProcessing: true }, async () => {
      await RNIap.requestSubscription(sku);
    });
  };

  resetScreenState = () => {
    this.setState({ isProcessing: false });
  };

  render() {
    const { products, productsLoaded, isProcessing } = this.state;

    if (!productsLoaded || isProcessing) {
      return (
        <View>
          <SpinnerOverlay />
        </View>
      );
    }

    return (
      <View>
        <View>
          <View>
            <View>
              <Text>Buy monthly subscription</Text>
            </View>

            <View>
              <TouchableOpacity onPress={() => this.requestSubscription(products[0].productId)}>
                <Text>Buy</Text>
              </TouchableOpacity>
            </View>
          </View>
        </View>
      </View>
    );
  }
}
🙏 help wanted 🤖 android 🧪 test

Самый полезный комментарий

О, я вижу. У вас проблема со следующим событием подписки. Позвольте мне проверить это и вернуться.

Все 27 Комментарий

Я обновил React Native до 0.63.2, но это не помогло.

После наталкивания на response-native-iap до 4.6.3 никаких изменений.

У меня точно такая же проблема, раньше была на 4.4.9, поднялась до 4.6.3 и все еще возникает
Удалось ли вам это исправить или вы нашли обходной путь?

К сожалению, у меня нет решения для этого.

Это очень странно. Вы говорите, что пытаетесь совершить покупку снова после первой покупки, но purchaseUpdatedListener не срабатывает? Я тестировал это ранее, и он должен продолжать работать, пока вы не убьете слушателя.

О, я вижу. У вас проблема со следующим событием подписки. Позвольте мне проверить это и вернуться.

Мы столкнулись с той же проблемой, я использовал 4.4.9 и пытался перейти на более раннюю версию 5.1.1, но результат все тот же. Только получение события в первый раз.

какое решение для этого?

В качестве временного решения я сохраняю первую квитанцию ​​от события подписки и проверяю ее при каждой инициализации приложения - она ​​работает, но я тестировал ее только для Android.

Привет @hyochan
Есть идеи, когда это будет решено?

Благодарность

Спасибо за напоминание! Я проверю это завтра.

@hyochan
Я знаю, что вы все еще работаете над этой проблемой, просто хотел узнать о дате следующего патча для этой проблемы, так как вся наша команда ждет этого.
Спасибо

@Kalesberg Я обязательно попробую на этой неделе и поделюсь обновлениями. Однако эта библиотека используется многими другими, и реализация на purchaseUpdatedListner тех пор не менялась. Возможно, мне сначала придется привести воспроизводимый пример. Попробую на этой неделе.

Связанные с iOS в # 1160

@hyochan
Ценить это!!

@Kalesberg. Не могли бы вы проверить, что android.test.purchased также срабатывает несколько раз?

@hyochan сделает это!

@hyochan
Наш продукт предназначен только для подписки, поэтому android.test.purchased не может быть лучше всего подтверждено.
Итак, я попытался использовать ваше демонстрационное приложение в этой библиотеке и добавил test.sub1 но мне не удалось получить с ним какой-либо продукт.
Screenshot 2020-11-04 at 6 53 06 PM

@Kalesberg Не могли бы вы поместить android logcat, где он запускает purchaseUpdatedListener ?

Скажите, пожалуйста, что будет в billingResult и purchases .

@hyochan , надеюсь, это поможет
действительно с нетерпением жду выхода этого патча

Я пытаюсь разобраться в этом сейчас. Кстати, можете ли вы дать мне лучший формат файла? rtf файл трудно открыть в моем окружении, которое составляет chromeos . Вы также можете отправить мне электронное письмо ([email protected]), если считаете, что у него есть проблемы с конфиденциальностью.

@hyochan
Означает ли это, что с этим плагином все в порядке?

версия для iOS работает нормально, но проблематичны только телефоны Android

Мы только выясняем проблему. Однако, следуя предоставленному вами logcat, мне кажется, что acknowledgePurchase который равен finishTransaction , не работал должным образом, так как покупка была в эфире. Я поделился stackoverflow, в котором также говорится о подобной ситуации.

@hyochan
проблема сохраняется даже в тестовом режиме подписки, который всегда должен быть успешным

@hyochan , какие-нибудь обновления по плагину?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги