React-native-iap: إرجاع buySubscription E_UNKNOWN على الرغم من الشراء الناجح

تم إنشاؤها على ١٣ أكتوبر ٢٠١٨  ·  30تعليقات  ·  مصدر: dooboolab/react-native-iap

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

2.2.2 (بسبب فشل أي إصدار أحدث على iOS بسبب # 279)

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

iOS

سلوك متوقع

لا ينبغي إلقاء أي خطأ. تم الشراء بنجاح (مباشر وفي الإنتاج)

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

تم إرجاع خطأ E_UNKNOWN من Promise
يبلغ تتبع أخطاء Sentry.io لدينا عن هذا:

{"framesToPop":1,"code":"E_UNKNOWN","nativeStackIOS":["0   LuCoaching                          0x000000010062f6fc LuCoaching + 1996540","1   LuCoaching                          0x000000010060aa98 LuCoaching + 1845912","2   LuCoaching                          0x00000001007cad98 __cxa_throw + 438380","3   LuCoaching                          0x00000001007cc62c __cxa_throw + 444672","4   libdispatch.dylib                   0x000000019d078484 <redacted> + 16","5   libdispatch.dylib                   0x000000019d025610 <redacted> + 56","6   LuCoaching                          0x00000001007cc46c __cxa_throw + 444224","7   libdispatch.dylib                   0x000000019d0776c8 <redacted> + 24","8   libdispatch.dylib                   0x000000019d078484 <redacted> + 16","9   libdispatch.dylib                   0x000000019d0249ec <redacted> + 1068","10  CoreFoundation                      0x000000019d5ce1bc <redacted> + 12","11  CoreFoundation                      0x000000019d5c9084 <redacted> + 1964","12  CoreFoundation                      0x000000019d5c85b8 CFRunLoopRunSpecific + 436","13  GraphicsServices                    0x000000019f83c584 GSEventRunModal + 100","14  UIKitCore                           0x00000001ca444bc8 UIApplicationMain + 212","15  LuCoaching                          0x000000010044d110 LuCoaching + 20752","16  libdyld.dylib                       0x000000019d088b94 <redacted> + 4"],"userInfo":{"NSLocalizedDescription":"Verbindung mit iTunes Store nicht möglich"},"domain":"SKErrorDomain","line":26,"column":1877,"sourceURL":"/var/containers/Bundle/Application/818C8439-E250-42E8-AD57-EC4FB5FE5547/LuCoaching.app/main.jsbundle"}

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

جهاز حقيقي. عملاء مباشرون. فشل شديد الاتساق

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

عند اختبار الإجراء مع مستخدمي Sandbox ، لا يمكن تكرار الخطأ.

🐛 bug 📱 iOS

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

: +1: نشهد هذه المشكلة كانت جيدة. يبدو أنه يحدث لحوالي 10٪ من مستخدمينا حاليًا. سنحاول إضافة هذا المستمع ، لكنني لا أعتقد أن هذا حل رائع في النهاية. hyochan هل هناك أي طريقة يمكننا من خلالها الحصول على معلومات أكثر تفصيلاً في الحالات التي يُلقي فيها هذا الأمر ، أم أنها استجابة قياسية من واجهات برمجة تطبيقات StoreKit؟ في كل حالة خطأ ، يبدو أن الرسالة "لا يمكن الاتصال بـ iTunes Store" ، حتى عندما تكون عملية الشراء ناجحة.

ال 30 كومينتر

@ Gaia-Nutrition هل يمكنك التحقق من هذه المشكلة القديمة؟ قد يكون السبب نفسه.
https://github.com/dooboolab/react-native-iap/issues/201

JJMoon في # 201 الخطأ كان E_DEVELOPER_ERROR وسببه عدم ملء قائمة validProducts باستخدام getSubscriptions() .
ومع ذلك ، أقوم باستدعاء الوظيفة قبل محاولة إجراء عملية السحب وأحصل أيضًا على خطأ مختلف.
لكن الآن بعد أن أفكر في الأمر. قد يحدث أن هناك بعض التأخير في الوقت بين getSubscriptions() و buySubscription() بسبب إعادة المستخدم النظر إذا كان يريد إجراء عملية الشراء. هل يمكن أن تكون هذه مشكلة؟ قد يكون التطبيق في الخلفية في هذه الأثناء.
تحرير: ولكن مرة أخرى يتم تنفيذ عملية الشراء بنجاح ، لذا يجب أن تكون المشكلة هي المكان الذي تتم فيه معالجة استجابة متجر التطبيقات

مرحبا،

نفس سلوك المشكلة مع "buyProductWithoutFinishTransaction" أو "buyProduct".

الإصدار 2.2.1

العائد المخزن
{ "framesToPop": 1, "code": "E_UNKNOWN", "nativeStackIOS": [...], "userInfo": { "NSLocalizedDescription": "Connexion à l’iTunes Store impossible" }, "domain": "SKErrorDomain", "line": 16, "column": 1599, "sourceURL": "..." }

قمنا بتحديث الوحدة لأننا نعيد إنتاج هذا الخطأ عند الإنتاج بالإصدارات السابقة.

الجزء المثير للاهتمام هو أن عملية إعادة الشراء تفشل أيضًا للمستخدمين عند حدوث ذلك. يحدث فقط لحوالي 1٪ من مستخدمي iOS لدينا.

fierysolid @ نفس الحالة ، نحن حوالي 5٪ من عمليات الشراء على iOS الذين فشلوا. عندما يحاول العميل الشراء مرة أخرى ، تظهر له نافذة منبثقة لإعادة الشراء.

مرحباً بالجميع. آمل أن يتم إصلاحه في نسختنا الجديدة اليوم وهي 2.3.15 . لقد لاحظت أن استخدام NSDictionary في نظام iOS ليس آمنًا للاستخدام وقد يتسبب في سلوك غير متوقع. لقد أصلحت هذا وآمل الآن أن يعمل بشكل جيد في كل جهاز. يرجى اختبار ذلك.

يرجى إعادة الفتح عندما لا تزال تواجه المشكلة.

تضمين التغريدة
ما زلت أتلقى هذه المشكلة أثناء استخدام buySubscription() مع مستخدم اختبار وضع الحماية مع iPhone 6S.

{"userInfo":{"NSLocalizedDescription":"Cannot connect to iTunes Store"}}

@ danrevah إذن لقد جربت 2.3.15 ؟ JJMoon هل يمكنك من فضلك اختبار هذا مرة أخرى؟

dooboolab نعم أنا باستخدام هذا الإصدار.

@ danrevah الرجاء محاولة 2.3.16 .

لقد نجحت dooboolab مرة واحدة ، لكن بينما حاولت مرة أخرى ظللت أتلقى هذه الأخطاء. (يستخدم الإصدار 2.3.17)

JJMoon هل لديك أي دليل على هذا؟ إنه يستخدم iPhone6S

لقد أعدت فتح المشكلة. ccJJMoon

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

danrevah أرجو الرجوع إلى هذه الوثيقة.
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267 -CH7-SW6
لاختبار الاشتراك في وضع الحماية ، تحتاج إلى إعادة شراء الاشتراك بعد مرور بعض الوقت.
وقد تحتاج إلى إلغاءه للشراء مرة أخرى.
وهناك بعض ردود الفعل الغريبة من خادم Apple sandbox ، مما يجعل الاختبار أكثر صعوبة.

إذا كانت حالة JJMoon هي المشكلة ، فقد تضمين التغريدة

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

+1 لدي نفس المشكلة

حاول استخدام addAdditionalSuccessPurchaseListenerIOS في buySubscription أيضًا. هذه هي نفس المشكلة كما في # 307.

حاول استخدام addAdditionalSuccessPurchaseListenerIOS في buySubscription أيضًا. هذه هي نفس المشكلة كما في # 307.

هل هناك شخص يستخدم بالفعل في الإنتاج؟

hyochan ، لقد حاولت القيام بذلك ولكن دون جدوى.

if (subscription && subscription.success) {
      this.props.subscribe(subscription.result);
    } else {
      if (Platform.OS === 'ios') {
        const sub = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
          this.props.subscribe(purchase); // -> This code is never fired
          sub.remove();
        });
      }
    }

