React-native-iap: getAvailablePurchases ترجع مجموعة مختلفة في كل مرة

تم إنشاؤها على ٩ أغسطس ٢٠١٩  ·  13تعليقات  ·  مصدر: dooboolab/react-native-iap

نسخة من رد فعل - أصلية - IAP

3.3.9 (ولكن اختبر هذا أيضًا في 3.0.0 وما قبله)

نسخة من رد الفعل الأصلي

0.59.9

المنصات التي واجهت الخطأ فيها (IOS أو Android أو كليهما؟)

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() كل مرة أقوم بتشغيلها

📱 iOS 🙏 help wanted 🚶🏻 stale

التعليق الأكثر فائدة

قمت أيضًا بتشغيل حلقة على جميع المعاملات ، ولم أتمكن من إزالتها باستخدام finishTransactionIOS. معاملاتي هي اشتراكات تجديد تلقائي.

ال 13 كومينتر

أنا أيضا أرى هذا. الشيء الخطير حقًا في ذلك هو أن هناك احتمال ألا يكون آخر إيصال صالح في النتائج.

من خلال النظر إلى رمز الوحدات هذا ، يبدو بصراحة أنه مشكلة من جانب Apple نظرًا لأن هذه الوحدة تمر فعليًا بكل ما يعطيه restoreCompletedTransactions()

أتساءل عما إذا كان getPurchaseHistory() بديلًا جيدًا لاستخدامه في الاشتراكات. أنا أستخدم ذلك حاليًا كبديل ، حيث يمنحني ذلك نتائج موثوقة. ليس لدي أي مشتريات أخرى في تطبيقي ، فقط اشتراكات.

كما هو مذكور في مستندات iap على هذه الحزمة ، يتحدث getAvailablePurchases() عن المواد الاستهلاكية. الاشتراك ليس منتجًا "قابل للاستهلاك" أو "غير قابل للاستهلاك". إنه "اشتراك قابل للتجديد التلقائي" لذا من المفترض أن يفعله getPurchaseHistory() ؟

Screenshot 2019-08-16 at 18 11 13

لقد وجدت أن 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. معاملاتي هي اشتراكات تجديد تلقائي.

تواجه نفس الشيء تقريبا. كنت أقوم بإنشاء مشكلة ، لكنني قررت أن أضع هنا جميع المعلومات لمساعدة الآخرين في العثور على المشكلة والحل.

نسخة من رد فعل - أصلية - IAP

3.5.9

نسخة من رد الفعل الأصلي

0.60.5

المنصات التي واجهت الخطأ فيها (IOS أو Android أو كليهما؟)

iOS

  • يعمل نفس الرمز بشكل مثالي على Android ، وهو بالفعل قيد الإنتاج

سلوك متوقع

اشترك المستخدم مرة واحدة ، يجب أن getAvailablePurchases عملية شراء واحدة فقط

السلوك الفعلي

getAvailablePurchases يعود بأكثر من عملية شراء واحدة ،

بيئة اختبار (محاكي؟ جهاز حقيقي؟)

جهاز حقيقي بحساب رمل جديد.

خطوات إعادة إنتاج السلوك

  • أنشئ مستخدم اختبار وضع الحماية على https://appstoreconnect.apple.com/access/testers
  • بناء وتشغيل المشروع على xcode
  • اتصل بـ getAvailablePurchases ، لا يُرجع أي مشتريات (كما هو متوقع)
  • اشترك في بعض المنتجات
  • تم استدعاء purchaseUpdatedListener ، وأدعو RNIap.finishTransactionIOS(subscription.transactionId); الذي يُرجع undefined (كما هو متوقع على ما أعتقد)
  • استدعاء getAvailablePurchases ، إرجاع عملية شراء واحدة (كما هو متوقع)
  • إعادة تحميل التطبيق
  • Call 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...."
}
  • إعادة تحميل التطبيق دي مرة أخرى
  • Call 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 () ما يقرب من دقيقة وأحيانًا يستدعي هذا المستمع المحدث للشراء الذي يحاول استعادة عمليات الشراء المتعددة. لقد قمنا بتعديل تدفقنا مثل هذا:

  1. عندما يقوم المستخدم بتسجيل الدخول إلى الجهاز:
    أ) معرفة ما إذا كان هناك عملية شراء أخيرة صالحة على الخادم الخاص بنا للمستخدم والنظام الأساسي.
    ب) إذا لم يكن هناك سجل على الخادم ، تحقق مما إذا كانت هناك عملية شراء محلية محفوظة في قاعدة البيانات
    ج) إذا لم يكن هناك أي شيء أو كان هناك واحد منتهي الصلاحية ، اعرض عرض الاشتراكات.
    في البداية كنا نتصل بـ getAvailablePurchases () ونحاول معرفة ما إذا كانت آخر عملية شراء لا تزال صالحة. لست متأكدًا مما إذا كان هذا يساعد الآخرين ولكننا لم نواجه مشكلات مع هذا بعد الآن. نحن على رد فعل 59 وهذا هو ألم آخر علينا التعامل معه.

أعتقد أنه يمكننا الحصول على آخر المشتريات من الإيصال. من خلال التحقق من استلام المستخدم ، مع استبعاد المعاملات القديمة: صحيح ، يمكننا الحصول على أحدث معلومات الاشتراك (فقط لنوع التجديد التلقائي). أعتقد أنه يمكننا استخدام هذه الطريقة لاستعادة مشتريات الاشتراك القابلة للتجديد التلقائي. لست متأكدًا مما إذا كانت هذه طريقة مثالية.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات