React-native-iap: getAvailablePurchasesは毎回異なる配列を返したす

䜜成日 2019幎08月09日  Â·  13コメント  Â·  ゜ヌス: dooboolab/react-native-iap

react-native-iapのバヌゞョン

3.3.9ただし、3.0.0以前でもこれが発生したす

react-nativeのバヌゞョン

0.59.9

゚ラヌに盎面したプラットフォヌムIOSたたはAndroid、あるいはその䞡方

iOSAndroidではテストされおいたせん

予想される行動

getAvailablePurchasesを呌び出すたびに同じ配列
毎回同じ配列長

実際の動䜜

getAvailablePurchases呌び出すたびに異なる配列
getAvailablePurchases呌び出すたびに異なる配列の長さ

テストされた環境゚ミュレヌタヌ実デバむス

実デバむス

動䜜を再珟する手順

これは倚くのトランザクションでのみ衚瀺されるず思いたすが、これを確認するこずはできたせん。 私のサンドボックスアカりントには50以䞊のトランザクションがありたす。

handleOnPressRestore = async () => {
  return this.setState({ isLoadingRestorePurchases: true }, async () => {
    try {

      // Get the previous purchases of the current user
      const purchases = await RNIap.getAvailablePurchases();

      // Get the latest receipt from the purchases to validate
      const { transactionReceipt, productId, transactionDate } = this.getLatestPurchase(purchases);

      console.log(purchases.length, productId, transactionDate);

      // Validate the receipt on our server
      await this.props.validateSubscriptionReceipt(productId, transactionReceipt);

      // The validation result is handled in componentDidUpdate
    } catch (err) {
      throw err;
    } finally {
      this.setState({ isLoadingRestorePurchases: false });
    }
  });
}

getLatestPurchase = (purchases: RNIap.ProductPurchase[]): RNIap.ProductPurchase => {
  // First, sort the array, so the latest purchase is on top
  // https://github.com/dooboolab/react-native-iap/issues/532#issuecomment-503174711
  const sortedPurchases = purchases.sort((a, b) => b.transactionDate - a.transactionDate);

  const purchase = sortedPurchases[0];

  return purchase;
}

䞊蚘のコヌドでは、「賌入を埩元」を抌すず、毎回異なるログが衚瀺されたす。

「賌入を埩元」を6回抌し、その間に結果が衚瀺されるたで埅ちたす。

// purchases.length, productId, transactionDate
9 "com.app.sub" 1565182529000
21 "com.app.sub" 1565181329000
22 "com.app.sub" 1565183001000
42 "com.app.sub" 1565183001000
53 "com.app.sub" 1565182529000
55 "com.app.sub" 1565183001000
15 "com.app.sub" 1565182529000

配列は垞に同じであるず思いたすよね ここで䜕が起こっおいるのですか

getAvailablePurchases()の結果は、実行するたびに異なりたす

📱 iOS 🙏 help wanted 🚶🏻 stale

最も参考になるコメント

たた、すべおのトランザクションでルヌプを実行したしたが、finishTransactionIOSでそれらを削陀できたせんでした。 私のトランザクションは自動曎新サブスクリプションです。

党おのコメント13件

私もこれを芋おいたす。 それに぀いお本圓に危険なこずは、最新の有効なレシヌトが結果に含たれおいない可胜性があるずいうこずです。

このモゞュヌルのコヌドを芋るず、このモゞュヌルはrestoreCompletedTransactions()が返すものを事実䞊通過しおいるだけなので、正盎なずころApple偎の問題のように芋えたす。

getPurchaseHistory()がサブスクリプションに䜿甚するのに適した代替手段であるかどうか疑問に思いたす。 私は珟圚、それを代替手段ずしお䜿甚しおいたす。これにより、信頌できる結果が埗られたす。 私のアプリには他に賌入はなく、サブスクリプションのみがありたす。

このパッケヌゞのiapドキュメントに蚘茉されおいるように、 getAvailablePurchases()は消耗品に぀いお話したす。 サブスクリプションは、「消耗品」たたは「非消耗品」の補品ではありたせん。 これは「自動曎新可胜なサブスクリプション」なので、 getPurchaseHistory()十分ですか

Screenshot 2019-08-16 at 18 11 13

getPurchaseHistoryでもさたざたな配列の長さが埗られるこずがわかりたした。 リク゚ストの頻床が圱響したようです。 結局、これは私たちにずっお実際には問題ではないこずが刀明したした。怜蚌のためにトランザクションの領収曞のいずれかが送信されるず、すべおの領収曞がAppleによっおlatest_receipt_info配列で返されたした。これは私たちにずっお重芁なこずです。

同じ問題が発生しおいたすサンドボックスモヌド゚ラヌかどうかはわかりたせん。 たた、実際のデバむス内でApple IDを切り替えるず、別のアカりントで行われた賌入が返されたす。

䟋
1-アカりント[email protected]で賌入したした
2- AppleIDを
3-getAvailablePurchasesは、test @ test.comアカりントで行われた賌入のtransactionIdを返したす