cbfranca يرجى اتباع الكود الفعلي. أنت لا تستخدم حتى promises . يجب أن تستمع إلى addAdditionalSuccessPurchaseListenerIOS بعد رفض الوعد.

كما أنك لا تحتاج إلى المزيد من Platform.OS === 'ios' .

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

static purchaseSubscription(newSubscriptionID, currentSubscriptionID) {
    if (Platform.OS === 'ios') {
      const purchaseResult = KinvoBilling.purchaseSubscriptionIOS(newSubscriptionID);
      return purchaseResult;
    }

    const purchaseResult = KinvoBilling.purchaseSubscriptionANDROID(newSubscriptionID, currentSubscriptionID);
    return purchaseResult;
  }

  static purchaseSubscriptionANDROID = async (newSubscriptionID, currentSubscriptionID) => {
    const hasCurrentSubscription = currentSubscriptionID !== null;

    if (hasCurrentSubscription) {
      const purchaseResult = KinvoBilling.updateSubscription(newSubscriptionID, currentSubscriptionID);
      return purchaseResult;
    }
    const purchaseResult = KinvoBilling.buySubscription(newSubscriptionID);
    return purchaseResult;
  }

  static purchaseSubscriptionIOS = async (subscriptionID) => {
    await KinvoBilling.getSubscriptions();
    const purchaseResult = await KinvoBilling.buySubscription(subscriptionID);

    return purchaseResult;
}

