"react-native-iap": "4.5.4",
"react-native": "0.61.4",
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>
);
}
}
Я обновил 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
но мне не удалось получить с ним какой-либо продукт.
@Kalesberg Не могли бы вы поместить android logcat, где он запускает purchaseUpdatedListener
?
Скажите, пожалуйста, что будет в billingResult
и purchases
.
@hyochan , надеюсь, это поможет
действительно с нетерпением жду выхода этого патча
Я пытаюсь разобраться в этом сейчас. Кстати, можете ли вы дать мне лучший формат файла? rtf
файл трудно открыть в моем окружении, которое составляет chromeos
. Вы также можете отправить мне электронное письмо ([email protected]), если считаете, что у него есть проблемы с конфиденциальностью.
@Kalesberg Вы также можете проверить это. https://stackoverflow.com/questions/56744971/google-play-billing-library-developer-error-code-5-if-i-want-to-consume-or-ackno
@hyochan
Означает ли это, что с этим плагином все в порядке?
версия для iOS работает нормально, но проблематичны только телефоны Android
Мы только выясняем проблему. Однако, следуя предоставленному вами logcat, мне кажется, что acknowledgePurchase
который равен finishTransaction
, не работал должным образом, так как покупка была в эфире. Я поделился stackoverflow, в котором также говорится о подобной ситуации.
@hyochan
проблема сохраняется даже в тестовом режиме подписки, который всегда должен быть успешным
@hyochan , какие-нибудь обновления по плагину?
Самый полезный комментарий
О, я вижу. У вас проблема со следующим событием подписки. Позвольте мне проверить это и вернуться.