4.4.1
0.60.4
iOS
๊ตฌ๋ ์ ์ํด finishTransactionIOS (purchaseId) ๋๋ finishTransaction (purchase)๋ฅผ ํธ์ถํ๋ฉด ํธ๋์ญ์ ์ด ์๋ฃ๋์ด์ผํ๋ฉฐ ๋ค์ ์คํ์ ์ฑ์ผ๋ก ๋ค์ ๋ด๋ณด๋ด์ง์ง ์์์ผํฉ๋๋ค. ์ด๊ฒ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์ค๋ฅ ๋ฆฌ์ค๋ ๋๋ finishTransaction ํจ์ ์ค ํ๋์ ์ฝ์์์ ๋ฌด์ธ๊ฐ๊ฐ ๋ฐํ ๋ ๊ฒ์ผ๋ก ์์ ํ ์ ์์ง๋ง ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
Android๊ฐ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํธ๋์ญ์ ์ clearTransactionIOS๊ฐ ํธ์ถ๋์ง ์๋ ํ ๋ชจ๋ ๋จ์ผ ์คํ์์ ๋ฐฉ์ถ๋๋ฉฐ ๋ค๋ฅธ ๋ถ์์ฉ์ด์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
์ค์ ์ฅ์น
๋๋์ด ๋๋ฏธ๋ฅผ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์๋ํด ๋ณด์๊ณ ๋ด๊ฐ ๋ฌด์์ํ๋ ๊ฑฐ๋๋ฅผ ์ง์ฐ๋ ๊ฒ ์ธ์๋ ์๋ฌด๊ฒ๋ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ตฌ๋งค๋ ๋งค ์ถ์๋ง๋ค ๋ค์ ์ฑ์ผ๋ก ์ ์ก๋ฉ๋๋ค. ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง, ๋ด๊ฐ ๋ฌด์์ ํ ์ ์๋์ง ๋๋ ์๋ชป ์ดํดํ๊ณ ์๋์ง ์์ด๋์ด๊ฐ ์์ต๋๊น?
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ackResult
๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น?
try {
const ackResult = await finishTransaction(purchase);
console.log('ackResult', ackResult);
} catch (ackErr) {
console.warn('ackErr', ackErr);
}
ํจ์ฐฌ
๋์ ๊ฒฝ์ฐ์๋:
ackResult undefined
ํจ์ฐฌ
๋์ ๊ฒฝ์ฐ์๋:
ackResult undefined
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง
๋ํ ์ ๊ฒฝ์ฐ์๋ ๋ฐํ ๋ ๊ฐ์ด ์ ์๋์ง ์์์ต๋๋ค (์๋ ๋ฐ์ค ์ฌ์ฉ์๊ฐ์๋ ์ค์ ์ฅ์น).
# 366๊ณผ ๊ด๋ จ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ ios
finishTransaction
๊ฒฝ์ฐ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์์ต๋๋ค.
๋ชจ๋ # 366์ ์ง์คํ๊ณ ์
๋ฐ์ดํธ๋ฅผ ์ํด ๋์์ฌ ์ ์์ต๋๊น?
# 366๊ณผ ๊ด๋ จ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ
ios
finishTransaction
๊ฒฝ์ฐ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์์ต๋๋ค.
๋ชจ๋ # 366์ ์ง์คํ๊ณ ์ ๋ฐ์ดํธ๋ฅผ ์ํด ๋์์ฌ ์ ์์ต๋๊น?
๋ช ํํํ๊ธฐ ์ํด-# 366์ ํ ์คํธ์ ๊ดํ ๊ฒ์ด๋ฏ๋ก clearTransactionIOS ์์ด๋ ํ๋ก๋์ ์์ ์ ์๋ํด์ผํ๋ค๊ณ ์ ์ํ๊ณ ์์ต๋๊น?
@hyochan ์๋ ๋ฐ์ค ๊ณ์ ์ผ๋ก ๋๋ฒ๊ทธ ๊ตฌ์ฑ์ ํ ์คํธ ํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ์์ ์๋ฒ ์๋ฆผ (Apple)์ผ๋ก ๊ตฌ๋งค์ ๋ํ ์๋ฆผ์๋ฐ์ต๋๋ค. ๋ฌธ์ ๋ ์ผ๋ง ํ ๋ด ํด๋ผ์ด์ธํธ ๋ฆฌ์ค๋๊ฐ ๊ตฌ๋งค์ ๋ํ ๋ ๋ค๋ฅธ ์๋ฆผ์ ๋ฐ์ง๋ง ๊ตฌ๋งค ์กฐ์น๊ฐ ํ ๋ฒ๋ง ๋ฐ์ํ ๊ฒฝ์ฐ์๋ transactionId๊ฐ ๋ค๋ฅด๋ฏ๋ก ์ด์ ํธ๋์ญ์ ์ ์ ๋๋ก ์๋ฃํ๋ ๋ฐ ๋ฌธ์ ๊ฐ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. Android์์๋ ๋ชจ๋ ๊ฒ์ด ์ ์๋ํ๋ฉฐ ์๋ ๋ฐ์ค ๊ณ์ ์ผ๋ก ๊ตฌ๋งค ํ๋ก์ธ์ค๋ฅผ ํ ์คํธํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ # 366๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
```tsx
useEffect (() => {
purchaseUpdateSubscription.current = purchaseUpdatedListener (
๋น๋๊ธฐ (๊ตฌ๋งค : InAppPurchase | SubscriptionPurchase) => {
const ์์์ฆ = purchase.transactionReceipt;
if (์์์ฆ) {
{
await myBackendHandler ({
์ฌ์ฉ์,
๋งค์,
});
const result = await RNIap.finishTransaction (purchase, false);
console.log ( 'result', ๊ฒฐ๊ณผ);
} catch (e) {
// ํ ๊ฒ
}
}
}
);
๋ฐํ () => {
if (purchaseUpdateSubscription.current) {
purchaseUpdateSubscription.current.remove ();
purchaseUpdateSubscription.current = null;
}
};
}, []);
````
์๋ ํ์ธ์ ํ,์ด ๋์๊ด์ ๋ชจ๋ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ ๋ง ์ฐ๋ฆฌ์ ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋๋ค. ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์๊ฒฌ์ ๋งํ๊ณ ์์ผ๋ฉฐ ์ ๋ฆฌ๋์ง ์์ ์ค๋๋ ๊ฑฐ๋๊ฐ # 366๊ณผ ๊ด๋ จ์ด ์๋์ง ์ ์ ์์ต๋๋ค.
๋ด ์ฌ์ฉ ์ฌ๋ก๋
์์ ๊ฒฐ๊ณผ:
์ค์ ๊ฒฐ๊ณผ
์ด๊ฒ์์ด ๋ฌธ์ ์ ์ฐ์ ์์๋ฅผ ๋๋ ๊ฒ์ด ์ค์ํ ์ด์ ์ ๋ํ ์์ผ๋ฟ์ ๋๋ค. ์ด ๊ธด ๋๊ธ์ ์ฝ์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ...
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง
์์ ๋๊ฐ์ ๋ฌธ์ ์ธ๋ฐ, ์๋ ๋ฐ์ค / itunes ๊ณ์ ์ฐ๊ฒฐ์ ๋๊ณ ๊ธฐ๊ธฐ๋ฅผ ์ฌ๋ถํ ํ๊ณ ์ฑ์ ๋ค์ ์ค์นํด๋ ์คํ์ด ์ ํ ์ง์์ง์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. : /
finishTransaction
์ด RNIapIos.m
ํ์ผ์์ ์ค์ ๋ก ์๋ฌด ์์
๋ํ์ง ์๋์ง ํ์ธํ ์ ์์ต๋๊น?
๋ฐฉ๊ธ ํ์ธํ๊ณ ๊ฑฐ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ฃํ์ต๋๋ค.
clearTransaction
๋๋ finishTransactionWithIdentifier
๋ฉ์๋๋ฅผ ํ์ธํ๊ณ ๋ด๋ถ์ ๋ก๊ทธ๋ฅผ ๋ฃ์ผ์ญ์์ค. ์๋ ์ฝ๋๋ฅผ ์ฐพ์ผ์ญ์์ค.
RCT_EXPORT_METHOD(clearTransaction) {
NSArray *pendingTrans = [[SKPaymentQueue defaultQueue] transactions];
NSLog(@"\n\n\n *** clear remaining Transactions. Call this before make a new transaction \n\n.");
for (int k = 0; k < pendingTrans.count; k++) {
[[SKPaymentQueue defaultQueue] finishTransaction:pendingTrans[k]];
}
-(void)finishTransactionWithIdentifier:(NSString *)transactionIdentifier {
SKPaymentQueue *queue = [SKPaymentQueue defaultQueue];
for(SKPaymentTransaction *transaction in queue.transactions) {
if([transaction.transactionIdentifier isEqualToString:transactionIdentifier]) {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
}
}
๋๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ํ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์์ด ๋ฌธ์ ๋ฅผ ์งํํ ์ ์์ต๋๋ค. ๋๊ตฐ๊ฐ ์์ ์ ํ๊ฒฝ์์ ๋๋ฒ๊น ํ๊ณ ๊ณต์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์๋ก, ๋๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ์์ ๋์ผ finishTransactionIOS / finishTransaction ์ด๊ฒ์ IOS์์ ์๋ํ์ง ์์ต๋๋ค.
์ ๋ ๊ฐ์ ๊ฒฝํ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
IAP์ ๊ตฌ๋งค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ง๋ง๋ก ์ต์ข
ํธ์ถ finishTransaction
๋ฐํ undefined
.
// Finish transaction
const ackResult = await finishTransaction(purchase);
console.log("Ack result: ", ackResult); // Ack result: undefined
_App Store Sandbox ํ๊ฒฝ์ ํ์ฉ ํ ์ค์ ๊ธฐ๊ธฐ "iPhone 6s"_
finishTransaction์ ์์ ๊ฒฐ๊ณผ๋ ๋ฌด์์
๋๊น? undefined
์ข์ ๊ฒฐ๊ณผ์
๋๊น ์๋๋ฉด ๋ค๋ฅธ ๊ฒ์ ๊ธฐ๋ํด์ผํฉ๋๊น?
๋ํ finishTransactionIOS
๋ finishTransaction
๋ ์ค์ ๋ก ํด๋น ํธ๋์ญ์
์ ์ ๊ฑฐํ์ง ์์ ์ฑ์ ์ถ์ ํ ์์๋ iOS์์๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ชจ๋ ์
๋ฐ์ดํธ?
@hyochan ๋ถ๋ช
ํ Objective-C์ ๋ฅํตํ์ง๋ ์์ง๋ง finishTransaction
๋ฐ finishTransactionWithIdentifier
์ ์ผ๋ถ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ๋๋ฐ ์ ๋๋ก ์คํ๋๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค (ID๊ฐ ์ ๋ฌ๋๊ณ ์ผ์นํ๋ ๊ฒ ๊ฐ์ต๋๋ค). ๋ด๊ฐ ์๊ฐํ ์์๋ ์ ์ผํ ๊ฒ์ [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
์ด ์ค์ ๋ก StoreKit์ ์ฐ๊ฒฐ๋์ด ํธ๋์ญ์
์ ์๋ฃํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์์ ์ด๋๋ก ๊ฐ์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋๋ฒ๊น
ํ ๋ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
App Store์ ๊ตฌ๋ ์ํ ์๋ฆผ๋ ์ฒ๋ฆฌํ๊ณ ์์ต๋๊น? ์ ๊ฒฝ์ฐ์๋ ์๋ฒ๊ฐ ๋ชจ๋ ์๋ฆผ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ 200์ผ๋ก ์๋ต ํ ๋๊น์ง์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
@espenjanson ํฅ๋ฏธ
@lachlanglen ์ ๊ฒฝ
๋๋ ๊ทธ๊ฒ์ ์กฐ์ฌํ๊ณ ์์๊ณ finishTransactions ํธ์ถ์ด obj-c์์ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ undefined๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ๋ง์ต๋๋ค.
๋ช ๊ฐ์ง ํ
์คํธ๋ฅผ ์ํํ์ผ๋ฉฐ ์ ๊ฒฝ์ฐ์๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ฃ ํ ๊ฒ ๊ฐ์ต๋๋ค (๊ฐ๋จํ ํ
์คํธ, ๋ณด๋ฅ์ค์ธ ํธ๋์ญ์
๊ฐ์ ธ ์ค๊ธฐ, ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ์ ์๋ํฉ๋๋ค)
@espenjanson Expo ํจํค์ง๊ฐ ์ ๊ด๋ฆฌ๋์ง ์๋๋ค๊ณ ์๊ฐํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. Expo๊ฐ ์ต๊ทผ์ iap ๋ชจ๋์ ์ถ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. iap์ ๊ตฌํํ ๋ expo์ iap ๋ชจ๋์ด ์๋ค๋ ๊ฒ์ ์์๋ค๋ฉด ๋ ๋ฒ ์๊ฐํ์ง ์๊ณ expo๋ฅผ ์ ํํ์ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋๋ ์๋ก์ด sandbox ์ฌ์ฉ์๋ก๋ TestFlight์์ ์ด๊ฒ์ ํ
์คํธํ์ผ๋ฉฐ ์ฌ์ ํ ๊ณ์ ๋ฐ์ํฉ๋๋ค.
๋ด purchaseUpdateListener
"์ด์ "๊ฑฐ๋๊ฐ ๊ณ์ ์์ ๋ฉ๋๋ค.
์๋ ๊ฐฑ์ ๊ตฌ๋
์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก finishTransaction(purchase,false)
๋ก ์ ํํฉ๋๋ค.
ํธ์ถ ๊ฒฐ๊ณผ๋ undefined
์
๋๋ค.
์๋ฌด๋ ์ด๊ฒ์ด ์ ๋ฐ์ํ๋์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ ์ค๋ช ์ ์ ๊ณต ํ ์ ์์ต๋๊น?
@zatloeri ๋ถ๋ช ํ ์ํ๋ ํ๋์ ๋๋ค. ๊ทธ๊ฒ์ ๊นจ๋ซ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. App Store๋ ๊ด์ฐฐ์๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ StoreKit์ ๊ฐฑ์ ์์ํ ์ ์์์ฆ์ ๋ฃ์ ๊ฒ์ ๋๋ค. ์์์ฆ์ ์ฒ๋ฆฌํ๊ณ ๊ฑฐ๋๋ฅผ ์๋ฃํด์ผํฉ๋๋ค.
https://developer.apple.com/videos/play/wwdc2018/705/
https://developer.apple.com/videos/play/wwdc2020/10671
(HD ํ์ง์ ์ํด Safari์์ ์์ฒญ)
@ziyoshams ๋น ๋ฅธ ๋ต๋ณ๊ณผ
ํ์ง๋ง ๋จผ์ ํ ๊ฐ์ง๋ง ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ์๋ํ๋ฉด ๋ด๊ฐ ๊ทธ๊ฒ์ ์ ์ ํ๊ฒ ๋ง๋ค์๋ค ๊ณ ์๊ฐํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋น์ ์ด ์ค๋ช
ํ๋ ๊ฒ์ ๋์๊ฒ ๋
ผ๋ฆฌ์ ์ผ๋ก ๋ณด์ด๋ฉฐ ์ด๊ฒ์ด ์ผ์ด๋ ๊ฒ์ด๋ผ๊ณ ์์ํ์ง๋ง ๋๋ฅผ ๋นํฉํ๊ฒํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
receipt validation
์ํด ํ์ธ ๋ ์ ํ A ๊ฐ ๋ง๋ฃ๋์์ต๋๋ค.
์ฑ์ ์์ํ๊ฑฐ๋ ํฌ ๊ทธ๋ผ์ด๋ ํ ๋ ์ ํ A์ ๋ํ ์ด์ (์ ๋ ๋ถํฐ) ํธ๋์ญ์
์ ์์ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ค์ ๋ฒ์ ์ฑ์ ๋ค์ ํฌ ๊ทธ๋ผ์ด๋ ํ ๋ ์ ํ A์ ๋ํ ๋ค๋ฅธ ์ค๋๋ (์๋ง๋ ์ด์ ๋ณด๋ค ์กฐ๊ธ ๋ ์๋กญ๊ณ ํ์คํ์ง ์์) ํธ๋์ญ์
์๋ฐ์ต๋๋ค.
๋ค๋ฅธ ์ ๊ฒฝ์์ ์๋ง๋ ๋ค๋ฅธ ๊ฒ ๋ฑ๋ฑ.
๊ตฌ๋
์ด ์ด๋ฏธ ๋ง๋ฃ ๋ ๊ฒฝ์ฐ ํ๋์ ์ฑ ์์์์ ๋ชจ๋ ๊ฒ์ ์ป์ ์์์ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
์ด๊ฒ์ ๋ํ ์์๋๋ ๋์์
๋๊น, ์๋๋ฉด ๋ญ๊ฐ ์ด์ํ ์ผ์ด ์ผ์ด๋๊ณ ์์ต๋๊น?
@zatloeri ์๋ฃ๋์ง ์์ ๋ชจ๋ ํธ๋์ญ์ ์ ๋ง๋ฃ ๋ ๊ฒฝ์ฐ์๋ ํด๋น ๋๊ธฐ์ด์ ํ์๋ฉ๋๋ค. ์๊ฐ ๊ตฌ๋ ์ ๊ฒฝ์ฐ ์ฝ 5 ๋ถ๋ง๋ค ์์์ฆ์ ๋ฐ์์ผํฉ๋๋ค. ๋ฌผ๊ฑด์ ๊ตฌ์ ํ๊ณ ๋ค์๋ ์ฑ์ผ๋ก ๋์ ์ค๋ฉด ๋์์ 5 ~ 6 ๊ฐ์ ์์์ฆ์ ๋ฐ๊ฒ๋ฉ๋๋ค. ๋๋ ๊ทธ WWDC ๋น๋์ค๋ฅผ ์์ฒญํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ๋ง ๋์์ด๋ฉ๋๋ค.
iOS์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ํธ๋์ญ์ ์ด ์๋ฃ๋์ง ์์ ๋๊ธฐ์ด์ด ๋น์ด ์์ง ์๊ณ ์ฑ์ด ์์๋ ๋๋ง๋ค ์์์ฆ์ด ๋ค์ ๋ํ๋ฉ๋๋ค. ์๋ฒ ์ธก์์ ์์์ฆ์ ํ์ธํ๊ณ ๊ฑฐ๋๋ฅผ ๋ง์ณค์ต๋๋ค. ์๋ ๋ด ์ฝ๋๋ฅผ ๋ด์ฃผ์ธ์
์๋์ ๋ด ์ฝ๋์ ์ผ๋ถ๋ฅผ ์ธ๊ธํ์ต๋๋ค ...
```
import RNIap, {
InAppPurchase,
์์ฑ๋ฌผ,
PurchaseError,
์ ์ฒญ,
SubscriptionPurchase,
finishTransaction,
finishTransactionIOS,
purchaseErrorListener,
purchaseUpdatedListener,
clearTransactionIOS,
} 'react-native-iap'์์;
async componentDidMount () {
const ๊ฒฐ๊ณผ = ๋๊ธฐ RNIap.initConnection ();
const itemSubs = Platform.select ({
android : [
get (this.props, 'subscriptionStore.subscription.android_product_id', null)
],
ios : [
get (this.props, 'subscriptionStore.subscription.ios_product_id', null)
]
});
const ๊ตฌ๋
= await RNIap.getSubscriptions (itemSubs);
purchaseUpdateSubscription = purchaseUpdatedListener (
๋น๋๊ธฐ (๊ตฌ๋งค) => {
const ์์์ฆ = purchase.transactionReceipt;
let subscription = {
subscription_id : get (this.props, 'subscriptionStore.subscription.id', null)
};
if (Platform.OS === 'ios') {
๊ตฌ๋
= {
...์ ์ฒญ,
order_id : get (๊ตฌ๋งค, 'transactionId', null),
buy_token : get (purchase, 'originalTransactionIdentifierIOS', null),
์์์ฆ : get (purchase, 'transactionReceipt', null), // (ํ
์คํธ์ ์ ์ฅ)
os : 'IOS'
}
} else if (Platform.OS === 'android') {
const ๋ฐ์ดํฐ = JSON.parse (receipt);
๊ตฌ๋
= {
...์ ์ฒญ,
order_id : get (data, 'orderId', null),
purchase_token : get (๋ฐ์ดํฐ, 'purchaseToken', null),
os : 'ANDROID'
}
}
{
finishTransaction (๊ตฌ๋งค, ๊ฑฐ์ง); // ์ด๊ฒ์ ์์๋ฅผ ์ํด ์ฌ๊ธฐ์ ์์ผ๋ฉฐ ๋์ค์ ์ฑ๊ณต์ ๋ฐฐ์น๋ฉ๋๋ค.
this.props.notificationStore.showToast ( '๊ตฌ๋
๋์์ต๋๋ค. ์ ์๋ง ๊ธฐ๋ค๋ ค์ฃผ์ญ์์ค ...', '์ฑ๊ณต', 5000);
const resp = await this.props.subscriptionStore.onPurchase (subscription); // ์๋ฒ ๋์์ ํธ๋์ญ์
์ ํ์ธํฉ๋๋ค.
if (resp.success) {// ์ฑ๊ณต ์๋ต
this.props.userStore.setUser ({is_premium : 1});
this.props.navigation.replace ( 'FixFooter');
}
} catch (์ค๋ฅ) {
console.log ( "onPurchase API ์ค๋ฅ :", ์ค๋ฅ);
}
}
)
purchaseErrorSubscription = purchaseErrorListener (
๋น๋๊ธฐ (์ค๋ฅ) => {
console.log ( '๊ตฌ๋งค ์ค๋ฅ :', ์ค๋ฅ);
}
)
}
/ * onPurchase ๋ฒํผ * /
async onPurchase () {
{
const request = await RNIap.requestSubscription (Platform.OS === 'android'?
get (this.props, 'subscriptionStore.subscription.android_product_id', null) :
get (this.props, 'subscriptionStore.subscription.ios_product_id', null))
} catch (์ค๋ฅ) {
console.log ( '์ค๋ฅ :', ์ค๋ฅ)
}
}
@ sufyan297 ์๋ฒ ์ธก ์ฝ๋์์ ์ค ๋ํซ์ ๊ณต์ ํด ์ฃผ์๊ฒ ์ต๋๊น? ์์์ฆ ํ์ธ ํญ๋ชฉ๋ ์ค์ ํ๋ ค๊ณ ํ๋๋ฐ Apple์ ๋ฌธ์๊ฐ ๋งค์ฐ ํผ๋ ์ค๋ฝ์ต๋๋ค.
@ziyoshams expo iap ๋ชจ๋ finishTransaction ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ null์ ์ป์ต๋๊น?
@bcbcbcbcbcl ์ ๋ expo ๋ชจ๋์ ์ฌ์ฉํ๊ณ ์์ง ์์ต๋๋ค.
๋์๊ฒ +1 ๊ทธ๊ฒ์ ์ ์๋์ง ์์ ๋ฐํ
@hyochan ์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๋ ๊ฝค ์ค๋ซ๋์ ๊ฐํ ์์๊ณ ์ฑ์ ๊ฒ์ ํ ์ ์์์ต๋๋ค.
์๋ ํ์ธ์. ์ต๊ทผ์ด ๋ฌธ์ ์ ๋ํ ํ๋์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋์์ต๋๊น? ์๋๋ฉด ์ฌ์ ํ ์ปค๋ฎค๋ํฐ์์ฃผ์๊ฐ ํ์ํฉ๋๊น? ์ด ๋ฌธ์ ๋ ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์ข ๊ฒฐ ๋ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ "ํ ๋ก ์ฉ"๋๋ "์ข์ ์ฒซ ๋ฒ์งธ ๋ฌธ์ "๋ก ํ์ ํ ์๋ ์์ผ๋ฉฐ ์ด์ด ๋๊ฒ ์ต๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@hyochan ์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๋ ๊ฝค ์ค๋ซ๋์ ๊ฐํ ์์๊ณ ์ฑ์ ๊ฒ์ ํ ์ ์์์ต๋๋ค.