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

予想される行動

エラーはスローされません。 購入は成功しました(ライブおよび実稼働中)

実際の動作

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

テストされた環境(エミュレーター?実デバイス?)

実デバイス。 ライブ顧客。 非常に一貫性がない

動作を再現する手順

サンドボックスユーザーで手順をテストすると、エラーを再現できません。

🐛 bug 📱 iOS

最も参考になるコメント

:+1:この問題は問題なく発生しています。 現在、ユーザーの約10%に発生しているようです。 このリスナーを追加してみますが、最終的にはこれが優れたソリューションだとは思いません。 @hyochanこれがスローされた場合に、より詳細な情報を取得する方法はありますか、それともStoreKit APIからの標準的な応答ですか? 購入が成功した場合でも、すべてのエラーケースで「iTunesStoreに接続できません」というメッセージが表示されます。

全てのコメント30件

@ Gaia-Nutritionこの古い問題をチェックしていただけませんか? 同じ原因かもしれません。
https://github.com/dooboolab/react-native-iap/issues/201

#201の@JJMoonは、エラーがE_DEVELOPER_ERRORあり、 getSubscriptions()を使用して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": "..." }

以前のバージョンの本番環境でこのバグを再現したため、モジュールを更新しました。

興味深いのは、これが発生すると、ユーザーの復元購入も失敗することです。 iOSユーザーの約1%にしか発生しません。

@fierysolid同じケースですが、iOSでの購入の約5%が失敗しました。 顧客が再度購入しようとすると、復元購入ポップアップが表示されます。

皆さんこんにちは。 今日の新しいバージョンである2.3.15修正されることを願っています。 iOSでNSDictionaryを使用することは、純粋に安全ではなく、予期しない動作を引き起こす可能性があることに気づきました。 私はこれを修正し、すべてのデバイスで問題なく動作することを願っています。 これをテストしてください。

それでも問題が発生する場合は、再度開いてください。

@dooboolab
iPhone 6SのサンドボックステスターユーザーでbuySubscription()を使用しているときにも、この問題が発生します。

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

@danrevahでは、 2.3.15新しいバージョンを試しましたか? @JJMoonこれをもう一度テストしていただけますか?

@dooboolabはい私はそのバージョンを使用しています。

@danrevah 2.3.16お試しください。

@dooboolab一度は

@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
サンドボックスモードでサブスクリプションをテストするには、しばらくしてからサブスクリプションを再購入する必要があります。
また、再度購入するにはキャンセルが必要な場合があります。
また、Appleサンドボックスサーバーからの奇妙な反応がいくつかあり、テストがより困難になっています。

@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
`` `
static PurchaseSubscriptionIOS = async(subscriptionID)=> {
KinvoBilling.getSubscriptions();を待つ
{を試してください
const PurchaseResult = await KinvoBilling.buySubscription(subscriptionID);
} catch(err){
const Subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS(async(purchase)=> {
// dooboolab =>ここで呼び出しを確認します。
this.setState({レシート:purchase.transactionReceipt}、()=> this.goToNext());
Subscription.remove();
}
}
PurchaseResultを返します。
}
「」

上記のコードを確認してください。 ライフサイクルに合わせてコードをリファクタリングする必要があると思います。

@hyochan私には

私のテストシナリオは次のとおりです。

  • 月額サブスクリプションプランを購入する-OK
  • 年間サブスクリプションプランへのアップグレード-失敗し、リスナーが機能しない

もう1つの疑問:サブスクリプションでも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ユーザーを悩ませている問題だとオンラインで読んだことがあります。1つのiTunesアカウントでアプリを購入した後、電話を新しいiTunesアカウントに切り替えても、アプリは引き続きパスワードを要求します。古いiTunesアカウント。

アプリ(およびTestFlight)を削除し、新しいAppStoreユーザーで再インストールしようとしましたが無駄になりました。 この動作を取り除く唯一の方法は、デバイスをワイプすることでした。 これを実行すると、このエラーを再現できなくなりました。

実際の動作

  1. BuySubscription()
  2. iOSモーダル「サブスクリプション条件」が表示されたら、[続行]を選択します
  3. iOSモーダル「サブスクリプションの確認」が表示されたら[OK]を選択します
  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 StoreConnectでテストユーザーを作成します
  2. App Storeからアプリをインストールします(またはテストユーザーをTestFlightに招待し、TestFlightをインストールしてから、TestFlightを介してアプリをインストールします)
  3. アプリでサブスクリプションを購入する
  4. サブスクリプションを期限切れにする
  5. ログアウトiOSApple ID([設定]> [Apple ID]、[サインアウト])
  6. 新しいAppleIDにログインする
  7. アプリでサブスクリプションを購入する

これが誰かを助けることを願っています!

@hyochan

多くのことを試した後、私はまだ同じ問題などを抱えています。 以下のコードでは、RNIap.buySubscription(sku)はundefinedを返します。 誰かがそれを解決しましたか?

`` `
static PurchaseSubscriptionIOS = 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これがスローされた場合に、より詳細な情報を取得する方法はありますか、それともStoreKit APIからの標準的な応答ですか? 購入が成功した場合でも、すべてのエラーケースで「iTunesStoreに接続できません」というメッセージが表示されます。

3.4.6でも非常によく似た問題があります。最初の購入試行はE_UNKOWNで失敗し、再試行は成功します。 ただし、これはbuyProductではなく、 buySubscriptionます。 @hyochanこれはまだ同じ根本原因である可能性がありますか?

こんにちは! RNIap.requestSubscription()を呼び出した後、同じ問題が発生します。未定義の結果が表示されますが、支払いは成功し、クレジットカードに請求されます。

そのユーザーがそれを乗り越える唯一の方法は、購入を復元することです。

誰かがこれを修正しましたか? バージョン3.5.9を使用しています

このページは役に立ちましたか?
0 / 5 - 0 評価