2.4.0- ๋ฒ ํ 8
0.55.4
๊ธฐ๊ณ์ ์ธ์กฐ ์ธ๊ฐ
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.test.canceled
onPurchasesUpdated
๊ฐ ํธ์ถ๋๋ฉด purchases
๊ฐ @Nullable
์ด๊ณ ย null
์ด๊ณ responseCode
์ด๋ฏ๋ก 436 ํ Purchase purchase = purchases.get(0);
์์ NPE๊ฐ ๋ฐ์ํฉ๋๋ค responseCode
๋ 0์
๋๋ค.์๋ฃจ์
์ ๋ฌธ์ ๋ฅผ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. @johnmartel ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ์๊ณ ์๋ค๋ฉด PR
๋ฅผ ์ฃผ์
จ์ผ๋ฉด ํฉ๋๋ค.
@hyochan ์ง๊ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค. ์ต๋ํ ๋นจ๋ฆฌ PR์ ์ ์ถํ๊ฒ ์ต๋๋ค. ๋ฌธ์ ๋ lib์ ํ ์คํธ๊ฐ ์ฌ๊ฐํ๊ฒ ๋ถ์กฑํ๊ณ ๋ค๋ฅธ ๊ฒ์ ๊นจ๋จ๋ฆฌ์ง ์๋์ง ํ์ธํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
@johnmartel ๋ค. ๋๋ ํญ์ ์ผ๋ถ ํ ์คํธ ๋ชจ๋์ ๊ตฌํํ๊ณ ์ถ์ง๋ง ํ์ฌ๋ ํญ์ ์๊ฐ์ด ๋ถ์กฑํฉ๋๋ค ๐ฟ. ๋ฆด๋ฆฌ์คํ๊ธฐ ์ ์ ์ง์ ๋ฐํ์์ ํ์ธํด์ผํฉ๋๋ค.
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);
// ...
์๋ ํ์ธ์. ์ต๊ทผ์ด ๋ฌธ์ ์ ๋ํ ํ๋์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋์์ต๋๊น? ์๋๋ฉด ์ฌ์ ํ ์ปค๋ฎค๋ํฐ์์ฃผ์๊ฐ ํ์ํฉ๋๊น? ์ด ๋ฌธ์ ๋ ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์ข ๊ฒฐ ๋ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ "ํ ๋ก ์ฉ"๋๋ "์ข์ ์ฒซ ๋ฒ์งธ ๋ฌธ์ "๋ก ํ์ ํ ์๋ ์์ผ๋ฉฐ ์ด์ด ๋๊ฒ ์ต๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@johnmartel ๋ค. ๋๋ ํญ์ ์ผ๋ถ ํ ์คํธ ๋ชจ๋์ ๊ตฌํํ๊ณ ์ถ์ง๋ง ํ์ฌ๋ ํญ์ ์๊ฐ์ด ๋ถ์กฑํฉ๋๋ค ๐ฟ. ๋ฆด๋ฆฌ์คํ๊ธฐ ์ ์ ์ง์ ๋ฐํ์์ ํ์ธํด์ผํฉ๋๋ค.