React-native-iap: finishTransactionIOS / finishTransaction لا يفعل شيئًا لنظام iOS

تم إنشاؤها على ١٩ فبراير ٢٠٢٠  ·  34تعليقات  ·  مصدر: dooboolab/react-native-iap

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

4.4.1

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

0.60.4

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

iOS

سلوك متوقع

عند الاتصال بـ finishTransactionIOS (PurchaseId) أو finishTransaction (الشراء) للاشتراك ، يجب إنهاء المعاملة وعدم إرسالها إلى التطبيق مرة أخرى عند التشغيل التالي. إذا كانت هناك مشكلة في هذا ، أتوقع أن يتم إرجاع شيء ما إلى مستمع الأخطاء أو بوعد من إحدى وظائف finishTransaction ، فلن يحدث شيء.

يبدو أن Android يعمل بشكل جيد.

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

يتم إرسال المعاملة في كل عملية تشغيل ما لم يتم استدعاء clearTransactionIOS ، والذي يبدو أن له آثارًا جانبية أخرى.

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

جهاز حقيقي

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

  • قم بإنشاء منتج اشتراك.
  • شراء الاشتراك
  • محاكاة التحقق من صحة الخلفية
  • إنهاء المكالمة TransactionIOS أو finishTransaction على هذا الاشتراك. ليس له تأثير.

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

ℹ needs more info 📱 iOS 🙏 help wanted 🚶🏻 stale

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

hyochan أي تحديث بشأن هذه المسألة؟ لقد علقنا لبعض الوقت ولم نتمكن من نشر تطبيقنا.

ال 34 كومينتر

لدي نفس المشكلة.

هل يمكنك مشاركة ackResult ؟

          try {
            const ackResult = await finishTransaction(purchase);
            console.log('ackResult', ackResult);
          } catch (ackErr) {
            console.warn('ackErr', ackErr);
          }

تضمين التغريدة
في حالتي:
ackResult undefined

تضمين التغريدة
في حالتي:
ackResult undefined

نفس الشيء هنا

أيضًا في حالتي ، القيمة التي تم إرجاعها غير محددة (جهاز حقيقي مع مستخدم وضع الحماية).

يبدو مرتبطًا بـ # 366. أيضًا مقابل ios finishTransaction لن يُرجع أي شيء.
هل يمكنكم جميعًا التركيز على # 366 والعودة للتحديث؟

يبدو مرتبطًا بـ # 366. أيضًا مقابل ios finishTransaction لن يُرجع أي شيء.
هل يمكنكم جميعًا التركيز على # 366 والعودة للتحديث؟

فقط للتوضيح - بما أن # 366 يتعلق بالاختبار ، هل تقترح أن يعمل هذا بشكل جيد في الإنتاج دون الحاجة إلى clearTransactionIOS؟

hyochan عندما أقوم باختبار تكوين تصحيح الأخطاء باستخدام حساب وضع الحماية ، أتلقى إشعارًا من الخادم إلى إعلامات الخادم (Apple) بشأن عملية شراء. تكمن المشكلة في أنه بعد مرور بعض الوقت ، يتلقى مستمع العميل الخاص بي إشعارًا آخر بشأن الشراء ولكن مع معاملة مختلفة ، حتى عند حدوث إجراء الشراء مرة واحدة فقط ، لذا يبدو أنه مشكلة في إنهاء المعاملة السابقة بشكل صحيح. على Android ، كل شيء يعمل بشكل جيد وأعتقد أن هذا لا يرتبط بـ # 366 لأنه ليس لدي أي مشكلة في اختبار عملية الشراء باستخدام حساب sandbox.

"" tsx
useEffect (() => {
buyUpdateSubscription.current = PurchaseUpdatedListener (
غير متزامن (الشراء: InAppPurchase | SubscriptionPurchase) => {
إيصال const = Purchase.transactionReceipt ؛
إذا (إيصال) {
محاولة {
في انتظار myBackendHandler ({
المستعمل،
شراء،
}) ؛
نتيجة const = انتظار RNIap.finishTransaction (شراء ، خطأ) ؛
console.log ("نتيجة" ، نتيجة) ؛
} catch (e) {
// لكى يفعل
}
}
}
) ؛
العودة () => {
إذا (purchaseUpdateSubscription.current) {
buyUpdateSubscription.current.remove () ،
buyUpdateSubscription.current = null ؛
}
} ؛
} ، []) ؛
""

مرحبًا أيها الفريق ، شكرًا على كل العمل الشاق في هذه المكتبة ، إنها حقًا تجعل حياتنا أسهل. أنا أعلِّق لأن هذه المشكلة لم يتم حلها ولا أرى مدى ارتباط المعاملات القديمة التي لم يتم مسحها بالرقم 366.

حالة الاستخدام الخاصة بي هي

  1. يقوم المستخدم 1 بإجراء الشراء والمزايا المميزة المطبقة على حسابه.
  2. خروج المستخدم 1
  3. يقوم المستخدم 2 بتسجيل الدخول

نتيجة متوقعة:

  • لا يتم إرسال المعاملات من المستخدم 1 عبر مستمع الشراء

نتيجة فعلية

  • لا يتم مسح المعاملات من المستخدم 1 ويتم إرسالها مرة أخرى. على الرغم من قيام مستخدم جديد بتسجيل الدخول مما أدى إلى بيانات سيئة.

هذا مجرد مثال على سبب أهمية إعطاء الأولوية لهذه المشكلة. شكرا لقراءة هذا التعليق الطويل ...

نفس الشيء هنا

بالضبط نفس المشكلة المذكورة أعلاه ، يبدو أن المكدس لم يتم مسحه على الإطلاق ، حتى بعد فصل حساب sandbox / itunes ، أو إعادة تشغيل الجهاز ، أو إعادة تثبيت التطبيق ..: /

هل يمكنك التحقق من أن finishTransaction لا يفعل شيئًا في الملف RNIapIos.m ؟
لقد تحققت منه للتو وأكمل معاملته بشكل صحيح.

الرجاء التحقق من طريقة clearTransaction أو finishTransactionWithIdentifier وحاول وضع أي سجلات بالداخل. حاول أن تجد أدناه الرموز.

