2.3.0
๊ธฐ๊ณ์ ์ธ์กฐ ์ธ๊ฐ
let sub = ๋๊ธฐ RNIApp.buySubscription("์ผ๋ถ");
์ฌ์ฉ์๊ฐ ์ธ์ฑ ๊ฒฐ์ ๋ชจ๋์์ ๊ตฌ๋งค๋ฅผ ๋๋ฅผ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ฌ์ฉ์๊ฐ ๊ตฌ๋ ์ ์๋ฝํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
let sub = ๋๊ธฐ RNIApp.buySubscription("์ผ๋ถ");
if(์๋ธ){
์ผ ์ข ํด..
}
if(sub) ๋ธ๋ก์ ํ์ ์ด ์ด๋ฆฐ ์งํ์ ์คํ๋์ง๋ง ์ฌ์ฉ์๋ ์ฌ์ ํ ๊ตฌ๋ ์ ์๋ฝํ์ง ์์ต๋๋ค.
์ค์ ์ฅ์น
์ด๋ค ์์ด๋์ด?
์ฝ์์ ๋ฐํํ๊ณ ์ ์๋ํ๋ getAvailablePurchases์ ๊ฐ์ ๋ค๋ฅธ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
๋ฌธ์ ๋ buySubscription์ด ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฝ๋ฐฑ์ ๋ฐํํด์ผ ํ์ง๋ง ๊ทธ๋ ์ง ์๋ค๋ ๊ฒ์ ๋๋ค.
RN 57์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ตฌ๋ ์ด ์๋ฃ๋์์ต๋๋ค. Playstore์์ ๊ตฌ๋งค๊ฐ ๊ด์ฐฎ์์ง ํ์ธํ ์ ์์ง๋ง buySubscription ์ฝ์์ด ์ ์๋์ง ์์ ์ํ๋ก ๋ฐํ๋ฉ๋๋ค.
์ด๋ค ๋์์ด?
๊ธ์, ๋๋ 2.2.2๋ก ๋ค์ด ๊ทธ๋ ์ด๋ํ๊ณ ์๋ํฉ๋๋ค. ๊ทธ๋์ ์ฌ๋ฌ๋ถ์ ์ ๋ฆด๋ฆฌ์ค์์ ๋ญ๊ฐ๋ฅผ ๋์น ๊ฒ ๊ฐ์ต๋๋ค.
@marcosmartinez7 ๊นจ์ ์ฃ์กํฉ๋๋ค 2.3.1
์๋ํด ์ฃผ์๊ฒ ์ต๋๊น?
์๋ ํ์ธ์, ๊ฐ์ฌํฉ๋๋ค!
์ง๊ธ์ ์๊ฐ์ด ์์ง๋ง ํ ๊ฒ์
@marcosmartinez7 ๊ฐ์ฌํฉ๋๋ค ๋์์์ฃผ์ธ์.
@dooboolab ๋ฌธ์ ๋ iOS์๋ ์์ต๋๋ค. 2.3.1
๋ฐ 2.3.2
๋ชจ๋ ์๋ํ์ต๋๋ค. @marcosmartinez7 2.2.2
์ธ๊ธํ๋ฏ์ด ์ ์๋ํฉ๋๋ค.
2.3.3
๊ณ ์ ๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํ๋ฉด ๋ค์ ์ด์ด์ฃผ์ธ์.
@dooboolab ์ฃ์กํฉ๋๋ค. ๋ฐฉ๊ธ 2.3.5
์ค์นํ๊ณ ๋ค์ ์ฐ๊ฒฐํ์ต๋๋ค. await RNIap.buySubscription(iapProductId)
์ฌ์ ํ iOS์์ undefined
๋ฅผ ์ฆ์ ๋ฐํํฉ๋๋ค.
@Gaia-Nutrition ios
์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ค๋ฅธ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๊ฒฐ์ ํด์ ํ๊ณ ๋ค์ ์ฐ๊ฒฐํด ์ฃผ์๊ฒ ์ต๋๊น?
@dooboolab ์ฐ๊ฒฐ ๋ฐ ์ฐ๊ฒฐ ํด์ ๋ฅผ ์๋ํ์ต๋๋ค. 2.2.2
๋ก ๋ค์ ์ ํํ ๋๋ง๋ค ๋ค์ ์๋ํ๊ธฐ ์์ํฉ๋๋ค. ํ์ง๋ง ๋ด์ผ ๋ค์ ํ์ธํ๊ฒ ์ต๋๋ค. ๋ค์ดํฐ๋ธ ๊ตฌ์ฑ ์์๋ฅผ ์๋์ผ๋ก ์ค์นํ๋ ค๊ณ ํ ์๋ ์์ต๋๋ค.
@dooboolab ์ด์ ์ 2.3.6
๋ฒ์ ์ ์๋์ผ๋ก ์ฐ๊ฒฐํ์ต๋๋ค. ์ฌ์ ํ undefined
๋ฐ๊ณ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค. ์ ๊ฐ ๋ฌด์์ ๋์๋๋ฆด ์ ์๋์ง ์๋ ค์ฃผ์ธ์!
๋๊ตฐ๊ฐ ์ด๊ฒ์ ํ์ธํ ์ ์์ต๋๊น? ์ด๊ฒ์ ํนํ ios์์ ๋ฐ์ํด์๋ ์๋ฉ๋๋ค.
@dooboolab iOS ๋ฒ์ 2.3.6์ ์ฝ์์ ์คํํ์ง ์์ง๋ง ๋ฒ์ 2.2.2๋ ์คํํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค(iPhone 5 ์ฅ์น ์ฌ์ฉ, React Native 0.56 ์ฌ์ฉ)
2.3.7์์๋ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. await
๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์ฝ์์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค์ ์ค์ด ๋ฐ๋ก ํธ์ถ๋๊ณ RNIap.buySubscription(subId).then(purchase => {})
ํ๋ฉด ์ ์๋์ง ์์ ์์ฑ์ ์ฝ์ ์ ์๋ค๋ ์ค๋ฅ๋ก ์ถฉ๋ํฉ๋๋ค.
ํ์ฌ ์์
์ค์
๋๋ค. ๋ํ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ ์ฌ๋์ ์ค์ ๋ก buySubscription
ํธ์ถํ๊ธฐ ์ ์ getSubscriptions
์ ํธ์ถํ์ต๋๊น?
๋ฐฉ๊ธ RNExample ์ฑ์์ ๊ตฌ๋งค๋ฅผ ํ
์คํธํ์ต๋๋ค. buyProductWithoutFinishTransaction() ๋ฉ์๋๋ก ๊ตฌ๋
์ ๊ตฌ์
ํ์ต๋๋ค.
RNExample์ฒ๋ผ ํ
์คํธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Xcode๋ฅผ ์
๋ฐ์ดํธํ๊ณ ๋น๋ ์ค์ ์ 'legacy'๋ก ์ค์ ํฉ๋๋ค. Xcode์ ๋น๋ ํ๋ก์ธ์ค๊ฐ ์ด ์
๋ฐ์ดํธ๋ฅผ ๋ณ๊ฒฝํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ก ๋ง๋ ์๋๋ฐ์ค ํ
์คํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@JJMoon ๋งค์ฐ ํฅ๋ฏธ๋กญ์ต๋๋ค. ์ ์กฐํฉ buyProductWithoutFinishTransaction()
๋ฐ finishTransaction()
์ ์ํ 2.3.7
๋์ buySubscription()
์ง์ ๊ณ์ ์คํจ!
@๊ฐ์ด์-์์ OK. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ buyProductWithoutFinishTransaction
๋ฐ finishTransaction
๋์ buySubscription
. ๊ตฌ๋งค ํ๋์ ์ ํํ ๋์ผํฉ๋๋ค.
@Gaia-Nutrition 2.3.8
๋์
๋ณด์ค๋์? ๋ํ getSubscriptions
์ ์ buySubscription
getSubscriptions
๋ฅผ ํธ์ถ ํ์ต๋๊น?
@dooboolab 2.3.8
์ฌ์ ํ buySubscription
์ฌ์ฉํ์ฌ ์คํจํ๊ณ ๋ค์: ์, ์ ์ getSubscriptions
๋ฅผ ํธ์ถํ์ต๋๋ค. ๋๋ buyProductWithoutFinishTransaction()
๊ฐ ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์๋๋ฐ์ค ๋ชจ๋์ iOS ๊ธฐ๊ธฐ์์ buySubscription์ ํ
์คํธํ์ต๋๋ค.
์ฑ๊ณตํ์ง๋ง ์ผ๋ถ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ ๊ฐฑ์ ๊ตฌ๋
์ ์์์ฆ์ ๋ฐํํ์ง ์์ต๋๋ค.
buySubscription ๋์ buyProductWithoutFinishTransaction ๋ฐ finishTransaction์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ์ฌ ํ
์คํธํ ์ฅ์น๊ฐ ์์ต๋๋ค. ๋์ค์ ์ด ๋ฌธ์ ๋ฅผ ์ถ์ ํ๊ฒ ์ต๋๋ค.
์ด๊ฒ์ ํ์ฌ iOS
์์๋ง ๋ฐ์ํ๋ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด ๋ง์ด ๋ง์?
@dooboolab ์๋์, Android์์๋ ๋ฐ์ํฉ๋๋ค. ์ด ํจ์๋ buyItemByType์ ์ฒซ ๋ฒ์งธ ์ค์ด ํธ์ถ๋๊ธฐ ์ ์๋ undefined๋ฅผ ๋ฐํํฉ๋๋ค.
@dooboolab index.js:105์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ค์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
export const buySubscription = (sku, oldSku, prorationMode) => Platform.select({
ios: () => RNIapIos.buyProduct(sku),
android: () => RNIapModule.buyItemByType(ANDROID_ITEM_TYPE_SUBSCRIPTION, sku, oldSku, -1),
})();
(๋๋ ์ด๊ฒ์ด prorationMode๋ฅผ ๋ฌด์ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค)
๊ทธ๋ฌ๋ ์ฑ๊ณต์ ์ผ๋ก ๊ตฌ๋ ํ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
E/UncaughtException: 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:427)
at com.android.billingclient.api.BillingClientImpl$1.onReceive(BillingClientImpl.java:136)
at com.android.billingclient.api.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:303)
at com.android.billingclient.api.LocalBroadcastManager.access$000(LocalBroadcastManager.java:44)
at com.android.billingclient.api.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:114)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
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)
@mfentross react-native-iap
๋ฒ์ ์ด ๋ฌด์์
๋๊น? RNIapModule.java:427
๋น ์ค์ด ์์ต๋๋ค. ์ต๊ทผ ํญ๋ชฉ์ ๋ํด ๋ค์ ์๋ํ์ญ์์ค.
๋ด ์๋ชป: ๋ช ์ค์ ์์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฃผ์ ๋ฌธ์ ์ ๋ํ ์์ ์ buySubscription ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ด ํธ์งํ๋ ๊ฒ์ ๋๋ค.
`
๋ด๋ณด๋ด๊ธฐ const buySubscription = (sku, oldSku, prorationMode) =>
ํ๋ซํผ.์ ํ({
ios: () => RNIapIos.buyProduct(sku),
์๋๋ก์ด๋: () => {
if (!prorationMode) prorationMode = -1;
return RNIapModule.buyItemByType(ANDROID_ITEM_TYPE_SUBSCRIPTION, sku, oldSku, prorationMode);
},
})();
`
๋ถํ์ํ ๊ดํธ๊ฐ ์์์ต๋๋ค.
@mfentross ๋ด ๋์. return
๋ช
์ธ์๋ฅผ ๋์ณค์ต๋๋ค. ๋ฐฉ๊ธ 2.3.11
๊ฒ์ํ์ต๋๋ค. ์ด์ ์๋๋ก์ด๋๊ฐ ์๋ํฉ๋๊น?
@dooboolab ๊ฐ์ฌํฉ๋๋ค, ์ด์ ์๋ํฉ๋๋ค ๐
@mfentross @JJMoon ์ค์ผ์ด! ๊ทธ๋์ iOS ๋ฌธ์ ๋ง ๋จ์์ต๋๋ค.
@JJMoon ๊ทธ๋ async
๋ฐ await
์ฌ์ฉํ์ฌ ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์๋ํ๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. async
๋ฐ await
๋ก ๋ํํ๋ ๊ฒ์ ๋ฐํ ๊ฐ์์ ์ค๋ณต๋์ง ์์ต๋๊น?
2.3.13
๊ฒ์ํ์ต๋๋ค. ๋ชจ๋ ์๋ํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
์ด ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํ๋ฉด ๋ค์ ์ด์ด์ฃผ์ธ์. ๋ชจ๋ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ์ฌ ์์ ์ค์ ๋๋ค. ๋ํ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ ์ฌ๋์ ์ค์ ๋ก
buySubscription
ํธ์ถํ๊ธฐ ์ ์getSubscriptions
์ ํธ์ถํ์ต๋๊น?