تضمين التغريدة
""
static PurchaseSubscriptionIOS = غير متزامن (subscriptionID) => {
انتظار KinvoBilling.getSubscriptions () ،
محاولة {
const PurchaseResult = await KinvoBilling.buySubscription (subscriptionID) ؛
} catch (يخطئ) {
اشتراك const = RNIap.addAdditionalSuccessPurchaseListenerIOS (غير متزامن (شراء) => {
// dooboolab => تحقق من المكالمة هنا.
this.setState ({إيصال: purchase.transactionReceipt}، () => this.goToNext ()) ؛
اشتراك إزالة () ؛
}
}
عودة الشراء
}
""

تحقق من الرمز أعلاه. أعتقد أنك بحاجة إلى إعادة بناء كودك ليتناسب مع دورة حياته.

hyochan لا يعمل بالنسبة لي.

سيناريو الاختبار الخاص بي هو:

  • شراء خطة الاشتراك الشهري - حسنًا
  • الترقية إلى خطة الاشتراك السنوي - فشل والمستمع لا يعمل

شك آخر: هل يجب علي استخدام finishTransaction () في الاشتراكات أيضًا؟

أنا أرى هذا الخطأ أيضًا. وأعتقد أنني أعرف طريقة واحدة لإعادة إنتاجه.

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

^ 2.4.1

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

https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz

منصة

iOS ، عند الاختبار في TestFlight على جهاز حقيقي.

ملاحظات

لقد لاحظت أنه عند استدعاء أي من وظائف RNIap في تطبيقي ، سيطلب مني iOS إدخال كلمة مرور لمستخدم iTunes / App Store سابق (قمت بتسجيل الخروج واستبداله عبر إعدادات iOS). قرأت في مكان ما عبر الإنترنت أن هذه مشكلة تجذب مستخدمي iPhone من وقت لآخر: في بعض الأحيان يتم شراء تطبيق بحساب iTunes واحد ، ثم يتم تحويل الهاتف إلى حساب iTunes جديد ، لكن التطبيق يستمر في طلب كلمة المرور الخاصة بـ حساب iTunes القديم.

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

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

  1. buySubscription ()
  2. حدد متابعة عند تقديمها مع "شروط الاشتراك" الخاصة بنظام iOS
  3. حدد "موافق" عند تقديمه مع "تأكيد الاشتراك" في نظام iOS
  4. حدث خطأ بواسطة buySubscription ():
{
   code: E_UNKNOWN, 
   column: 1565, 
   domain: NSURLErrorDomain, 
   framesToPop: 1, 
   line: 20, 
   nativeStackIOS: [...],
   sourceURL: ...,
   userInfo: {
      _kCFStreamErrorCodeKey: -4, 
      _kCFStreamErrorDomainKey: 4, 
      NSErrorFailingURLKey: None, 
      NSErrorFailingURLStringKey: https://p100-sandbox.itunes.apple.com/WebObjects/MZFinance.woa/wa/inAppBuy, 
      NSLocalizedDescription: Cannot connect to iTunes Store, 
      NSUnderlyingError: {
         code: "-1005", 
         domain: "kCFErrorDomainCFNetwork", 
         message: "underlying error", 
         nativeStackIOS: [...],
         userInfo:{"NSErrorPeerAddressKey":null,"_kCFStreamErrorCodeKey":-4,"_kCFStreamErrorDomainKey":4}
      }
   }
}

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

  1. أنشئ مستخدمًا تجريبيًا في App Store Connect
  2. تثبيت التطبيق من متجر التطبيقات (أو دعوة مستخدم الاختبار إلى TestFlight وتثبيت TestFlight ثم التطبيق من خلال TestFlight)
  3. شراء اشتراك في التطبيق
  4. دع الاشتراك ينتهي
  5. معرف Apple لتسجيل الخروج (الإعدادات> معرف Apple ، تسجيل الخروج)
  6. تسجيل الدخول إلى معرف Apple الجديد
  7. شراء اشتراك في التطبيق

أمل أن هذا يساعد شخصاما!

تضمين التغريدة

بعد تجربة العديد من الأشياء ، ما زلت أعاني من نفس المشكلة وأكثر. في الكود أدناه ، إرجاع RNIap.buySubscription (sku) غير محدد. من فضلك ، هل قام أحد بحلها؟

""
static PurchaseSubscriptionIOS = غير متزامن (subscriptionID) => {
انتظار KinvoBilling.getSubscriptions () ،

try {
  const purchaseResult = await RNIap.buySubscription(subscriptionID);
  return createResponse(true, purchaseResult);
} catch (error) {
  const subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
    // dooboolab => check the call here.
    console.tron.log('--- ERROR ----');
    console.tron.log(error);
    console.tron.log('--- PURCHASE ----');
    console.tron.log(purchase);
    const result = purchase;
    subscription.remove();
    console.tron.log(result);

    if (result) {
      return createResponse(true, result);
    }
    return createResponse(false, result);
  });
}

} ؛
""

