3.3.9 (ولكن اختبر هذا أيضًا في 3.0.0 وما قبله)
0.59.9
iOS (لم يتم اختباره على Android)
نفس المصفوفة في كل مرة أتصل فيها بـ getAvailablePurchases
طول الصفيف نفسه في كل مرة
مصفوفة مختلفة في كل مرة أتصل فيها بـ getAvailablePurchases
طول مصفوفة مختلف في كل مرة أتصل فيها بـ getAvailablePurchases
جهاز حقيقي
أعتقد أن هذا مرئي فقط مع الكثير من المعاملات ، لكن لا يمكنني تأكيد ذلك. يحتوي حساب Sandbox الخاص بي على أكثر من 50 معاملة.
handleOnPressRestore = async () => {
return this.setState({ isLoadingRestorePurchases: true }, async () => {
try {
// Get the previous purchases of the current user
const purchases = await RNIap.getAvailablePurchases();
// Get the latest receipt from the purchases to validate
const { transactionReceipt, productId, transactionDate } = this.getLatestPurchase(purchases);
console.log(purchases.length, productId, transactionDate);
// Validate the receipt on our server
await this.props.validateSubscriptionReceipt(productId, transactionReceipt);
// The validation result is handled in componentDidUpdate
} catch (err) {
throw err;
} finally {
this.setState({ isLoadingRestorePurchases: false });
}
});
}
getLatestPurchase = (purchases: RNIap.ProductPurchase[]): RNIap.ProductPurchase => {
// First, sort the array, so the latest purchase is on top
// https://github.com/dooboolab/react-native-iap/issues/532#issuecomment-503174711
const sortedPurchases = purchases.sort((a, b) => b.transactionDate - a.transactionDate);
const purchase = sortedPurchases[0];
return purchase;
}
باستخدام الكود أعلاه ، عندما أضغط على "استعادة الشراء" ، أحصل على سجلات مختلفة في كل مرة:
الضغط على "استعادة الشراء" 6 مرات ، مع الانتظار بينهما للسماح بظهور النتائج:
// purchases.length, productId, transactionDate
9 "com.app.sub" 1565182529000
21 "com.app.sub" 1565181329000
22 "com.app.sub" 1565183001000
42 "com.app.sub" 1565183001000
53 "com.app.sub" 1565182529000
55 "com.app.sub" 1565183001000
15 "com.app.sub" 1565182529000
أتوقع أن تكون المصفوفة هي نفسها دائمًا ، أليس كذلك؟ ماذا يحصل هنا؟
تختلف نتيجة getAvailablePurchases()
كل مرة أقوم بتشغيلها
أنا أيضا أرى هذا. الشيء الخطير حقًا في ذلك هو أن هناك احتمال ألا يكون آخر إيصال صالح في النتائج.
من خلال النظر إلى رمز الوحدات هذا ، يبدو بصراحة أنه مشكلة من جانب Apple نظرًا لأن هذه الوحدة تمر فعليًا بكل ما يعطيه restoreCompletedTransactions()
أتساءل عما إذا كان getPurchaseHistory()
بديلًا جيدًا لاستخدامه في الاشتراكات. أنا أستخدم ذلك حاليًا كبديل ، حيث يمنحني ذلك نتائج موثوقة. ليس لدي أي مشتريات أخرى في تطبيقي ، فقط اشتراكات.
كما هو مذكور في مستندات iap على هذه الحزمة ، يتحدث getAvailablePurchases()
عن المواد الاستهلاكية. الاشتراك ليس منتجًا "قابل للاستهلاك" أو "غير قابل للاستهلاك". إنه "اشتراك قابل للتجديد التلقائي" لذا من المفترض أن يفعله getPurchaseHistory()
؟
لقد وجدت أن getPurchaseHistory () أعطت أطوال مصفوفة مختلفة أيضًا. يبدو أن تواتر الطلبات نفذته. في النهاية ، اتضح أن هذا لا يهمنا حقًا ، فبمجرد إرسال أي من إيصالات المعاملة للتحقق من صحتها ، أعادت Apple جميع الإيصالات في المصفوفة latest_receipt_info
أي حال وهو كل ما يهمنا.
أواجه نفس المشكلة (لا أعرف ما إذا كان خطأ في وضع الحماية). أيضًا ، عندما أقوم بتبديل معرف Apple داخل جهاز حقيقي ، يتم إرجاع الشراء الذي تم إجراؤه باستخدام حساب آخر.
مثال:
1 - لقد أجريت عملية شراء باستخدام account [email protected]
2 - تم تبديل معرف Apple إلى [email protected]
3 - تقوم getAvailablePurchases بإرجاع معرّف المعاملة لعملية الشراء التي تمت باستخدام حساب [email protected]
هناك مشكلة أخرى وجدتها وهي أنه إذا قمت باستعادة الجهاز (إعادة ضبط المصنع) فإن كلا الطريقتين getPurchaseHistory()
و getAvailablePurchases
تعطي نتائج عشوائية
استجابة Apple لاستعادة الشراء هي:
"Users restore transactions to maintain access to content they've already purchased. For example, when they upgrade to a new phone, they don't lose all of the items they purchased on the old phone. Include some mechanism in your app to let the user restore their purchases, such as a Restore Purchases button."
تم العثور على موضوع في منتديات مطوري Apple حول النتائج المتغيرة لـ restoreCompletedTransactions
كما قال @ ssg-luke سابقًا.
https://forums.developer.apple.com/thread/115242
ربما ، هذا مرتبط:
يبدو أنك تشير إلى مستخدم واحد لديه العديد من المعاملات التي لم يطلق عليها التطبيق اسم finishTransaction بعد.
https://forums.developer.apple.com/thread/115242#thread -post-355444
لديّ حسابات آلية أخرى على نفس الجهاز. فهل يمكن أن تكون المعاملات الخاصة بحسابات مختلفة ، على نفس الجهاز ، معطلة فقط وليست "منتهية" على الإطلاق؟
ومع ذلك ، قمت بتشغيل حلقة على جميع المعاملات ، وقمت باستدعاء finishTransactionIOS
على كل المعاملات. لكن هذا لم يجعلهم يذهبون بعيدًا أو ينتج عنه مخرجات موثوقة getAvailablePurchases()
... ربما لأنني بالفعل على حساب Sandbox أحدث وأن المعاملات من حساب sandbox قديم؟
يمكن أن يشرح أيضًا ما يواجههfcandiani .
لقد وجدت أن getPurchaseHistory () أعطت أطوال مصفوفة مختلفة أيضًا. يبدو أن تواتر الطلبات نفذته. في النهاية ، اتضح أن هذا لا يهمنا حقًا ، فبمجرد إرسال أي من إيصالات المعاملة للتحقق من صحتها ، أعادت Apple جميع الإيصالات في أحدث مصفوفة_receipt_info على أي حال وهو كل ما يهمنا.
شكرًا على المعلومات @ ssg-luke ، سأفعل نفس الشيء.
قمت أيضًا بتشغيل حلقة على جميع المعاملات ، ولم أتمكن من إزالتها باستخدام finishTransactionIOS. معاملاتي هي اشتراكات تجديد تلقائي.
تواجه نفس الشيء تقريبا. كنت أقوم بإنشاء مشكلة ، لكنني قررت أن أضع هنا جميع المعلومات لمساعدة الآخرين في العثور على المشكلة والحل.
3.5.9
0.60.5
iOS
اشترك المستخدم مرة واحدة ، يجب أن getAvailablePurchases
عملية شراء واحدة فقط
getAvailablePurchases
يعود بأكثر من عملية شراء واحدة ،
جهاز حقيقي بحساب رمل جديد.
getAvailablePurchases
، لا يُرجع أي مشتريات (كما هو متوقع)purchaseUpdatedListener
، وأدعو RNIap.finishTransactionIOS(subscription.transactionId);
الذي يُرجع undefined
(كما هو متوقع على ما أعتقد)getAvailablePurchases
، إرجاع عملية شراء واحدة (كما هو متوقع)getAvailablePurchases
، إرجاع عمليتي شراء ، كل واحدة بمختلف transactionId
:{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571145019000
transactionId: "1000000579415509"
transactionReceipt: "MIIVnQYJKoZIhvcN..."
},
{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571144839000
transactionId: "1000000579416705"
transactionReceipt: "MIIVnQYJKoZIhvcN...."
}
getAvailablePurchases
، تُرجع ثلاث عمليات شراء ، كل واحدة بمختلفة transactionId
(تختلف عن النتيجة السابقة):{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571145739000
transactionId: "1000000579423546"
transactionReceipt: "MIIb1AYJKoZIhvcN..."
},{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571145019000
transactionId: "1000000579426352"
transactionReceipt: "MIIb1AYJKoZI..."
},{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571144839000
transactionId: "1000000579426353"
transactionReceipt: "MIIb1AYJKoZIhvcN..."
}
getAvailablePurchases
، إرجاع أربع مشتريات ، كل واحدة بمختلف transactionId
(ليست هي نفسها من النتيجة السابقة) ...لا يبدو أن هذا هو السلوك الصحيح ، مما قرأته في المستندات وما يحدث على Android.
أنا أقدر أي مساعدة.
تعيد getAvaialblePurchases () أكثر من 150 نتيجة في حساب اختبار وضع الحماية الخاص بي. لقد قررت عدم استخدام getAvailablePurchases () على الإطلاق وتخزين آخر عملية شراء على الجهاز وأيضًا على الخادم. إذا تم حذف التطبيق أو نقل المستخدم إلى هاتف جديد ، فسيظل لدينا آخر عملية شراء على خادمنا مرتبط بمعرف مستخدم الشركة والنظام الأساسي (iOS أو Android). يستغرق الاتصال بـ getAvailablePurchases () ما يقرب من دقيقة وأحيانًا يستدعي هذا المستمع المحدث للشراء الذي يحاول استعادة عمليات الشراء المتعددة. لقد قمنا بتعديل تدفقنا مثل هذا:
1) عندما يقوم المستخدم بتسجيل الدخول إلى الجهاز:
أ) معرفة ما إذا كان هناك عملية شراء أخيرة صالحة على الخادم الخاص بنا للمستخدم والنظام الأساسي.
ب) إذا لم يكن هناك سجل على الخادم ، تحقق مما إذا كانت هناك عملية شراء محلية محفوظة في قاعدة البيانات
ج) إذا لم يكن هناك أي شيء أو كان هناك واحد منتهي الصلاحية ، اعرض عرض الاشتراكات.
في البداية كنا نتصل بـ getAvailablePurchases () ونحاول معرفة ما إذا كانت آخر عملية شراء لا تزال صالحة. لست متأكدًا مما إذا كان هذا يساعد الآخرين ولكننا لم نواجه مشكلات مع هذا بعد الآن. نحن على رد فعل 59 وهذا هو ألم آخر علينا التعامل معه.
ramakula وماذا لو
بالطريقة التي أخبرت بها ، ستحتفظ بالاشتراك في قاعدة البيانات الخاصة بك حتى تاريخ الانتهاء ، و "سترى" أن الشراء لم يعد متاحًا بعد الآن.
مرحبًا ، يبدو أنه لم يكن هناك أي نشاط بشأن هذه المشكلة مؤخرًا. هل تم إصلاح المشكلة أم أنها لا تزال تتطلب اهتمام المجتمع؟ قد يتم إغلاق هذه المشكلة في حالة عدم حدوث أي نشاط آخر. يمكنك أيضًا تصنيف هذه المشكلة على أنها "للمناقشة" أو "مشكلة أولى جيدة" وسأتركها مفتوحة. شكرا لمساهماتكم.
إغلاق هذه القضية بعد فترة طويلة من عدم النشاط. إذا كانت هذه المشكلة لا تزال موجودة في الإصدار الأخير ، فلا تتردد في إنشاء مشكلة جديدة بمعلومات محدثة.
تعيد getAvaialblePurchases () أكثر من 150 نتيجة في حساب اختبار وضع الحماية الخاص بي. لقد قررت عدم استخدام getAvailablePurchases () على الإطلاق وتخزين آخر عملية شراء على الجهاز وأيضًا على الخادم. إذا تم حذف التطبيق أو نقل المستخدم إلى هاتف جديد ، فسيظل لدينا آخر عملية شراء على خادمنا مرتبط بمعرف مستخدم الشركة والنظام الأساسي (iOS أو Android). يستغرق الاتصال بـ getAvailablePurchases () ما يقرب من دقيقة وأحيانًا يستدعي هذا المستمع المحدث للشراء الذي يحاول استعادة عمليات الشراء المتعددة. لقد قمنا بتعديل تدفقنا مثل هذا:
- عندما يقوم المستخدم بتسجيل الدخول إلى الجهاز:
أ) معرفة ما إذا كان هناك عملية شراء أخيرة صالحة على الخادم الخاص بنا للمستخدم والنظام الأساسي.
ب) إذا لم يكن هناك سجل على الخادم ، تحقق مما إذا كانت هناك عملية شراء محلية محفوظة في قاعدة البيانات
ج) إذا لم يكن هناك أي شيء أو كان هناك واحد منتهي الصلاحية ، اعرض عرض الاشتراكات.
في البداية كنا نتصل بـ getAvailablePurchases () ونحاول معرفة ما إذا كانت آخر عملية شراء لا تزال صالحة. لست متأكدًا مما إذا كان هذا يساعد الآخرين ولكننا لم نواجه مشكلات مع هذا بعد الآن. نحن على رد فعل 59 وهذا هو ألم آخر علينا التعامل معه.
أعتقد أنه يمكننا الحصول على آخر المشتريات من الإيصال. من خلال التحقق من استلام المستخدم ، مع استبعاد المعاملات القديمة: صحيح ، يمكننا الحصول على أحدث معلومات الاشتراك (فقط لنوع التجديد التلقائي). أعتقد أنه يمكننا استخدام هذه الطريقة لاستعادة مشتريات الاشتراك القابلة للتجديد التلقائي. لست متأكدًا مما إذا كانت هذه طريقة مثالية.
التعليق الأكثر فائدة
قمت أيضًا بتشغيل حلقة على جميع المعاملات ، ولم أتمكن من إزالتها باستخدام finishTransactionIOS. معاملاتي هي اشتراكات تجديد تلقائي.