私が芋぀けたもう1぀の問題は、デバむスを埩元するず出荷時蚭定にリセット、 getPurchaseHistory()ずgetAvailablePurchases䞡方の方法でランダムな結果が埗られるこずです。

賌入を埩元するためのAppleの察応は次のずおりです。

"Users restore transactions to maintain access to content they've already purchased. For example, when they upgrade to a new phone, they don't lose all of the items they purchased on the old phone. Include some mechanism in your app to let the user restore their purchases, such as a Restore Purchases button."

@ ssg-lukeが以前に蚀ったように、 restoreCompletedTransactionsのさたざたな結果に関するApple DeveloperForumsトピックを芋぀けたした。

https://forums.developer.apple.com/thread/115242

たぶん、これは関連しおいたす

アプリがただfinishTransactionを呌び出しおいない、倚くのトランザクションを持぀1人のナヌザヌを参照しおいるようです。
https://forums.developer.apple.com/thread/115242#thread -post-355444

同じデバむスに他のサンドボックスアカりントがありたす。 それでは、同じデバむス䞊での異なるアカりントのトランザクションが台無しにされ、「完了」しおいない可胜性がありたすか

ただし、すべおのトランザクションでルヌプを実行し、すべおのトランザクションでfinishTransactionIOSを呌び出したした。 しかし、それはそれらをなくしたり、 getAvailablePurchases()信頌できる出力をもたらしたりしたせん

@fcandianiが経隓するこずを説明するこずもできたす。

getPurchaseHistoryでもさたざたな配列の長さが埗られるこずがわかりたした。 リク゚ストの頻床が圱響したようです。 結局、これは私たちにずっお実際には問題ではないこずが刀明したした。怜蚌のためにトランザクションの領収曞のいずれかが送信されるず、すべおの領収曞はAppleによっおlatest_receipt_info配列で返されたした。

情報@ ssg-lukeをありがずう、私は同じこずをする぀もりです。

たた、すべおのトランザクションでルヌプを実行したしたが、finishTransactionIOSでそれらを削陀できたせんでした。 私のトランザクションは自動曎新サブスクリプションです。

ほが同じ向き。 私は問題を䜜成しおいたしたが、他の人が問題ず解決策を芋぀けるのに圹立぀すべおの情報をここに眮くこずにしたした。

react-native-iapのバヌゞョン

3.5.9

react-nativeのバヌゞョン

0.60.5

゚ラヌに盎面したプラットフォヌムIOSたたはAndroid、あるいはその䞡方

iOS

  • 同じコヌドがAndroidで完党に機胜しおおり、すでに本番環境にありたす

予想される行動

ナヌザヌが䞀床サブスクラむブするず、 getAvailablePurchasesは1回の賌入のみを返す必芁がありたす

実際の動䜜

getAvailablePurchasesは、耇数の賌入を返しおいたす。

テストされた環境゚ミュレヌタヌ実デバむス

新しいサンドボックスアカりントを持぀実際のデバむス。

動䜜を再珟する手順

  • https://appstoreconnect.apple.com/access/testersでサンドボックステストナヌザヌを䜜成し
  • xcodeでプロゞェクトをビルドしお実行する
  • getAvailablePurchases呌び出し、
  • いく぀かの補品を賌読する
  • 私のpurchaseUpdatedListenerが呌び出され、 undefinedだけを返すRNIap.finishTransactionIOS(subscription.transactionId);を呌び出したす予想どおり
  • getAvailablePurchasesに電話し、 1回の賌入を返したす予想どおり
  • アプリをリロヌド
  • getAvailablePurchases呌び出し、それぞれが異なるtransactionId持぀2぀の賌入を返したす。
{
   originalTransactionDateIOS: 1571144840000
   originalTransactionIdentifierIOS: "1000000579413333"
   productId: "io.appmasters.lowcarb.development"
   transactionDate: 1571145019000
   transactionId: "1000000579415509"
   transactionReceipt: "MIIVnQYJKoZIhvcN..."
},
{
   originalTransactionDateIOS: 1571144840000
   originalTransactionIdentifierIOS: "1000000579413333"
   productId: "io.appmasters.lowcarb.development"
   transactionDate: 1571144839000
   transactionId: "1000000579416705"
   transactionReceipt: "MIIVnQYJKoZIhvcN...."
}
  • アプリを再床リロヌドしたす
  • getAvailablePurchases呌び出すず、 3぀の賌入が返され、それぞれが異なるtransactionId 前の結果ず同じではありたせん。
{
   originalTransactionDateIOS: 1571144840000
   originalTransactionIdentifierIOS: "1000000579413333"
   productId: "io.appmasters.lowcarb.development"
   transactionDate: 1571145739000
   transactionId: "1000000579423546"
   transactionReceipt: "MIIb1AYJKoZIhvcN..."
},{
   originalTransactionDateIOS: 1571144840000
   originalTransactionIdentifierIOS: "1000000579413333"
   productId: "io.appmasters.lowcarb.development"
   transactionDate: 1571145019000
   transactionId: "1000000579426352"
   transactionReceipt: "MIIb1AYJKoZI..."
},{
   originalTransactionDateIOS: 1571144840000
   originalTransactionIdentifierIOS: "1000000579413333"
   productId: "io.appmasters.lowcarb.development"
   transactionDate: 1571144839000
   transactionId: "1000000579426353"
   transactionReceipt: "MIIb1AYJKoZIhvcN..."
}
  • アプリを再床リロヌドしたす
  • getAvailablePurchases呌び出し、それぞれが異なるtransactionId持぀4぀の賌入を返したす前の結果ず同じではありたせん...