: +1: نشهد هذه المشكلة كانت جيدة. يبدو أنه يحدث لحوالي 10٪ من مستخدمينا حاليًا. سنحاول إضافة هذا المستمع ، لكنني لا أعتقد أن هذا حل رائع في النهاية. hyochan هل هناك أي طريقة يمكننا من خلالها الحصول على معلومات أكثر تفصيلاً في الحالات التي يُلقي فيها هذا الأمر ، أم أنها استجابة قياسية من واجهات برمجة تطبيقات StoreKit؟ في كل حالة خطأ ، يبدو أن الرسالة "لا يمكن الاتصال بـ iTunes Store" ، حتى عندما تكون عملية الشراء ناجحة.

لدينا مشكلة مشابهة جدًا مع 3.4.6: فشلت محاولة الشراء الأولى مع E_UNKOWN ، ونجحت إعادة المحاولة. ومع ذلك ، يحدث هذا بالنسبة لنا مع buyProduct ، وليس مع buySubscription . hyochan هل يمكن أن يكون هذا هو نفس السبب الجذري؟

مرحبا! أواجه نفس المشكلة بعد الاتصال بـ RNIap.requestSubscription () أحصل على نتيجة غير محددة لكن الدفع نجح ، يتم خصم رسوم من بطاقة الائتمان.

الطريقة الوحيدة لهذا المستخدم لتجاوزها هي استعادة الشراء.

هل حصل أي شخص على إصلاح لهذا؟ أنا أستخدم الإصدار 3.5.9

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