"react-native-iap": "4.5.4",
"react-native": "0.61.4",
Android ، لم يتم اختباره على iOS
يتم تشغيل PurchaseUpdatedListener في كل مرة يتم فيها استلام عملية شراء
يتم إطلاق buyUpdatedListener مرة واحدة فقط للإيصال الأول ، ثم لا يحدث شيء
جهاز حقيقي ، يعمل في dev env مع اختبار google account (يتكرر الاشتراك كل 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 لكنها لم تساعد.
بعد الاصطدام برد الفعل الأصلي- iap إلى 4.6.3 لا تغيير.
لدي نفس المشكلة بالضبط ، اعتدت أن تكون على 4.4.9 ، صدمت إلى 4.6.3 وما زالت تحدث
هل كنت قادرًا على إصلاحه أو هل توصلت إلى حل بديل؟
للأسف ليس لدي حل لهذا.
هذا غريب جدا. هل تقول أنك تحاول الشراء مرة أخرى بعد عملية الشراء الأولى ، فإن purchaseUpdatedListener
لم يتم إطلاقه؟ لقد اختبرت هذا سابقًا ويجب أن يستمر في إطلاق النار حتى تقتل المستمع.
حسنا أرى ذلك. أنت تواجه مشكلة في حدث الاشتراك التالي. اسمحوا لي أن أختبر هذا وأعود.
نواجه نفس المشكلة ، كنت أستخدم 4.4.9 وحاولت الرجوع إلى إصدار أقدم والترقية إلى الإصدار 5.1.1 الأحدث ولكن النتيجة لا تزال كما هي. فقط الحصول على الحدث لأول مرة.
أي حل لهذا؟
كحل مؤقت ، أحفظ الإيصال الأول من حدث الاشتراك وأتحقق من صحته عند تهيئة كل تطبيق - إنه يعمل ، لكنني اختبرته فقط لنظام Android.
مرحبًاhyochan
أي فكرة متى سيتم حل هذا؟
شكرا
شكرا للتذكير! سأختبر هذا غدا.
تضمين التغريدة
أعلم أنك ما زلت تعمل على حل المشكلة ، أردت فقط معرفة تاريخ التصحيح التالي لهذه المشكلة لأن فريقنا بأكمله ينتظر هذه المشكلة.
شكرا لك
Kalesberg سأجرب بالتأكيد هذا الأسبوع وأشارك التحديثات. ومع ذلك ، يتم استخدام هذه المكتبة من قبل العديد من الآخرين ولم يتغير التنفيذ على purchaseUpdatedListner
منذ ذلك الحين. قد أضطر إلى تقديم مثال قابل للتكرار أولاً. سأحاول هذا الأسبوع.
ذات صلة بـ iOS
في # 1160
تضمين التغريدة
نقدر ذلك!!
Kalesberg هل يمكنك التفضل بالتحقق من android.test.purchased
عدة مرات أيضًا؟
@ 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
تضمين التغريدة
هل هذا يعني أنه لا يوجد خطأ في هذا البرنامج المساعد؟
يعمل إصدار iOS بشكل جيد ولكن الهواتف التي تعمل بنظام Android فقط هي التي تمثل مشكلة
نحن فقط نكتشف المشكلة. ومع ذلك ، باتباع logcat الذي قدمته ، يبدو لي أن acknowledgePurchase
وهو finishTransaction
لم يعمل بشكل صحيح منذ أن كانت عملية الشراء على الهواء. لقد شاركت نظام Stackoverflow الذي يتحدث أيضًا عن الموقف المماثل.
تضمين التغريدة
استمرت المشكلة حتى في وضع الاشتراك التجريبي الذي يجب أن ينجح دائمًا
hyochan ، أي تحديثات على البرنامج المساعد؟
التعليق الأكثر فائدة
حسنا أرى ذلك. أنت تواجه مشكلة في حدث الاشتراك التالي. اسمحوا لي أن أختبر هذا وأعود.