React-native-iap: buySubscription возвращает E_UNKNOWN, несмотря на успешную покупку

Созданный на 13 окт. 2018  ·  30Комментарии  ·  Источник: dooboolab/react-native-iap

Версия react-native-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 Есть ли способ получить более подробную информацию в тех случаях, когда это вызывает ошибку, или это стандартный ответ от API 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 небезопасно и может вызвать неожиданное поведение. Я исправил это и надеюсь, что теперь он работает нормально на всех устройствах. Пожалуйста, проверьте это.

Пожалуйста, откройте снова, если проблема не исчезнет.

@dooboolab
У меня все еще возникает эта проблема при использовании buySubscription() с пользователем тестера песочницы с iPhone 6S.

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

@danrevah Итак, вы попробовали нашу новую версию - 2.3.15 ? @JJMoon Не могли бы вы проверить это еще раз?

@dooboolab да, я использую эту версию.

@danrevah Пожалуйста, попробуйте 2.3.16 .

@dooboolab однажды это сработало, но пока я пытался снова, я продолжал получать эти ошибки. (используется v 2.3.17)

@JJMoon У вас есть какие-нибудь подсказки по этому

Я повторно открыл проблему. cc @JJMoon

Если за этот вопрос проголосует больше людей, мы постараемся еще больше разобраться в этом вопросе.

@danrevah Надеюсь, вы
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267 -CH7-SW6
Чтобы протестировать подписку в режиме песочницы, вам необходимо через некоторое время повторно приобрести подписку.
И вам может потребоваться отменить его, чтобы купить снова.
И сервер песочницы Apple выдает странные реакции, что усложняет тест.

Если проблема в случае @danrevah

@JJMoon Я столкнулся с той же проблемой. любое решение? buySubscription вызывает исключение, но оплата удерживается. Мне нужны данные результатов для их хранения и проверки.
@hyochans

+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' .

@hyochan
Извините за мое незнание, но не думаю, что я правильно понял. Я следовал тем же основам примера, что соответствовало моему сценарию. Я создал абстракцию, которая обрабатывает это обещание с помощью async / await. Этот объект подписки возвращается моей абстракцией.

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;
}

@cbfranca
``
статическая покупкаSubscriptionIOS = async (subscriptionID) => {
ждать KinvoBilling.getSubscriptions ();
пытаться {
const PurchaseResult = ждать KinvoBilling.buySubscription (subscriptionID);
} catch (err) {
const subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS (async (покупка) => {
// dooboolab => здесь проверяем вызов.
this.setState ({квитанция: Purchase.transactionReceipt}, () => this.goToNext ());
subscription.remove ();
}
}
вернуть PurchaseResult;
}
`` ''

Проверьте код выше. Я думаю, вам нужно реорганизовать свой код, чтобы он соответствовал его жизненному циклу.

@hyochan У меня не работает.

Мой тестовый сценарий:

  • Приобретите ежемесячный план подписки - ОК
  • Переход на годовой план подписки - сбой и слушатель не работает

Еще одно сомнение: нужно ли мне также использовать finishTransaction () в подписках?

Я тоже вижу эту ошибку. И я думаю, что знаю один способ воспроизвести это.

Версия react-native-iap

^ 2.4.1

Версия react-native

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) и переустановить с новым пользователем App Store, но безуспешно. Единственный способ избавиться от этого поведения - стереть данные с устройства. Как только я это сделал, я больше не мог воспроизводить эту ошибку.

Фактическое поведение

  1. buySubscription ()
  2. Выберите "Продолжить" при отображении модального окна "Условия подписки" для iOS.
  3. Нажмите OK, когда отображается модальное окно 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. Установите приложение из App Store (или пригласите тестового пользователя в TestFlight и установите TestFlight, а затем приложение через TestFlight)
  3. Приобрести подписку в приложении
  4. Пусть срок подписки истечет
  5. Выйти из системы iOS Apple ID (Настройки> Apple ID, Выйти)
  6. Войти новый Apple ID
  7. Приобрести подписку в приложении

Надеюсь, это кому-то поможет!

@hyochan

После многих попыток я все еще сталкиваюсь с той же проблемой и даже больше. В приведенном ниже коде RNIap.buySubscription (sku) возвращает значение undefined. Пожалуйста, кто-нибудь решил?

``
статическая покупкаSubscriptionIOS = async (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 Есть ли способ получить более подробную информацию в тех случаях, когда это вызывает ошибку, или это стандартный ответ от API StoreKit? В каждом случае ошибки появляется сообщение «Не удается подключиться к iTunes Store», даже если покупка прошла успешно.

У нас очень похожая проблема с 3.4.6: первая попытка покупки не удалась с E_UNKOWN , повторная попытка завершилась успешно. Однако для нас это происходит с buyProduct , а не с buySubscription . @hyochan, может быть, это та же

Здравствуйте! У меня такая же проблема после вызова RNIap.requestSubscription (). Я получаю неопределенный результат, но платеж прошел успешно, с кредитной карты снята оплата.

Единственный способ этого пользователя обойтись без покупки - это восстановить покупку.

У кого-нибудь есть исправление для этого? Я использую версию 3.5.9

Была ли эта страница полезной?
0 / 5 - 0 рейтинги