私がドキュメントで読んだこずやAndroidで起こったこずから、これは正しい動䜜ではないようです。

私はどんな助けにも感謝したす。

getAvaialblePurchasesは、サンドボックステストアカりントで150以䞊の結果を返したす。 getAvailablePurchasesをたったく䜿甚せず、最埌の賌入をデバむスずサヌバヌに保存するこずにしたした。 アプリが削陀されたり、ナヌザヌが新しい電話に移動した堎合でも、サヌバヌで最埌に賌入したのは、䌚瀟のナヌザヌIDずプラットフォヌムiOSたたはAndroidに関連付けられおいたす。 getAvailablePurchasesを呌び出すのに1分近くかかり、堎合によっおはこれを呌び出しお、耇数の賌入を埩元しようずする賌入曎新リスナヌをトリガヌしたす。 フロヌを次のように倉曎したした。
1ナヌザヌがデバむスにログむンするずき
aナヌザヌずプラットフォヌムのサヌバヌで有効な最埌の賌入があるかどうかを確認したす。
bサヌバヌにレコヌドがない堎合は、DBにロヌカルに保存された賌入があるかどうかを確認したす
c䜕もないか、期限切れの堎合は、サブスクリプションビュヌを衚瀺したす。
最初はgetAvailablePurchasesを呌び出しお、最埌の賌入がただ有効かどうかを確認しようずしおいたした。 これが他の人に圹立぀かどうかはわかりたせんが、これで問題が発生するこずはもうありたせん。 私たちは反応59にあり、それは私たちが察凊しなければならないもう1぀の痛みです。

@ramakulaず、ナヌザヌがサブスクリプションをキャンセルした堎合はどうなりたすか

あなたが蚀ったように、あなたは終了日たであなたのデヌタベヌスにサブスクリプションを保持し、もう賌入できないものを「芋る」でしょう。

ねえ、最近この問題に関する掻動はなかったようです。 問題は修正されたしたか、それずもコミュニティの泚意が必芁ですか それ以䞊のアクティビティが発生しない堎合、この問題は解決される可胜性がありたす。 この問題に「ディスカッション甚」たたは「良い最初の問題」ずいうラベルを付けるこずもできたす。開いたたたにしおおきたす。 貢献しおいただきありがずうございたす。

長期間䜿甚されなかった埌、この問題を解決したす。 この問題が最新リリヌスでも匕き続き発生する堎合は、最新の情報を䜿甚しお新しい問題を䜜成しおください。

getAvaialblePurchasesは、サンドボックステストアカりントで150以䞊の結果を返したす。 getAvailablePurchasesをたったく䜿甚せず、最埌の賌入をデバむスずサヌバヌに保存するこずにしたした。 アプリが削陀されたり、ナヌザヌが新しい電話に移動した堎合でも、サヌバヌで最埌に賌入したのは、䌚瀟のナヌザヌIDずプラットフォヌムiOSたたはAndroidに関連付けられおいたす。 getAvailablePurchasesを呌び出すのに1分近くかかり、堎合によっおはこれを呌び出しお、耇数の賌入を埩元しようずする賌入曎新リスナヌをトリガヌしたす。 フロヌを次のように倉曎したした。

  1. ナヌザヌがデバむスにログむンするずき
    aナヌザヌずプラットフォヌムのサヌバヌで有効な最埌の賌入があるかどうかを確認したす。
    bサヌバヌにレコヌドがない堎合は、DBにロヌカルに保存された賌入があるかどうかを確認したす
    c䜕もないか、期限切れの堎合は、サブスクリプションビュヌを衚瀺したす。
    最初はgetAvailablePurchasesを呌び出しお、最埌の賌入がただ有効かどうかを確認しようずしおいたした。 これが他の人に圹立぀かどうかはわかりたせんが、これで問題が発生するこずはもうありたせん。 私たちは反応59にあり、それは私たちが察凊しなければならないもう1぀の痛みです。

領収曞から最新の賌入品を入手できるず思いたす。 exclude-old-transactionstrueを䜿甚しおナヌザヌの受信を確認するこずにより、最新のサブスクリプション情報を取埗できたす自動曎新可胜なタむプの堎合のみ。 この方法を䜿甚しお、自動曎新可胜なサブスクリプションの賌入を埩元できるず思いたす。 しかし、これが理想的な方法かどうかはわかりたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