RCT_EXPORT_METHOD(clearTransaction) {
    NSArray *pendingTrans = [[SKPaymentQueue defaultQueue] transactions];
    NSLog(@"\n\n\n  ***  clear remaining Transactions. Call this before make a new transaction   \n\n.");
    for (int k = 0; k < pendingTrans.count; k++) {
        [[SKPaymentQueue defaultQueue] finishTransaction:pendingTrans[k]];
    }
-(void)finishTransactionWithIdentifier:(NSString *)transactionIdentifier {
    SKPaymentQueue *queue = [SKPaymentQueue defaultQueue];
    for(SKPaymentTransaction *transaction in queue.transactions) {
        if([transaction.transactionIdentifier isEqualToString:transactionIdentifier]) {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }
    }
}

لا يمكنني المضي قدمًا في هذه المشكلة لأنني لا أملك أي فكرة عما يحدث. آمل أن يتمكن شخص ما من تصحيح الأخطاء في بيئته ومشاركتها 🙏

أي تحديث حول هذه المسألة؟

حتى ، أواجه هذه المشكلة أيضًا.

نفس الشيء هنا finishTransactionIOS / finishTransaction هذا لا يعمل في IOS

يبدو أنني واجهت نفس الشيء.
اكتمل شراء IAP بنجاح ، لكن المكالمة الأخيرة لـ finishTransaction ترجع undefined .

// Finish transaction
const ackResult = await finishTransaction(purchase);
console.log("Ack result: ", ackResult); // Ack result: undefined

_حقق الجهاز "iPhone 6s" باستخدام بيئة App Store Sandbox.

ما هي النتيجة المتوقعة من إنهاء المعاملة؟ هل undefined نتيجة جيدة أم هل يجب أن أتوقع شيئًا آخر؟

أواجه أيضًا هذه المشكلة على نظام التشغيل iOS ، حيث لا يقوم finishTransactionIOS ولا finishTransaction بإزالة هذه المعاملات بالفعل ، مما يمنعني من إطلاق التطبيق. أي تحديث؟

hyochan على الرغم من أنني بالتأكيد لست finishTransaction و finishTransactionWithIdentifier ويبدو أنها تعمل بشكل صحيح (يتم تمرير المعرف ومطابقته). الشيء الوحيد الذي يمكنني التفكير فيه هو أن [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; لا يتصل فعليًا بـ StoreKit وينتهي من المعاملة؟ لا أعرف حقًا إلى أين أذهب من هنا ولكن آمل أن يكون هذا مفيدًا أثناء تصحيح الأخطاء

هل تتعامل أيضًا مع إشعارات حالة الاشتراك من متجر التطبيقات؟ في حالتي ، واجهت هذه المشكلة حتى تأكدت من تعامل خادمي مع جميع أحداث الإشعارات بشكل صحيح واستجبت بـ 200.

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

تضمين التغريدة لقد كانت مجرد ضربة حظ (؟) أو أي شيء آخر. أنشأ إصدارًا آخر من التطبيق والمشكلة موجودة مرة أخرى. التفكير في فعل الشيء نفسه ولكن قلقة قليلاً من عدم صيانة معرض إكسبو بشكل جيد.

كنت ألقي نظرة عليه ومن الصحيح أنه يعود غير محدد لأن استدعاء finishTransactions لا يُقصد به إرجاع أي شيء في obj-c.
لقد أجريت بعض الاختبارات وفي حالتي ، يبدو أني أكملها بشكل صحيح (اختبار بسيط ، سحب المعاملات المعلقة ، إذا لم يكن هناك شيء ، فهو يعمل بشكل جيد)

espenjanson لا أعرف ما الذي يجعلك تعتقد أن حزم Expo لا تتم صيانتها جيدًا. أعتقد أن Expo أطلق وحدة iap الخاصة بهم مؤخرًا. إذا كنت أعرف أن إكسبو يحتوي على وحدة iap في الوقت الذي كنت أقوم فيه بتطبيق iap ، كنت سأختار المعرض دون التفكير مرتين.

هل هناك طريقة لحل هذا؟
لقد اختبرت هذا على TestFlight حتى مع مستخدم Sandbox الجديد وما زال يحدث.

يستمر purchaseUpdateListener تلقي المعاملات "القديمة".
أنا أتصل بـ finishTransaction(purchase,false) لأنني أستخدم اشتراكات قابلة للتجديد التلقائي.
نتيجة المكالمة هي undefined .

هل يمكن لأي شخص تقديم حل بديل أو تفسير لماذا يحدث هذا؟

zatloeri يبدو أن هذا هو السلوك المطلوب. استغرق الأمر مني بعض الوقت لأدرك ذلك. سيضع متجر التطبيقات إيصالًا جديدًا للتجديد في StoreKit مما يؤدي إلى تشغيل المراقب. يجب عليك معالجة هذا الإيصال وإنهاء المعاملة.

https://developer.apple.com/videos/play/wwdc2018/705/
https://developer.apple.com/videos/play/wwdc2020/10671

(شاهد في Safari للحصول على جودة HD)

ziyoshams شكرًا على الرد السريع وعلى الموارد التي

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

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

أتوقع أن يتم تشغيلهم جميعًا في تطبيق واحد إذا كان الاشتراك قد انتهى بالفعل.
هل هذا سلوك متوقع أيضًا ، أم أن هناك شيئًا مريبًا يحدث؟

zatloeri ستظهر كل معاملة لم تنته في قائمة الانتظار هذه ، حتى لو انتهت صلاحيتها. بالنسبة للاشتراكات الشهرية ، يجب أن تحصل على هذا الإيصال كل 5 دقائق أو نحو ذلك. كما لو اشتريت شيئًا ما وعدت إلى التطبيق في اليوم التالي ، فستحصل على 5-6 إيصالات في نفس الوقت. أوصي بشدة بمشاهدة مقاطع فيديو WWDC هذه. إنها مفيدة للغاية.

أواجه نفس المشكلة على نظام التشغيل iOS ، ولم يتم الانتهاء من المعاملة ، ولم يتم تفريغ قائمة الانتظار ويعود ظهور الإيصال في كل مرة عند تشغيل التطبيق. لقد تحققت من الاستلام على جانب الخادم ، ثم أكملت المعاملة. الرجاء إلقاء نظرة على رمز بلدي أدناه

لقد ذكرت بعض المقتطفات من الكود الخاص بي أدناه ...

""
استيراد RNIap ، {
InAppPurchase ،
منتج،
خطأ في الشراء ،
الاشتراك ،
الاشتراك
إنهاء
إنهاء المعاملات
مُستمع أخطاء الشراء
شراء مستمع محدث ،
clearTransactionIOS ،
} من "رد فعل-أصلي-إيب" ؛

componentDidMount () {غير متزامن
نتيجة const = انتظار RNIap.initConnection () ؛
const itemSubs = Platform.select ({
ذكري المظهر: [
الحصول على (this.props، 'subscriptionStore.subscription.android_product_id' ، خالية)
] ،
iOS: [
الحصول على (this.props، 'subscriptionStore.subscription.ios_product_id' ، فارغة)
]
}) ؛

اشتراكات const = انتظار RNIap.getSubscriptions (itemSubs) ؛
buyUpdateSubscription = PurchaseUpdatedListener (
غير متزامن (شراء) => {
إيصال const = Purchase.transactionReceipt ؛
السماح للاشتراك = {
subscription_id: get (this.props، 'subscriptionStore.subscription.id' ، فارغة)
} ؛
إذا (Platform.OS === 'ios') {
الاشتراك = {
... اشتراك ،
order_id: الحصول على (شراء ، "معاملة" ، فارغة) ،
buy_token: get (purchase، 'originalTransactionIdentifierIOS'، null) ،
الإيصال: get (buy، 'transactionReceipt'، null)، // (قم بتخزينه في TEXT)
نظام التشغيل: "IOS"
}
} else if (Platform.OS === 'android') {
بيانات const = JSON.parse (إيصال) ؛
الاشتراك = {
... اشتراك ،
order_id: الحصول على (البيانات ، "معرف الطلب" ، فارغة) ،
buy_token: get (data، 'PurchaseToken'، null) ،
نظام التشغيل: "ANDROID"
}
}
محاولة {
finishTransaction (شراء ، خطأ) ؛ // هذا هنا مؤقت ، سيتم وضعه على النجاح لاحقًا.
this.props.notificationStore.showToast ('تم الاشتراك بنجاح. الرجاء الانتظار ...'، 'نجاح'، 5000) ؛
const resp = wait this.props.subscriptionStore.onPurchase (اشتراك) ؛ // التحقق من المعاملات في نهاية الخادم.
if (resp.success) {// Success response
this.props.userStore.setUser ({is_premium: 1}) ،
this.props.navigation.replace ('FixFooter') ؛
}
} catch (خطأ) {
console.log ("onPurchase API ERROR:"، error)؛
}
}
)

buyErrorSubscription = purchaseErrorListener (
غير متزامن (خطأ) => {
console.log ('خطأ في الشراء:' ، خطأ) ؛
}
)
}

/ * على زر الشراء * /
غير متزامن عند الشراء () {
محاولة {
طلب const = انتظار RNIap.requestSubscription (Platform.OS === 'android'؟
الحصول على (this.props، 'subscriptionStore.subscription.android_product_id' ، خالية):
الحصول على (this.props، 'subscriptionStore.subscription.ios_product_id' ، فارغة))
} catch (خطأ) {
console.log ('خطأ:' ، خطأ)
}
}

@ sufyan297 هل يمكنك من فضلك مشاركة مقتطف من التعليمات البرمجية من جانب الخادم؟ أحاول أيضًا إعداد التحقق من الإيصال ولكن مستند Apple محير للغاية

ziyoshams هل تحصل على null أيضًا باستخدام طريقة expo iap module finishTransaction؟

bcbcbcbcbcl أنا لا أستخدم وحدة المعرض.

+1 بالنسبة لي يعود غير محدد

hyochan أي تحديث بشأن هذه المسألة؟ لقد علقنا لبعض الوقت ولم نتمكن من نشر تطبيقنا.

مرحبًا ، يبدو أنه لم يكن هناك أي نشاط بشأن هذه المشكلة مؤخرًا. هل تم إصلاح المشكلة أم أنها لا تزال تتطلب اهتمام المجتمع؟ قد يتم إغلاق هذه المشكلة في حالة عدم حدوث أي نشاط آخر. يمكنك أيضًا تصنيف هذه المشكلة على أنها "للمناقشة" أو "مشكلة أولى جيدة" وسأتركها مفتوحة. شكرا لمساهماتكم.

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

القضايا ذات الصلة

iutin picture iutin  ·  4تعليقات

makarsky picture makarsky  ·  3تعليقات

jvandenaardweg picture jvandenaardweg  ·  4تعليقات

sanilcgs picture sanilcgs  ·  3تعليقات

Symyon picture Symyon  ·  5تعليقات