"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.55.4"
"react-native-iap": "^ 2.3.2"
๊ธฐ๊ณ์ ์ธ์กฐ ์ธ๊ฐ
์ ๋ฐ ๋์์ฃผ์ธ์.์ด ๋ฌธ์ ๋ฅผ ์ฆ์ ํด๊ฒฐํด์ผํฉ๋๋ค. ์ด๋ฏธ 2 ์ฒ๋ช ์ ์ฌ์ฉ์๊ฐ ์๊ธฐ ๋๋ฌธ์
๋ง์ ์ฅ์น์์ rniap๋ก ์ธํด ์ฑ์ด ์ถฉ๋ํฉ๋๋ค. Play Console์์์ด ์ค๋ฅ๋ก ์ธํด ์ถฉ๋์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค.
java.lang.RuntimeException :
๋ค์์ Play Console์ ๋ณด๊ณ ์์
๋๋ค.
https://ibb.co/gDxZQA
๋ฌด์์ ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด rniap์ ์ฌ์ฉํ์ต๋๋ค.
componentDidMount์์ :
{
const ๊ฒฐ๊ณผ = ๋๊ธฐ RNIap.initConnection ();
} catch (err) {
console.log (err);
}
componentWillUnmount์์ :
RNIap.endConnection ();
์ฐ๋ฆฌ์ ์ต์ ๋ฒ์ 2.3.19
์ ์ปด๋ฐฑ์ ์๋ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ ๋ชปํด. ์ฆ๊ฐ์ ์ธ ์ํฉ ์ด์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ iap ํจํค์ง๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค. ์ด์ 3k ๋ช ์ด์์ ์ฌ์ฉ์์๊ฒ ์ถฉ๋์ด ์์ต๋๋ค. ํ์ง๋ง ๊ฐ์ฌํฉ๋๋ค. ๋ค์ ํ๋ก์ ํธ์์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค.
์๋ ํ์ธ์,์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด ์ ์์ต๋๊น? ๋์ผํ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ๋ฒ์ 2.3.21์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
java.lang.RuntimeException :
com.facebook.react.bridge.CallbackImpl.invoke (CallbackImpl.java:28)
com.facebook.react.bridge.PromiseImpl.resolve (PromiseImpl.java:30)
com.dooboolab.RNIap.RNIapModule $ 4.run (RNIapModule.java:155)
com.dooboolab.RNIap.RNIapModule $ 3.onBillingSetupFinished (RNIapModule.java:124)
com.android.billingclient.api.BillingClientImpl $ BillingServiceConnection.onServiceConnected (BillingClientImpl.java:903)
android.app.LoadedApk $ ServiceDispatcher.doConnected (LoadedApk.java:1658)์์
android.app.LoadedApk $ ServiceDispatcher $ RunConnection.run (LoadedApk.java:1687)์์
android.os.Handler.handleCallback (Handler.java:789)
android.os.Handler.dispatchMessage (Handler.java:98)
android.os.Looper.loop (Looper.java:164)
android.app.ActivityThread.main (ActivityThread.java:6938)
java.lang.reflect.Method.invoke (๋ค์ดํฐ๋ธ ๋ฉ์๋)
com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:327)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
์ด๊ฒ์ ๋ด componentDidMount์ ๋๋ค.
const itemSKus = Platform.select({
ios: [
...
],
android: [
...
]
});
try {
const message = await RNIap.initConnection();
//console.log(`message = ${message}`);
const items = await RNIap.getProducts(itemSKus);
//console.log(`items = ${items.length}`);
//console.log(items);
this.props.storeInAppPurchaseList(items);
} catch (errorCode) {
console.log(`error rniap = ${errorCode}`);
}
@LinusU ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ฅผ ๋์ ์ฃผ์๊ฒ ์ต๋๊น? callback.run()
์ด ๋ฆด๋ฆฌ์ค์์ ์ถฉ๋ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ensureConnection
์์ callback
๊ฐ null์ธ์ง ํ์ธํด์ผํฉ๋๊น? ํ . runtime exception
์
๋๋ค.
์ฌ๊ธฐ์์ RuntimeException
์๋ฏธ๋ ๋ฌด์์
๋๊น? ๋ ์ด์ ์ ๋ณด๊ฐ ์์ต๋๊น? @hyochan ์ callback
๊ฐ null
ํ์ธ์? ๐ค
@LinusU ์๊ฒฌ์ ๋ณด๋ด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ํ์ฌ ์ ํ ๋ชจ๋ฅธ๋ค. ์๋์ ์ด์ ๋ผ์ธ์ด ์์ต๋๋ค.
RNIapModule.java
124 ํ,
callback.run();
์ถ๊ฐ ์์ด๋์ด๊ฐ ์์ต๋๊น?
@LinusU ์ด๊ฒ์ ๋ํด ์ ํ ๋ชจ๋ฅธ๋ค๋ฉด ์ด์ ์ ์์๋ ๊ณณ์ผ๋ก ๋กค๋ฐฑํ๋ ๊ฒ์ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
์ข์์, ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค :
์ด๋ค ์ด์ ๋ก ์ฐ๋ฆฌ๋ ์ฝ๋ฐฑ์ ๋ ๋ฒ ์ด์ ํธ์ถํ๋ฏ๋ก ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค!
@LinusU ๋น์ ์ด ํธ๋์ ์๊ธฐ ๋๋ฌธ์ PR
์ ์ฃผ์๊ฒ ์ต๋๊น?
๊ทธ ๋ฉ์๋์ RuntimeException์ด์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
if (!mInvoked) {
mJSInstance.invokeCallback(mCallbackId, Arguments.fromJavaArgs(args));
mInvoked = true;
}
์ด๊ฒ์ผ๋ก ์ถฉ๋ถํ์ง ์์ต๋๊น?
@hyochan ์ฃ์กํฉ๋๋ค, ์ด์ ๋ณผ ์๊ฐ์ด ์์์ต๋๋ค. ๊ณง ๋ณผ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@ Ilario17 ์๋ง๋ ์ด๋๊ฐ์ ๋ ผ๋ฆฌ ์ค๋ฅ๊ฐ ์์์ ํ์ํ๋ ๊ฒ์ ๋๋ค. ๊ณต์ ํ๊ฒ
ํธ์ง : ์, ๋ฌธ์ ๋ onBillingSetupFinished
๊ฐ ๋ ๋ฒ ์ด์ ๋ฐ์ํ๋ฉด ๋ฐ์ํฉ๋๋ค. ensureConnection
์๋ฃ๋๋ฉด (์ฆ, callback.run()
ํธ์ถํ๊ฑฐ๋ ์ ๋ฌ ๋ promise๋ฅผ ๊ฑฐ๋ถ ํ ๋) ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํด์ผํฉ๋๋ค. ๋๊ตฌ๋ ์ง ๊ณต์ง ์
๋ณด์ ๊ด์ฌ์ด ์๋ค๋ฉด ์ฌ์ด ํ๋ณด๊ฐ๋์ด์ผํฉ๋๋ค! ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ณง ๋์ฐฉํ๋๋ก ๋
ธ๋ ฅํ๊ฒ ์ต๋๋ค
@LinusU ๊ทธ๋ ๋ค๋ฉด onBillingSetupFinished
์ ์๋ฏธํฉ๋๊น? billingClientStateListener
์ ๊ฑฐํด์ผํฉ๋๊น? ๋๊ตฐ๊ฐ ์ฐ๋ฆฌ์ ์ผ๋ถ๊ฐ๋๊ธฐ ์ํด ์ด๊ฒ์ ์๋ํ ๊น์?
๋น ๋ฅด๊ณ ๋๋ฌ์ด ์๋ฃจ์
์ ์ํ๋ค๋ฉด ํด๋น ํจ์์ ์ง์ญ ๋ณ์ didCallCallback = false
ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ callback.run()
๋ค์ if (didCallCallback) { didCallCallback = true; callback.run() }
callback.run()
ํตํ๋ฅผ ๋ณดํธํฉ๋๋ค.
๋ ๊นจ๋ํ ํด๊ฒฐ์ฑ ์ ๋จ์ํ ์ฒซ ๋ฒ์งธ ํธ์ถ ํ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋ก ์ทจ์ํ๋ ๊ฒ์ ๋๋ค.
Log.d(TAG, "billing client ready");
callback.run();
//deregister the listener here?
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐฉ๊ธ 2.4.0-beta2
์ ์ถ์ํ์ต๋๋ค. ์๋ํ์ญ์์ค.
@hyochan ๋๋์ด ์๋ก์ด ๋ฒ์ ์ ์๋ ํ ๊ฒ์ ๋๋ค
๋ฒ ํ 2์ ํ๊ท ๋ฌธ์ ๊ฐ ์์์ผ๋ฏ๋ก 2.4.0-beta3์ ์๋ํ์ญ์์ค.
@hyochan ์ ๋ฐ์ดํธ ํ์๋ ์ค๋ฅ๊ฐ ์ฌ์ ํ ์์ต๋๋ค.
@ Ilario17 2.4.0-beta5
์ด๋ป์ต๋๊น? ๋๋ ์ด๊ฒ์ ๋ด ํธ์์ ์ฌํ ํ ์ ์์ผ๋ฏ๋ก ํ
์คํธ๊ฐ ํ์ํฉ๋๋ค.
@LinusU ๋งํ๋ฏ์ด @hyochan ์ ๊ทธ๋ฅ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐ?
@ Ilario17 ๊ทธ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ํด๊ฒฐ์ฑ
์ธ์ง ๊ถ๊ธํ์ต๋๋ค. ๋ํ onBillingServiceDisconnected
์๊ฒ ์๋ ค์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ ์ ๊ฑฐํ๊ณ ๋น์ ์ธก์์ ์ด๊ฒ์ ํ
์คํธํ๊ณ ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๊ด๋ จ๋์ด ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง 2.4.0-beta5์์ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค. ์๋ฎฌ๋ ์ดํฐ์์ ์ฝ๊ฒ ์ฌํ ํ ์ ์์ต๋๋ค.
IAP๊ฐ๋ก๋๋๋ ๋ถํ์ ๋ง์ดํธํ๊ณ ๋ง์ดํธ ํด์ ํ ๋ค์ ๋ค์ ๋ง์ดํธํ๋ฉด ๋ถ์ด ์ถฉ๋ํฉ๋๋ค.
ํธ์ง : ๋๋์ด ์ปค๋ฐ์ผ๋ก ๋ค์ด ๊ทธ๋ ์ด๋ํ๊ณ ๋ ์ด์ ์ถฉ๋ํ์ง ์์ต๋๋ค https://github.com/dooboolab/react-native-iap/commit/2db337ac770a93508507ec046f31085ddbb346fb
Attempt to invoke virtual method 'void com.android.billingclient.api.BillingClient.querySkuDetailsAsync(com.android.billingclient.api.SkuDetailsParams, com.android.billingclient.api.SkuDetailsResponseListener)' on a null object reference
run
RNIapModule.java:223
ensureConnection
RNIapModule.java:113
getItemsByType
RNIapModule.java:218
invoke
Method.java
invoke
JavaMethodWrapper.java:372
invoke
JavaModuleWrapper.java:160
run
NativeRunnable.java
handleCallback
Handler.java:789
dispatchMessage
Handler.java:98
dispatchMessage
MessageQueueThreadHandler.java:29
loop
Looper.java:164
run
MessageQueueThreadImpl.java:192
run
Thread.java:764
๋ ๋ฒ์งธ ๋ง์ดํธ (2.4.0-beta5)์์ ์ถฉ๋์ ์ผ์ผํค๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
componentDidMount() {
this.loadIAPProducts()
}
componentWillUnmount() {
RNIap.endConnection();
}
loadIAPProducts = async () => {
const itemSkus = ['XXXX_id']
const result = await RNIap.initConnection();
if(result) {
try {
const products = await RNIap.getProducts(itemSkus);
if (products) {
this.setState({ iapProducts: products })
}
} catch (err) {
//console.log(err); // standardized err.code and err.message available
}
this.restoreIAPPurchases()
}
}
restoreIAPPurchases = async () => {
try {
const purchases = await RNIap.getAvailablePurchases()
if(purchases) {
purchases.forEach(purchase => {
if (purchase.productId === 'XXXX_id') {
try {
RNIap.consumePurchase(purchase.purchaseToken);
} catch(err) {
}
}
})
}
} catch (err) {
//console.log(err)
}
}
@ rom1k ๊ธ์ ์ด๊ฒ์ ์๋๋ก์ด๋ ์๋ฎฌ๋ ์ดํฐ์์ ์๋ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ค์ ์ฅ์น์์ ์๋ํ์ญ์์ค.
@hyochan ๋ฒ์ 2.4.0-
Android์์ 2.4.0-beta3์ ๊ฒฝ์ฐ getProducts๋ฅผ ํธ์ถํ๋ฉด "์ฝ๋๋ก ๊ตฌ๋งค ์คํจ : 0 (OK)"์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฒ ํ 4์ 5๋ ์ค์ ๋ก ์ถฉ๋์ ์ผ์ผ ํต๋๋ค. 2.3.5๋ก ๋ค์ด ๊ทธ๋ ์ด๋ํ๋๋ฐ ์ ๋๋ก ์๋ํ์ง๋ง 2.4.0- ๋ฒ ํ์์ iOS ๋ฆฌ์ค๋ ๋ฒ๊ทธ ์์ ์ด ํ์ํฉ๋๋ค.
```
componentDidMount () {
this.getProductDetails ();
}
getProductDetails = async () => {
try {
await RNIap.initConnection();
const details = await RNIap.getProducts(products);
this.setState({
title: details[0].title,
description: details[0].description,
price: details[0].localizedPrice,
loading: false
});
} catch (err) {
console.log(err.message)
}
};
beta5์ ์ปด๋ฐฑ์ ์๋ํด ์ฃผ์๊ฒ ์ต๋๊น? ๊ทธ ๋ฒ์ ์ ์ค์๊ฐ์์ด์ ๋นจ๋ฆฌ ๊ณ ์ณค์ด์
@hyochan @LinusU ๋ฒ์ 2.4.0-
์ด ํ ๋ก ๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ์ ๋ณด๊ฐ ์์ต๋๋ค.
2.4.0-beta5์์ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Attempt to invoke virtual method void com.android.billingclient.api.BillingClient.querySkuDetailsAsync(...) on a null object reference
RNIapModule.java
223 ํ์ ๊ฐ๋ฆฌ ํต๋๋ค. ์ด๊ฒ์ mBillingClient
๊ฐ ์ฌ๊ธฐ์ ์๊ธฐ์น ์๊ฒ null
์์ ์๋ฏธํฉ๋๋ค.
์ฌํํ๋ ค๋ฉด ๋ค์ ๋ฐ์ ๋ค์ดํฐ๋ธ ํธ์ถ ๊ตฌ์ฑ ์์ ๋ง์ดํธ RNIap.getProducts()
์ componentDidMount
๋ฐ RNIap.endConnection()
์ componentWillUnmount
. ๊ตฌ์ฑ ์์๋ฅผ ๋ง์ดํธ ํด์ ํ๊ณ ๋ค์ ๋ง์ดํธํฉ๋๋ค. ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํด์ผํฉ๋๋ค.
onBillingServiceDisconnected()
์ฝ๋ฐฑ์์ false
๋ก ์ค์ ํ์ฌ ๊ฒฐ์ ํด๋ผ์ด์ธํธ ์ค์ ์ด ์๋ฃ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ถ์ ํ๋ ๋ฐ clientReady
๋ณ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ mBillingClient
์์ฒด๋ endConnection()
๊ฐ ํธ์ถ๋๋ฉด ์ฆ์ null๋ก ์ค์ ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ถ์ผ์น์
๋๋ค. mBillingClient
๊ฐ null ์ธ ๊ฒฝ์ฐ์๋ clientReady
์ true
์ค์ ํ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ์ ์ด๋ ๋ด ์ค์๋ก ์ธํด ์ผ์ด๋๊ณ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค. ๋ฌด์ธ๊ฐ๊ฐ onBillingServiceDisconnected()
ํธ์ถ์ ๋ฐฉํดํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋๋ฐ์ง ๋ชปํ์ต๋๋ค ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค "billing client disconnected"
๋๋ฌด ์์๋๋ก ๋ง์ดํธ ํด์ ์ ๋ก๊ทธ ์บฃ์ onBillingServiceDisconnected()
์ค์ ๋ก ํธ์ถ๋์ง ์์ต๋๋ค.
์ ์ฌ์ ์ธ ์์ : ์ค์ clientReady = false
๋ด์์ endConnection()
๋ฐฉ๋ฒ (์ : ๋ผ์ธ 179 ์ดํ). ๋๋ ์ด๊ฒ์ ์ฅ์น์์ ํ
์คํธํ์ผ๋ฉฐ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ธ์ฑ ๊ตฌ๋งค ๊ตฌ์ฑ ์์๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ค์ ๋ง์ดํธํด๋ ์ค๋ฅ๋ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ mBillingClient
๋ฅผ null๋ก ์ค์
@ mitchellmcm27 ์ก์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ ๋งํ๋ฉฐ ๊ทํ์๊ฒ ๋์ํฉ๋๋ค. ์ต์ํ์ ๋ณต์ ์์ด๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๊ฐ ์ด๋ ค์ ์ต๋๋ค. ๋ํ ํจ๊ป ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ ์๊ฐ์ด ์์ผ์๋ฉด PR
์๋ ค์ฃผ์ญ์์ค.
์น์ ํ๋.
์ง๊ธ๊น์ง ์์ฒ ๋ฒ์ ์ ๊ทธ๋ ์ด๋๋ฅผ ํตํด ๋ด ์ฑ์ ์ต์ ๋ฒ์ ์์ 2.4.0-beta6์ ์ถ์ํ์ต๋๋ค. ์์ง ์ถฉ๋์ด ์์ต๋๋ค ๐
๋ฉ์ง๋ค์. ์์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ง๊ธ์์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๊ฒ ์ต๋๋ค.
์ด๋ฏธ ๋์ผํ ์คํ ํธ๋ ์ด์ค๋ก ์ถฉ๋์ด ๋ฐ์ํ์ง๋ง ์ด์ ๋ณด๋ค ํจ์ฌ ์ ์ต๋๋ค.
java.lang.RuntimeException:
at com.facebook.react.bridge.CallbackImpl.invoke (CallbackImpl.java:28)
at com.facebook.react.bridge.PromiseImpl.resolve (PromiseImpl.java:30)
at com.dooboolab.RNIap.RNIapModule$4.run (RNIapModule.java:155)
at com.dooboolab.RNIap.RNIapModule$3.onBillingSetupFinished (RNIapModule.java:124)
at com.android.billingclient.api.BillingClientImpl$BillingServiceConnection.onServiceConnected (BillingClientImpl.java:903)
at android.app.LoadedApk$ServiceDispatcher.doConnected (LoadedApk.java:1658)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run (LoadedApk.java:1687)
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 android.app.ActivityThread.main (ActivityThread.java:6944)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
๋ํ 2.4.0-beta6์์ ์ฌ์ ํ ๋์ผํ ์คํ ์ถ์ ์ ์ป์ต๋๋ค.
์ด ๋ฒ๊ทธ๋ ๋ค์ ์ด์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
24 ์๊ฐ ์ด๋ด์ 120 ๋ฒ ์ถฉ๋.
์ต๊ทผ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ์์ฒด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด mBillingClient
์ด null์ด ์๋์ง๋ง ์์ง ์ค๋น๋์ง ์์ ๊ฒฝ์ฐ ensureConnection
ํจ์๊ฐ mBillingClient
๋ฅผ ๋ฎ์ด ์๋๋ค.
์์ ๋ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑ ํ ์ ์๋๋ก์ด ์ค๋ฅ๋ฅผ ํ์ํ๊ธฐ ์์ํ ๋ฒ์ ์ ์๊ณ ์ถ์ต๋๋ค.
๋๋ ๋ฌธ์ ๊ฐ ๋ค์ ์์๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ ๋ฌธ์ ๋ ์ฝ๋ฐฑ๊ณผ ๊ด๋ จ์ด ์์์ผ๋ฉฐ ์ด์ ๋ํ ์์ ์ผ๋ก "null object reference"์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํ์๊ฐ ์์ ๋์์ ์๋ ์์ง๋ง (๋๋ ๋ ๋ง์ ๋ฌธ์ ๊ฐ์์ ์ ์๋ค๋ @LinusU์ ๋์ํฉ๋๋ค), ์ฐ๋ฆฌ๋ ์ฌ์ ํ ์๋ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
beta6์ ์ฝ๋ฐฑ๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ์ถฉ๋์ด ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋ค์ ์ด์์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ PR
๋ฅผ ์ค ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด๊ฒ์ด ์ธ์ ์๊ฐ๋์๋์ง ์์ญ๋๊น? ๋กค๋ฐฑํ๋ ๊ฒ ์ด์์ผ๋ก ๊ธฐ์ฉ๋๋ค.
Android์์ 2.3.23๋ฟ๋ง ์๋๋ผ beta6์๋ ์ถฉ๋์ด ์์์ ํ์ธํ ์ ์์ต๋๋ค. ์ด [1] ์ฃผ์์ ๋ฐ๋ผ ์ฌ์์ฑํ๊ธฐ๊ฐ ์๋นํ ์ฝ์ต๋๋ค.
ํธ์ง : ์ด์ ์ง์ ์์ผ๋ฏ๋ก beta6 ์ฉ Android ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋๋ฒ๊น ํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ด ๋์์ด๋๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋ฉ๋๋ค (์ ์ด๋ ๋ด ์ฑ์์๋ getAvailablePurchases๋ฅผ ํธ์ถ).
๋ ์ด์ ํ์ํ์ง ์์ ์ฒญ์ทจ์๋ฅผ ์ฃฝ์ด๋ ์คํ์ ํ ๊ฒ์ ๋๋ค.
[1]
https://github.com/googlesamples/android-play-billing/issues/45#issuecomment -324466519
# 379๋ฅผ ๋ณํฉํ๊ณ beta8
๋ฆด๋ฆฌ์คํ์ต๋๋ค. ๊ทธ๊ฒ์ ์๋ํ์ญ์์ค.
์ต์ ๋ฒ์ ์์ ์์ ๋์์ต๋๊น? ์ต์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ด ์์ ํฉ๋๊น?
@hyochan ์ด ๋ฌธ์ ๋ ์ฌ์ ํ 3.0.0-rc-2์ ๋ํ๋ฉ๋๋ค.
java.lang.RuntimeException
com.dooboolab.RNIap.RNIapModule$3.onBillingSetupFinished
java.lang.RuntimeException:
at com.facebook.react.bridge.CallbackImpl.invoke (CallbackImpl.java:28)
at com.facebook.react.bridge.PromiseImpl.resolve (PromiseImpl.java:30)
at com.dooboolab.RNIap.RNIapModule$3.onBillingSetupFinished (RNIapModule.java:129)
at com.android.billingclient.api.BillingClientImpl$BillingServiceConnection$1.run (BillingClientImpl.java:1518)
at android.os.Handler.handleCallback (Handler.java:739)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:148)
at android.app.ActivityThread.main (ActivityThread.java:7325)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)
@fokoz 3.0.0-rc-4
์๋ํด ์ฃผ์๊ฒ ์ต๋๊น? ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
@hyochan try catch
ํ๋ฉด์ด ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์
๋๋ค. rc-4๊ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค !
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@hyochan ์ฃ์กํฉ๋๋ค, ์ด์ ๋ณผ ์๊ฐ์ด ์์์ต๋๋ค. ๊ณง ๋ณผ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@ Ilario17 ์๋ง๋ ์ด๋๊ฐ์ ๋ ผ๋ฆฌ ์ค๋ฅ๊ฐ ์์์ ํ์ํ๋ ๊ฒ์ ๋๋ค. ๊ณต์ ํ๊ฒ
ํธ์ง : ์, ๋ฌธ์ ๋
onBillingSetupFinished
๊ฐ ๋ ๋ฒ ์ด์ ๋ฐ์ํ๋ฉด ๋ฐ์ํฉ๋๋ค.ensureConnection
์๋ฃ๋๋ฉด (์ฆ,callback.run()
ํธ์ถํ๊ฑฐ๋ ์ ๋ฌ ๋ promise๋ฅผ ๊ฑฐ๋ถ ํ ๋) ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํด์ผํฉ๋๋ค. ๋๊ตฌ๋ ์ง ๊ณต์ง ์ ๋ณด์ ๊ด์ฌ์ด ์๋ค๋ฉด ์ฌ์ด ํ๋ณด๊ฐ๋์ด์ผํฉ๋๋ค! ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ณง ๋์ฐฉํ๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค