React-native-iap: 购买成功后,buySubscription返回E_UNKNOWN

创建于 2018-10-13  ·  30评论  ·  资料来源: dooboolab/react-native-iap

版本的react-native-iap

2.2.2 (因为iOS上的任何较新版本由于#279而失败)

您遇到错误的平台(IOS或Android还是两者兼有?)

的iOS

预期行为

没有错误应该抛出。 购买成功(正在生产)

实际行为

Promise返回E_UNKNOWN错误
我们的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 API的标准响应? 在每种错误情况下,即使购买成功,该消息似乎仍为“无法连接到iTunes Store”。

所有30条评论

@ Gaia-Nutrition您会检查这个旧问题吗? 原因可能是相同的。
https://github.com/dooboolab/react-native-iap/issues/201

@JJMoon在#201中,错误是E_DEVELOPER_ERROR ,是由于未使用getSubscriptions()填充validProducts列表引起的。
但是,我在尝试执行结帐之前就调用了该函数,并且还会收到其他错误。
但是现在我考虑了。 可能发生在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同样,在iOS上购买失败的用户大约占5%。 当客户再次尝试购买时,他会弹出恢复购买的提示。

嗨,大家好。 希望今天我们的新版本( 2.3.15 。 我已经注意到,纯粹在ios中使用NSDictionary并不安全,可能会导致意外行为。 我已修复此问题,希望现在在所有设备中都能正常运行。 请测试一下。

当仍然遇到问题时,请重新打开。

@dooboolab
当将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

我已经重新打开了问题。 cc @JJMoon

如果有更多的人对该问题投赞成票,我们将更加努力地深入研究。

@danrevah希望您参考此文档。
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267 -CH7-SW6
要在沙盒模式下测试订阅,您需要在一段时间后重新购买订阅。
您可能需要取消它才能再次购买。
苹果沙盒服务器有一些奇怪的反应,这使得测试更加困难。

如果@JJMoon问题是问题,我们可以再次关闭它。 如果您仍然需要帮助,请重新打开。 @danrevah

@JJMoon我也遇到过同样的问题。 有什么办法吗? buySubscription引发异常,但扣除了付款。 我需要具有结果数据来存储和验证它们。
@hyochans

+1我有同样的问题

也尝试在buySubscription使用addAdditionalSuccessPurchaseListenerIOS 。 这与#307中的问题相同。

也尝试在buySubscription使用addAdditionalSuccessPurchaseListenerIOS 。 这与#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
```
静态purchaseSubscriptionIOS =异步(subscriptionID)=> {
等待KinvoBilling.getSubscriptions();
尝试{
const buyResult =等待KinvoBilling.buySubscription(subscriptionID);
} catch(err){
const subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS(async(purchase)=> {
// dooboolab =>在此处检查呼叫。
this.setState({收据:purchase.transactionReceipt},()=> this.goToNext());
subscription.remove();
}
}
返回purchaseResult;
}
``

检查上面的代码。 我认为您需要重构代码以适应其生命周期。

@hyochan不适合我。

我的测试场景是:

  • 购买月度订阅计划-确定
  • 升级到年度订阅计划-失败并且听众无法正常工作

另一个疑问:我是否也必须在订阅中使用finishTransaction()?

我也看到了这个错误。 我想我知道一种复制它的方法。

版本的react-native-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),并使用新的App Store用户重新安装,但无济于事。 我可以摆脱这种行为的唯一方法是擦拭设备。 完成此操作后,我将无法重现此错误。

实际行为

  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. 从App Store安装应用程序(或邀请测试用户参加TestFlight并安装TestFlight,然后通过TestFlight安装应用程序)
  3. 在应用中购买订阅
  4. 让订阅过期
  5. 注销iOS Apple ID(设置> Apple ID,注销)
  6. 登录新的Apple ID
  7. 在应用中购买订阅

希望这对某人有帮助!

@hyochan

在尝试了许多事情之后,我仍然遇到相同的问题,甚至更多。 在下面的代码中,RNIap.buySubscription(sku)返回未定义。 拜托,有人解决了吗?

```
静态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 API的标准响应? 在每种错误情况下,即使购买成功,该消息似乎仍为“无法连接到iTunes Store”。

我们在3.4.6中有一个非常相似的问题:第一次购买尝试失败,并导致E_UNKOWN ,重试成功。 但是,对我们来说,这发生在buyProduct而不是buySubscription@hyochan这可能仍然是相同的根本原因吗?

你好! 致电RNIap.requestSubscription()后,我遇到同样的问题,但未得到确定的结果,但付款成功,信用卡已收费。

该用户摆脱困境的唯一方法是恢复购买。

有没有人解决这个问题? 我正在使用3.5.9版

此页面是否有帮助?
0 / 5 - 0 等级