React-native-iap: `Android.test.canceled` рдЙрддреНрдкрд╛рдж рдЦрд░реАрджрдирд╛ рдРрдк рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рджреЗрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдЬрдире░ 2019  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dooboolab/react-native-iap

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рджреЗрд╢реА-рдЖрдИрдПрдкреА рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг

реи.рек.реж-рдмреАрдЯрд╛ 8

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг

0.55.4

рдЬрд┐рди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдореЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рд╣реБрдИ (IOS рдпрд╛ Android рдпрд╛ рджреЛрдиреЛрдВ?)

рдПрдВрдбреНрд░реЙрдпрдб

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░

рдЦрд░реАрдж рдХрд╛ рд╡рд╛рджрд╛ E_USER_CANCELLED, "Cancelled." рд╕рд╛рде рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░

рдРрдк рдХреНрд░реИрд╢:

01-28 11:21:58.177 2773-2919/ D/RNIapModule: buyItemByType (type: inapp, sku: android.test.canceled, oldSku: null, prorationMode: 0) responseCode: 0(OK)
01-28 11:22:03.509 2773-2919/ D/RNIapModule: Purchase Updated Listener
01-28 11:22:03.509 2773-2919/ D/RNIapModule: responseCode: 0

                                                                       --------- beginning of crash
01-28 11:22:03.510 2773-2919/ E/AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
                                                                          Process: , PID: 2773
                                                                          java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
                                                                              at com.dooboolab.RNIap.RNIapModule$11.onPurchasesUpdated(RNIapModule.java:436)
                                                                              at com.android.billingclient.api.BillingClientImpl$1.onReceiveResult(BillingClientImpl.java:151)
                                                                              at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:50)
                                                                              at android.os.Handler.handleCallback(Handler.java:789)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:98)
                                                                              at android.os.Looper.loop(Looper.java:164)
                                                                              at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:192)
                                                                              at java.lang.Thread.run(Thread.java:764)

рдкрд░реАрдХреНрд╖рдгрд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг (рдПрдореБрд▓реЗрдЯрд░? рд░рд┐рдпрд▓ рдбрд┐рд╡рд╛рдЗрд╕?)

рдЕрд╕рд▓реА рдбрд┐рд╡рд╛рдЗрд╕

рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо

  • Android рд╕реНрдереИрддрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдЙрддреНрдкрд╛рдж android.test.canceled рдЦрд░реАрджреЗрдВ
  • рдЬрдм onPurchasesUpdated рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ NPE рдХреЛ 436 Purchase purchase = purchases.get(0); рд▓рд╛рдЗрди рдкрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ purchases @Nullable рдФрд░ ┬аnull рдЬрдмрдХрд┐ responseCode 0 рд╣реИред
ЁЯРЫ bug ЁЯЪ╢ЁЯП╗ stale ЁЯдЦ android

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@ рдЬреЛрдВрдорд╛рд░реНрдЯреЗрд▓ рд╣рд╛рдБред рдореИрдВ рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕рдордп рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВред рд╣рдо рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдЦреБрдж рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ ..

рд╕рднреА 5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред @johnmartel рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рд╣рдореЗрдВ PR рджреЗрдВрдЧреЗ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

@hyochan рдореИрдВ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдПрдХ рдкреАрдЖрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░реВрдВрдЧрд╛ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд╛рдж рдореЗрдВ рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдХрдореА рд╣реИ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдореИрдВ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред

@ рдЬреЛрдВрдорд╛рд░реНрдЯреЗрд▓ рд╣рд╛рдБред рдореИрдВ рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕рдордп рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВред рд╣рдо рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдЦреБрдж рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ ..

рдЕрдЧрд░ purchases null рдЬреИрд╕реЗ рд╣реИрдВ, рддреЛ рдХреИрд╕реЗ рдЪреЗрдХ рдХрд░реЗрдВ?

  PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    <strong i="8">@Override</strong>
    public void onPurchasesUpdated(int responseCode, <strong i="9">@Nullable</strong> List<Purchase> purchases) {
      Log.d(TAG, "Purchase Updated Listener");
      Log.d(TAG, "responseCode: " + responseCode);

      if (responseCode != BillingClient.BillingResponse.OK) {
        rejectPromisesWithBillingError(PROMISE_BUY_ITEM, responseCode);
        return;
      }

+      if (purchases == null) {
+        rejectPromisesWithBillingError(PROMISE_BUY_ITEM , responseCode);
+       return;
+      }

      Purchase purchase = purchases.get(0);

     // ...

рдЕрд░реЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдХреНрдпрд╛ рдореБрджреНрджрд╛ рдареАрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдЕрднреА рднреА рд╕рдореБрджрд╛рдп рдХреЗ рдзреНрдпрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рди рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмрдВрдж рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ "рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП" рдпрд╛ "рдЕрдЪреНрдЫрд╛ рдкрд╣рд▓рд╛ рдореБрджреНрджрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд▓реЗрдмрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jvandenaardweg picture jvandenaardweg  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ramondelmondo picture ramondelmondo  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

summonerriftofficial picture summonerriftofficial  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hakkikonu picture hakkikonu  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fergalindez picture fergalindez  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