React-native-iap: iOS 14 : requestSubscription () ๋ฌธ์ œ

์— ๋งŒ๋“  2020๋…„ 09์›” 20์ผ  ยท  57์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dooboolab/react-native-iap

react-native-iap ๋ฒ„์ „

4.4.9

๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ„์ „

.62.2

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ํ”Œ๋žซํผ (IOS ๋˜๋Š” Android ๋˜๋Š” ๋‘˜ ๋‹ค?)

iOS ์ „์šฉ์ž…๋‹ˆ๋‹ค. ์•„์ง Android์—์„œ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

๊ตฌ๋งค๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ๋งค ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  purchaseUpdatedListener๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ํ–‰๋™

requestSubscription ()์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋งค ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. PurchaseUpdatedListener๊ฐ€ ๊ตฌ๋งค ๋Œ€ํ™” ์ƒ์ž ๋˜๋Š” ์œ ํšจํ•œ ์˜์ˆ˜์ฆ์—†์ด ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๋œ ํ™˜๊ฒฝ (์—๋ฎฌ๋ ˆ์ดํ„ฐ? ์‹ค์ œ ์žฅ์น˜?)

TestFlight๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ iOS 14 ์žฅ์น˜.

ํ–‰๋™์„ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„

RNIap.requestSubscription ()์„ ํ˜ธ์ถœํ•˜์‹ญ์‹œ์˜ค.

๋ฉ”๋ชจ:

  • XCode 12
  • Apple ID๋กœ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ค์ œ Apple ID๋กœ ์ƒŒ๋“œ ๋ฐ•์Šค์—์„œ ํ…Œ์ŠคํŠธ (ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž ์•„๋‹˜)
  • iOS 13.7์„ ์‹คํ–‰ํ•˜๋Š” iPad์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • iOS 14 ์•ฝ์† ์ˆ˜์ •์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿš need contribution ๐Ÿ“ฑ iOS ๐Ÿ™ help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ฌ๊ธฐ์— ๋‚ด๊ฐ€ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ธฐ ์œ„ํ•ด. ๋‚˜๋Š” ์ด๋ฏธ iOS 12์—์„œ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ... iOS 14๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

requestSubscription์— ๋Œ€ํ•œ ๋‚ด ์š”์ฒญ์€ ์˜์›ํžˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค ... ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๋•์…˜์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

๋ชจ๋“  57 ๋Œ“๊ธ€

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ค‘๋‹จ๋˜์ง€ ์•Š์ง€๋งŒ [] ๋ฐ˜ํ™˜

๊ตฌ๋งค ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ๊ตฌ๋งค ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ˜ธ์ถœ๋˜์ง€๋งŒ requestSubscription ํ˜ธ์ถœ์€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์—ฌ๊ธฐ์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค https://github.com/dooboolab/react-native-iap/pull/1064

์ด์ „์— ์•ฝ์† ์ˆ˜์ •์„ ์ ์šฉ ํ–ˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

iOS14์—์„œ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‚ด๊ฐ€ ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
// request purchase, listener registered above will receive notification when processing done RNIap.requestSubscription(this.productIds[0]).catch(err => { console.log(err.code, err.message); });

๋ถ€์šธ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ false ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”๋ฐ ์ด๊ฒƒ์ด ๊ถŒ์žฅ ์‚ฌํ•ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€๊ณ„์—†์ด iOS14์—์„œ ์—ฌ์ „ํžˆ ๋งค์šฐ ์ด์ƒํ•œ ๋™์ž‘์„๋ณด๊ณ  ์žˆ์œผ๋ฉฐ TestFlight๋ฅผ ํ†ตํ•ด iOS 13์„ ์‹คํ–‰ํ•˜๋Š” iPhone ๋ฐ iPad์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€์šธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  requestSubscription์„ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ iOS 14์—์„œ ๊ตฌ๋งค ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ž˜๋ชป๋œ ์˜์ˆ˜์ฆ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” RequestUpdatedListener๋ฅผ ์ฆ‰์‹œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

TestFlight๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ iOS14 ๋ฐ xCode 12์—์„œ ๊ตฌ๋…์— ๋ฌธ์ œ๊ฐ€์—†๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

getPurchaseHistory() ๋˜๋Š” getAvailablePurchases() ์ง์ „์— requestSubscription() ํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์€ iOS 14์—์„œ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ๋ฆ„ ์ดˆ๊ธฐ์— getAvailablePurchases ()๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ๋กœ๋“œ์‹œ ๊ตฌ๋… ํ™”๋ฉด ๋ฐ”๋กœ ์•ž์˜ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.

๋„ค, ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ iOS 14์˜ ๋ฒ„๊ทธ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฒฐํ•จ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ–ˆ๋Š”๋ฐ ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. getAvailablePurchases () ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ตฌ๋งค ํŒ์—…์ด ๋ฐœ์ƒํ•˜๊ณ  ๊ตฌ๋งค๊ฐ€ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ๋„ App Load์—์„œ ๊ตฌ๋… ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— getAvailablePurchases๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด iOS 14 ํŒจ์น˜๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ํ•  ์ˆ˜์žˆ๋Š” ์ผ์€ ์—†์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , theDev23 ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ฒœ๋งŒ์—์š”. ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋งˆ๋„ ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ๊ฒ€์‚ฌ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์„œ๋ฒ„๊ฐ€ ์ด๊ฒƒ์„ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. ๋‚ด ๋ฐ˜์‘์˜ ์ฝ”๋“œ๋ฅผ Firebase Cloud Function๊ณผ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ์‰ฌ์šด๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ๋‹ค์‹œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผํ• ๊นŒ์š”? ์•„๋งˆ ๋ฉ์ฒญํ•œ ์งˆ๋ฌธ ์ด๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ ๋ชจ๋‘ ๋ฉ์ฒญํ•œ ์งˆ๋ฌธ์„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. :)

@ the- dut iaphub ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„ ์˜์ˆ˜์ฆ ํ™•์ธ์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๊ตญ ์ค‘์„œ๋ถ€ ์ง€์—ญ์— ๊ฑฐ์ฃผํ•˜๋Š” ๊ฒฝ์šฐ ์›ํ•˜๋Š” ์Œ๋ฃŒ. :)

๋ผ์ด๋ธŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. @ theDev23 iOS์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ† ๋ก  ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ผ์ •์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@nicknjpconsultingllc ๋งํฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์Šค์Šค๋กœ ํŒŒ๊ณ  ๋“ค์—ˆ๋‹ค.

@ the-dut Firebase Cloud Functions๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

purchaseUpdatedListener์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌ๋งคํ•  ๋•Œ ์˜์ˆ˜์ฆ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ ํ•œ ๋‹ค์Œ ์•ฑ๋กœ๋“œ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์˜์ˆ˜์ฆ์„ ๊ฐ€์ ธ ์™€์„œ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ๋งŒ๋ฃŒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋•๋ถ„์— getAvailablePurchases () ํ˜ธ์ถœ์„ ์—†์•จ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. iOS14์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ •๋ง ์ž˜ ์ž‘๋™ํ–ˆ๊ณ  ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค. ์ด์ œ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๊ฐ€์ ธ ๊ฐ€์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ํ•˜๋Š” ์ „๋ถ€๋ผ๋ฉด, ํŠธ๋žœ์žญ์…˜์„ ์™„๋ฃŒ ํ•  ๋•Œ๊นŒ์ง€ ๊ตฌ๋…์— ๋Œ€ํ•œ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ (๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋™ ๊ฐฑ์‹ )์— ๋Œ€ํ•ด UpdatedPurchaseListener๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ž๋™ ๊ฐฑ์‹ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ๊ฐ„ ์•Œ๋ฆผ์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์—…๋ฐ์ดํŠธ ๋œ PurchaseListener๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„œ๋ฒ„ ๊ฐ„ ํ†ตํ•ฉ์ด ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ฝ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚˜์€ (๊ทธ๋ฆฌ๊ณ  ๋” ๊ฐ„๋‹จํ•œ) ์†”๋ฃจ์…˜ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

getPurchaseHistory๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  promise ์ˆ˜์ •์„ ์ ์šฉํ•œ ํ›„์—๋„์ด ๋ฌธ์ œ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋งค ๋Œ€ํ™” ์ƒ์ž๋ฅผ ํŒ์—… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ตฌ๋งค ์š”์ฒญ์„ํ•˜๊ธฐ ์ „์— AIP์— ๊ฑฐ๋Š” ๋ชจ๋“  ์ „ํ™”๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. getAvailablePurchases ()๋„ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

getAvailablePurchases () ๋ฐ getPurchaseHistory ()์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์ œ์™ธ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  requestSubscription ()์ด ์ด๋Ÿฌํ•œ ํ˜ธ์ถœ๋กœ ๊ตฌ๋งค ๋ฉ”๋‰ด๋ฅผ ํŒ์—…ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @ HamzaIkram2727 , ์ œ๊ฐ€

@ the-dut getAvailablePurchases () ๋ฐ getPurchaseHistory () ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋งค ๋Œ€ํ™”์ฐฝ์ด ๋‚˜์˜ค์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ๊ตฌ๋งค๊ฐ€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ finishTrsanactionIOS ๋ฐ finishTransation ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฑ์„ ์ข…๋ฃŒํ•˜์—ฌ iOS ๊ธฐ๋ณธ ๊ตฌ๋งค ๋Œ€ํ™” ์ƒ์ž๋ฅผ ์–ป์„ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งˆ์นจ๋‚ด ๋ช‡ ๊ฐ€์ง€ ์•ฝ์†์ด ํ•ด๊ฒฐ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. react-native-iap ์•ฝ์† ์ข…์†์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋™์ž‘์ด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. requestSubscription ํ˜ธ์ถœ์€ ์•ฑ์—์„œ ํ•ด๊ฒฐ๋˜์ง€๋งŒ ์•ฑ์„ ์ข…๋ฃŒ ํ•  ๋•Œ๊นŒ์ง€ ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

getAvailblePruchases ()์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์•ฝ์†์ด ํ•ด๊ฒฐ๋˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. iOS 14 ๊ธฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์š”

  1. getAvailablePurchases ()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. requestSubscription ()

getAvailablePurchase๋ฅผ ์ œ๊ฑฐํ–ˆ๊ณ  ๋ถ„๋ช…ํžˆ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ •๋ง ์ด์ƒํ•œ ํ–‰๋™์ด๊ณ  ๋‚ด๊ฐ€ ์•Œ์•„ ์ฐจ๋ฆฐ ๊ฒƒ์€ iOS 14์—์„œ๋งŒ ์ผ์–ด๋‚˜๋Š” ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค ... ๋‚˜๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๊ณ  ์• ํ”Œ์— ์—ฐ๋ฝํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํŒจํ‚ค์ง€์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณธ์ธ.

์—ฌ๊ธฐ์— ๋‚ด๊ฐ€ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ธฐ ์œ„ํ•ด. ๋‚˜๋Š” ์ด๋ฏธ iOS 12์—์„œ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ... iOS 14๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

requestSubscription์— ๋Œ€ํ•œ ๋‚ด ์š”์ฒญ์€ ์˜์›ํžˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค ... ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๋•์…˜์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

๊ธ€์Ž„, "์ฆ๊ฑฐ์šด"ํ•˜๋ฃจ๋ฅผ ๋ณด๋‚ธ ํ›„ ์ด๊ฒƒ์ด ์ง€๊ธˆ๊นŒ์ง€ ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋‹ค. ๋‚˜๋Š” ๋‹ค๋ฅธ OS ๋ฒ„์ „์— ๋‹ค์–‘ํ•œ ์žฅ์น˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ฐ๊ฐ์—์ด ๋ฌธ์ œ๊ฐ€์žˆ๋‹ค. ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ Apple์— ๋ฌธ์˜ํ–ˆ์œผ๋ฉฐ ํ™•์‹คํ•œ ๊ฒฐ๋ก ์—†์ด ์—ฌ์ „ํžˆ ์ผ€์ด์Šค๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํŒจํ‚ค์ง€์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๊ฒƒ์€ ์• ํ”Œ ์ธก์˜ ๋ฌธ์ œ ์ผ ๊ฒƒ์ด๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด์ด ์Šค๋ ˆ๋“œ์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ๋ณด๊ณ  ํ•œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. In App Purchase ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋ฐ ์ผ๊ด€์„ฑ์ด ์—†์œผ๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจํ•œ ์ด์œ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” E_UNKNOWN ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ํ”ผ๋“œ๋ฐฑ์ด 0 ์ธ ๊ฒฝ์šฐ๋„ ์žˆ๊ณ , 10 ๋ถ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ํŒ์—…์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒŒ๋“œ ๋ฐ•์Šค ์‚ฌ์šฉ์ž, ๋น„ ์ƒŒ๋“œ ๋ฐ•์Šค ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์‚ฌ์šฉ์ž ๋ฐ ์žฅ์น˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์˜ค๋ฅ˜ ๋˜๋Š” ๊ฒฐ์ •์ ์ด๊ณ  ํ†ต์ฐฐ๋ ฅ์žˆ๋Š” ๋กœ๊ทธ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊ทธํ•˜๊ธฐ๊ฐ€ ๋‹ต๋‹ตํ• ๋ฟ์ž…๋‹ˆ๋‹ค ... ๊ธ€์Ž„์š”, ์—ฌ๋Ÿฌ๋ถ„์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์กฐ์–ธ์ด๋‚˜ ํ†ต์ฐฐ๋ ฅ์ด ์žˆ๋‹ค๋ฉด, ์ €๋Š” ๋“ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ์ œ๊ฐ€ Apple๋กœ๋ถ€ํ„ฐ ์†Œ์‹์ด ์žˆ๋‹ค๋ฉด, ๊ณ„์† ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ...
์ถ”์‹  ํŽธ์ง‘. ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์„ ์ฝ์€ ํ›„ ํ•œ ๊ฐ€์ง€๋Š” ์ผ๊ด€์„ฑ์ด ์žˆ์œผ๋ฉฐ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .iOS 14์—์„œ๋Š” ํ…Œ์ŠคํŠธ ํ•œ ๋ชจ๋“  OS ๋ฒ„์ „ (12, 13.7, 14)์—์„œ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ผ๊ด€๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ OS ๋ฒ„์ „๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์ธ์ƒ์„ ๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด Sandbox ์„œ๋ฒ„ ๋˜๋Š” Apple ์ธก์˜ ๋‹ค๋ฅธ ๊ฒƒ์ด์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค ..

App Store์—์„œ ์Šน์ธ ํ•œ ๋นŒ๋“œ๋กœ ์•ฑ ํŒจํ‚ค์ง€๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ iOS ๋ฒ„์ „ 14 ์ด์ƒ์—์„œ ๋ถˆ์ผ์น˜๊ฐ€ ๋” ๋‘๋“œ๋Ÿฌ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์€ Apple์ด iOS 14+์—์„œ ์˜์ˆ˜์ฆ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ๊ตฌ๋งค ํ•œ ๊ณ„์ •์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. Sandbox์—์„œ ์ƒˆ ๊ณ„์ • ๋งŒ๋“ค๊ธฐ
  2. ๊ตฌ๋งคํ•˜๊ธฐ (restorePurchases์— ๊ตฌ๋งค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค)
  3. ๋งŒ๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.
  4. ๋‹ค์‹œ ๊ตฌ์ž…ํ•˜์‹ญ์‹œ์˜ค. (์ด์ œ ๋ณต์› ๊ตฌ๋งค๊ฐ€ ๊ฐœ์ฒด์— ์‘๋‹ตํ•˜๊ณ  ๊ตฌ๋งค๋ฅผ ํ™•์ธํ•˜๋Š” ํŒ์—…์ด ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ)

์ด์ƒ ํ•ด์š”. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๋‹ค์Œ์„ ์–ป์—ˆ๋‹ค

  1. restorePurchases๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ. "paymentQueueRestoreCompletedTransactionsFinished"๋ฆฌ์Šค๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {  ////////   RESTORE
    NSLog(@"\n\n\n  paymentQueueRestoreCompletedTransactionsFinished  \n\n.");
    NSMutableArray* items = [NSMutableArray arrayWithCapacity:queue.transactions.count];
    NSLog(@"Number of items in my array is: %d", [queue.transactions count]);//this will return (5)

    for(SKPaymentTransaction *transaction in queue.transactions) {
        if(transaction.transactionState == SKPaymentTransactionStateRestored
           || transaction.transactionState == SKPaymentTransactionStatePurchased) {
            [self getPurchaseData:transaction withBlock:^(NSDictionary *restored) {
                [items addObject:restored];
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            }];
        }
    }
    NSLog(@"\n  finished paymentQueueRestoreCompletedTransactionsFinished ");

    [self resolvePromisesForKey:@"availableItems" value:items];
}

์—ฌ๊ธฐ์—์„œ ํŠธ๋žœ์žญ์…˜ ํฌ๊ธฐ๋ฅผ ๋กœ๊ทธ์— ์ธ์‡„ํ•˜๊ณ  23 ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ํ•จ์ˆ˜ paymentQueue ๊ฐ€ ์‹คํ–‰๋˜์–ด ๋ณต์› ํŠธ๋žœ์žญ์…˜์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
case SKPaymentTransactionStateRestored: {
          NSLog(@"Restored ");

         NSLog(@"\n  paymentQueue transaction : %@", transaction.transactionDate);
         [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
           break;
  }
  1. resolvePromisesForKey ๊ฐ€ restorePurchase๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  2. requestSubscription ํ•จ์ˆ˜ buyProduct ํ˜ธ์ถœ ์‹œ์ž‘

  3. ์—ฌ๊ธฐ์— ๋กœ๊ทธ๋ฅผ๋ณด๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
 NSLog(@"\n  produc purchase : %@", product);

  SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];

  NSLog(@"\n  payment buy product : %@", payment.productIdentifier);

  [[SKPaymentQueue defaultQueue] addPayment:payment];
  1. ๋‹ค์Œ ๋กœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    a) RestorePurchases ๋กœ๊ทธ
2020-10-22 14:01:49.319677-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.319784-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 16:46:53 2020
2020-10-22 14:01:49.319930-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.319970-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:16:45 2020
2020-10-22 14:01:49.320044-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.320082-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:06:37 2020
2020-10-22 14:01:49.320155-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.320275-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:01:37 2020
2020-10-22 14:01:49.320421-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.320532-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:49:31 2020
2020-10-22 14:01:49.320671-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.320776-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:21:39 2020
2020-10-22 14:01:49.320915-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321018-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:26:39 2020
2020-10-22 14:01:49.321180-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321282-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 16:56:53 2020
2020-10-22 14:01:49.321414-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321516-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 16:51:53 2020
2020-10-22 14:01:49.321648-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321749-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 08:04:31 2020
2020-10-22 14:01:49.321879-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.321984-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:11:41 2020
2020-10-22 14:01:49.322113-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.322214-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 16:41:53 2020
2020-10-22 14:01:49.322346-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.322444-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:31:39 2020
2020-10-22 14:01:49.323955-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.324097-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 12:07:14 2020
2020-10-22 14:01:49.324240-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.324344-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:16:39 2020
2020-10-22 14:01:49.324474-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.324579-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:11:39 2020
2020-10-22 14:01:49.324709-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.324808-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:39:31 2020
2020-10-22 14:01:49.324934-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.325030-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:59:31 2020
2020-10-22 14:01:49.325163-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.325260-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:26:45 2020
2020-10-22 14:01:49.327079-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.327212-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:44:31 2020
2020-10-22 14:01:49.327360-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.327465-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 07:54:31 2020
2020-10-22 14:01:49.327594-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.327695-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 14:37:11 2020
2020-10-22 14:01:49.327823-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:49.327923-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:21:45 2020
2020-10-22 14:01:49.328099-0500 ApplicationTest[532:51039] 

  paymentQueueRestoreCompletedTransactionsFinished  

2020-10-22 14:01:49.328204-0500 ApplicationTest[532:51039] Number of items in my array is: 23
2020-10-22 14:01:49.336873-0500 ApplicationTest[532:51039] 
  finished paymentQueueRestoreCompletedTransactionsFinished
2020-10-22 14:01:50.317721-0500 ApplicationTest[532:51234] 

๋น„. buySubcription ๋กœ๊ทธ :

2020-10-22 14:01:50.319607-0500 ApplicationTest[532:51234] 
  produc purchase : <SKProduct: 0x2839c0630>

2020-10-22 14:01:50.319694-0500 ApplicationTest[532:51234] 
  payment buy product : test.applicationtest

**2020-10-22 14:01:50.319849-0500 ApplicationTest[532:51039] Restored
2020-10-22 14:01:50.319895-0500 ApplicationTest[532:51039] 
  paymentQueue transaction : Mon Oct  5 19:16:45 2020**

๊ทธ๋ž˜์„œ paymentQueue ๋ฉ”์„œ๋“œ๊ฐ€ 10 ์›” 5 ์ผ์ž SKPaymentTransactionStateRestored๋กœ ์‹คํ–‰๋˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@andresordonezfm ๊ตฌ๋งค ํ›„ finishTransaction ์ „ํ™” ํ–ˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ํŒ์—…๊ณผ ๊ด€๋ จํ•˜์—ฌ # 863์— ์ œ๊ณต๋œ ํ›Œ๋ฅญํ•œ ์‹œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@andresordonezfm ๊ตฌ๋งค ํ›„ finishTransaction ์ „ํ™” ํ–ˆ์Šต๋‹ˆ๊นŒ?

ํ™•์‹คํ•œ! ๋˜ํ•œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค๋ฉด clearTransactionIOS ()๋ฅผ ํ˜ธ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํŒ์—…๊ณผ ๊ด€๋ จํ•˜์—ฌ # 863์— ์ œ๊ณต๋œ ํ›Œ๋ฅญํ•œ ์‹œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฒ€ํ†  ํ•  ๊ฒƒ์ด๋‹ค

์†”๋ฃจ์…˜ / ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„์ง ์—†์Šต๋‹ˆ๋‹ค. ๊ฒ€ํ†  ์ค‘์— Apple์ด StoreKit ๋ฐ ์•Œ๋ฆผ ์œ ํ˜•์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

https://developer.apple.com/videos/play/wwdc2020/10661/

ํŒจํ‚ค์ง€๋ฅผ 4.5.2๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‹น์‹ ์ด ์ „ํ™”ํ•˜๋Š”์ง€ ํ™•์ธ
await RNIap.initConnection();
RNIap.requestSubscription ์ด์ „

์ด ๋ฌธ์ œ์— ๋”ฐ๋ผ ํ•ด๊ฒฐ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/dooboolab/react-native-iap/issues/1146

์šฐ์„  ์˜์ˆ˜์ฆ์„ ๊ฒ€์ฆ ํ•  ๋•Œ isTest ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ true ๋ฅผ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค (ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์ผ ๋•Œ๋„).
๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜์ˆ˜์ฆ์„ ํ™•์ธํ•˜๊ธฐ ์ „์— purchaseUpdatedListener ์— RNIap.clearTransactionIOS(); ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  RNIap.finishTransaction(purchase, false) ๋’ค์— RNIap.finishTransactionIOS(purchase.transactionId);

TestFlight์—์„œ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ์ฒ˜์Œ์œผ๋กœ (์ƒŒ๋“œ ๋ฐ•์Šค ๊ณ„์ •์œผ๋กœ) ๊ตฌ๋งค๋ฅผ ์™„๋ฃŒ ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ”„๋กœ๋•์…˜์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿคž

์ด ๋ฌธ์ œ์— ๋”ฐ๋ผ ํ•ด๊ฒฐ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1146 ๋…„

์šฐ์„  ์˜์ˆ˜์ฆ์„ ๊ฒ€์ฆ ํ•  ๋•Œ isTest ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ true ๋ฅผ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค (ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์ผ ๋•Œ๋„).
๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜์ˆ˜์ฆ์„ ํ™•์ธํ•˜๊ธฐ ์ „์— purchaseUpdatedListener ์— RNIap.clearTransactionIOS(); ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  RNIap.finishTransaction(purchase, false) ๋’ค์— RNIap.finishTransactionIOS(purchase.transactionId);

TestFlight์—์„œ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ์ฒ˜์Œ์œผ๋กœ (์ƒŒ๋“œ ๋ฐ•์Šค ๊ณ„์ •์œผ๋กœ) ๊ตฌ๋งค๋ฅผ ์™„๋ฃŒ ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ”„๋กœ๋•์…˜์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿคž

์•ˆ๋…• ์นœ๊ตฌ ๋‚˜๋Š”์ด ํ•ด๊ฒฐ์ฑ…์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋งค ๋ณต์› ํ›„ ๊ตฌ๋… ๊ตฌ๋งค๋ฅผ ์‹œ๋„ ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ณด์ธ๋‹ค ์–ด๋”” @andresordonezfm์—์„œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค SKPaymentQueue ์˜ ๊ฑฐ๋ž˜ ์ˆ˜์‹  SKPaymentTransactionStateRestored ๋Œ€์‹ ์—, ์œ ํ˜•์„ SKPaymentTransactionStatePurchasing "๋ณต์›"์— ๋Œ€ํ•œ ์ด์œ ์ด๋‹ค ์œ ํ˜•, ๊ตฌ๋งค์‹œ ๋กœ๊ทธ์ธ๋˜๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

๋Šฆ์–ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€ํ†  ์ค‘์—์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ณต์› ๊ตฌ๋งค๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๋™์ผํ•œ ๋ณต์› ๊ตฌ๋งค์˜ ์ƒˆ๋กœ ์—ด๋ฆฐ ํŠธ๋žœ์žญ์…˜์ด ์ œ๋Œ€๋กœ ๋‹ซํžˆ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ•์ œ๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ clearTransactionIOS ํ•จ์ˆ˜, removeTransactions ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์ด ๋‹ซํž ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ์•ฝ์†์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ : react-native-iap / ios / RNIapIos.m

  1. RCT_EXPORT_METHOD (clearTransaction) ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
RCT_EXPORT_METHOD(clearTransaction:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject) {  

    NSLog(@"\n\n\n  ***  clear remaining Transactions. Call this before make a new transaction   \n\n.");

    NSArray *pendingTrans = [[SKPaymentQueue defaultQueue] transactions];
    countPendingTransaction = (NSInteger)(pendingTrans.count);

    if (countPendingTransaction > 0) {
        [self addPromiseForKey:@"cleaningTransactions" resolve:resolve reject:reject];

        for (SKPaymentTransaction *transaction in pendingTrans) {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }

    } else {
        resolve(nil);
    }
}
  1. ๋‹ค์Œ ์ƒˆ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (RNIapIos.m ํŒŒ์ผ ๋์—์ด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. "@end"์ค„ ์•ž์—).
-(void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions {
    NSLog(@"removedTransactions");
    if (countPendingTransaction != nil && countPendingTransaction > 0) {
        countPendingTransaction--;
        if (countPendingTransaction == 0) {
            [self resolvePromisesForKey:@"cleaningTransactions" value:nil];
            countPendingTransaction = nil;
        }
    }
}

ํŒŒ์ผ : react-native-iap / ios / RNIapIos.h

  1. "SKProduct * promotedProduct"์ฝ”๋“œ์—์„œ ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค
  NSInteger countPendingTransaction;

๋งˆ์ง€๋ง‰์œผ๋กœ "RNIap.requestSubscription (productId, false)"ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์ž…๋‹ˆ๋‹ค.
clearTransactionIOS ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    if (Platform.OS === 'ios') {
      await RNIap.clearTransactionIOS();
    }
    await RNIap.requestSubscription(productId, false);

๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ณต์› ๊ตฌ๋งค์˜ ์ด์ƒํ•œ ๋™์ž‘์€ ์ด์œ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ Sandbox์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค, ์ €์ž, ๋„์™€์ฃผ์„ธ์š”, ๋‹น์‹ ์˜ ๊ฐ€์กฑ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค, ์ €์ž, ๋„์™€์ฃผ์„ธ์š”, ๋‹น์‹ ์˜ ๊ฐ€์กฑ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค

์•ˆ๋…• ์นœ๊ตฌ, ์ด์ „ ๋Œ“๊ธ€์—์„œ ๋‚ด๊ฐ€ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋‹จ๊ณ„๊ฐ€ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜๊ฒฌ์ด ์žˆ์œผ์‹œ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”

@andresordonezfm ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ PR์„ ์ƒ์„ฑ ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ณต์› ํ›„ ๋ฐœ์ƒํ•˜๋Š” SKPaymentTransactionStateRestored ๊ตฌ๋งค ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ƒˆ ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  ๋ช‡ ๋ฒˆ ๊ตฌ๋งคํ–ˆ๋Š”๋ฐ ํ•ด๋‹น ๊ณ„์ •์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— RNIap.getAvailablePurchases() ๋ฐ RNIap.requestSubscription() ๋กœ ์ „ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งค ํ•œ ๊ธˆ์•ก๊ณผ ๊ด€๋ จ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„์ง ํ”„๋กœ๋•์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, "์ฆ๊ฑฐ์šด"ํ•˜๋ฃจ๋ฅผ ๋ณด๋‚ธ ํ›„ ์ด๊ฒƒ์ด ์ง€๊ธˆ๊นŒ์ง€ ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋‹ค. ๋‚˜๋Š” ๋‹ค๋ฅธ OS ๋ฒ„์ „์— ๋‹ค์–‘ํ•œ ์žฅ์น˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ฐ๊ฐ์—์ด ๋ฌธ์ œ๊ฐ€์žˆ๋‹ค. ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ Apple์— ๋ฌธ์˜ํ–ˆ์œผ๋ฉฐ ํ™•์‹คํ•œ ๊ฒฐ๋ก ์—†์ด ์—ฌ์ „ํžˆ ์ผ€์ด์Šค๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํŒจํ‚ค์ง€์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๊ฒƒ์€ ์• ํ”Œ ์ธก์˜ ๋ฌธ์ œ ์ผ ๊ฒƒ์ด๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด์ด ์Šค๋ ˆ๋“œ์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ๋ณด๊ณ  ํ•œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. In App Purchase ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋ฐ ์ผ๊ด€์„ฑ์ด ์—†์œผ๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจํ•œ ์ด์œ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” E_UNKNOWN ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ํ”ผ๋“œ๋ฐฑ์ด 0 ์ธ ๊ฒฝ์šฐ๋„ ์žˆ๊ณ , 10 ๋ถ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ํŒ์—…์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒŒ๋“œ ๋ฐ•์Šค ์‚ฌ์šฉ์ž, ๋น„ ์ƒŒ๋“œ ๋ฐ•์Šค ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์‚ฌ์šฉ์ž ๋ฐ ์žฅ์น˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์˜ค๋ฅ˜ ๋˜๋Š” ๊ฒฐ์ •์ ์ด๊ณ  ํ†ต์ฐฐ๋ ฅ์žˆ๋Š” ๋กœ๊ทธ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊ทธํ•˜๊ธฐ๊ฐ€ ๋‹ต๋‹ตํ• ๋ฟ์ž…๋‹ˆ๋‹ค ... ๊ธ€์Ž„์š”, ์—ฌ๋Ÿฌ๋ถ„์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์กฐ์–ธ์ด๋‚˜ ํ†ต์ฐฐ๋ ฅ์ด ์žˆ๋‹ค๋ฉด, ์ €๋Š” ๋“ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ์ œ๊ฐ€ Apple๋กœ๋ถ€ํ„ฐ ์†Œ์‹์ด ์žˆ๋‹ค๋ฉด, ๊ณ„์† ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ...
์ถ”์‹  ํŽธ์ง‘. ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์„ ์ฝ์€ ํ›„ ํ•œ ๊ฐ€์ง€๋Š” ์ผ๊ด€์„ฑ์ด ์žˆ์œผ๋ฉฐ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .iOS 14์—์„œ๋Š” ํ…Œ์ŠคํŠธ ํ•œ ๋ชจ๋“  OS ๋ฒ„์ „ (12, 13.7, 14)์—์„œ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ผ๊ด€๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ OS ๋ฒ„์ „๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์ธ์ƒ์„ ๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด Sandbox ์„œ๋ฒ„ ๋˜๋Š” Apple ์ธก์˜ ๋‹ค๋ฅธ ๊ฒƒ์ด์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค ..

@andresordonezfm (https://github.com/dooboolab/react-native-iap/issues/1120#issuecomment-734805587)์ด ์ œ์•ˆํ•œ ์ˆ˜์ • ์‚ฌํ•ญ ์ดํ›„์—๋„ ์ œ๊ฐ€ ๊ฒช๊ณ ์žˆ๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ @ 106firestarter , Apple์ด ๋‹ต์žฅ ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ ๋™์•ˆ ๊ฐœ๋ฐœ์ž ํฌ๋Ÿผ์—์„œ ๋ฌด์—‡์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ณต์› ํ›„ ๋ฐœ์ƒํ•˜๋Š” SKPaymentTransactionStateRestored ๊ตฌ๋งค ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ƒˆ ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  ๋ช‡ ๋ฒˆ ๊ตฌ๋งคํ–ˆ๋Š”๋ฐ ํ•ด๋‹น ๊ณ„์ •์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— RNIap.getAvailablePurchases() ๋ฐ RNIap.requestSubscription() ๋กœ ์ „ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งค ํ•œ ๊ธˆ์•ก๊ณผ ๊ด€๋ จ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„์ง ํ”„๋กœ๋•์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ ํ•  ๊ฒƒ์ด์ง€๋งŒ ์‹ค์ œ๋กœ ์ƒ์‚ฐ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ก์„ ์œ„ํ•ด getAvailablePurchases() ์ „์— requestSubscription() getAvailablePurchases() ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ ๊ฐ€๋Šฅ์„ฑ :

์ƒˆ๋กœ์šด ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ด์ƒ @Paduado๊ฐ€ ์–ธ๊ธ‰ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (https://github.com/dooboolab/react-native-iap/issues/1120#issuecomment-742685043).

์ˆ˜์ • : @andresordonezfm ์ด ์ œ์•ˆํ•œ ์ˆ˜์ • ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด ์ชฝ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •์ด ์—†์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ตฌ๋… ํ›„ ์ด์ „์— ๊ฒฝํ—˜ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋™์ž‘์ด ๋‹ค์‹œ ๋‚˜ํƒ€๋‚˜ ๋” ์ด์ƒ ๋‹ค์‹œ ๊ตฌ๋… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ ์šฉํ•œ ํ›„ ํ•œ ๊ฐ€์ง€ ๋” ๋ˆˆ์— ๋„๋Š” ์ ์€ ์ƒŒ๋“œ ๋ฐ•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 5 ๋ฒˆ ๊ฐฑ์‹  ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€๋งŒ ๊ตฌ๋…์ด ๋” ์ด์ƒ ์ž๋™ ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@andresordonezfm ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ PR์„ ์ƒ์„ฑ ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, ๋Šฆ์–ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ iap์— ๋Œ€ํ•œ ํ’€ ์š”์ฒญ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

~ ์ƒˆ ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ด์ƒ @Paduado๊ฐ€ ์–ธ๊ธ‰ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( # 1120 (์ฝ”๋ฉ˜ํŠธ) ). ~

์ˆ˜์ • : @andresordonezfm ์ด ์ œ์•ˆํ•œ ์ˆ˜์ • ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด ์ชฝ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •์ด ์—†์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ตฌ๋… ํ›„ ์ด์ „์— ๊ฒฝํ—˜ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋™์ž‘์ด ๋‹ค์‹œ ๋‚˜ํƒ€๋‚˜ ๋” ์ด์ƒ ๋‹ค์‹œ ๊ตฌ๋… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ ์šฉํ•œ ํ›„ ํ•œ ๊ฐ€์ง€ ๋” ๋ˆˆ์— ๋„๋Š” ์ ์€ ์ƒŒ๋“œ ๋ฐ•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 5 ๋ฒˆ ๊ฐฑ์‹  ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€๋งŒ ๊ตฌ๋…์ด ๋” ์ด์ƒ ์ž๋™ ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•ˆ๋…• ์นœ๊ตฌ ์ƒŒ๋“œ ๋ฐ•์Šค ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ ํ–‰๋™์„ ๊ณ„์†ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@andresordonezfm ์˜ˆ, Apple์˜ ์ƒŒ๋“œ ๋ฐ•์Šค์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€ ์ดํ›„๋กœ ๋” ์ด์ƒ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์•„์ง ํ”„๋กœ๋•์…˜์„ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ๊นŒ์ง€ ๊ณ ๊ฐ์œผ๋กœ๋ถ€ํ„ฐ ๋ถˆ๋งŒ์„๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

@Paduado๊ฐ€ ์ด์ „์—๋ณด๊ณ  ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค . ๐Ÿคทโ€โ™‚๏ธ ๐Ÿ˜•

@andresordonezfm ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด ๋˜‘๊ฐ™์€ ์ผ๊ณผ ํŒจ์น˜ ์ด์Œ์ƒˆ๋ฅผ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž ์žฌ์ ์œผ๋กœ cleartTransactionsIOS() ์„ (๋ฅผ) ์ค‘๋‹จ์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ์ฝ”๋“œ์— ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. removeTransactions ๋Š” ์ œ๊ฑฐ ํ•  ํ•˜๋‚˜ ์ด์ƒ์˜ ํŠธ๋žœ์žญ์…˜๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ removeTransactions ์—์„œ๋Š” ๋‹ค์Œ์„ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

        countPendingTransaction -= [transactions count];

์‹ค์ œ๋กœ๋Š” ํ•œ ๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ removedTransactions ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ ์• ํ”Œ ๋ฌธ์„œ ์—์„œ๋Š” ํ•˜๋‚˜ ์ด์ƒ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  ์ข‹์€ ์ฐพ๊ธฐ! ๋‚˜๋Š” ์ด๊ฒƒ์— ํ•œ๋™์•ˆ ๋ถ™์–ด ์žˆ์—ˆ๋‹ค.

@andresordonezfm ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด ๋˜‘๊ฐ™์€ ์ผ๊ณผ ํŒจ์น˜ ์ด์Œ์ƒˆ๋ฅผ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž ์žฌ์ ์œผ๋กœ cleartTransactionsIOS() ์„ (๋ฅผ) ์ค‘๋‹จ์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ์ฝ”๋“œ์— ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. removeTransactions ๋Š” ์ œ๊ฑฐ ํ•  ํ•˜๋‚˜ ์ด์ƒ์˜ ํŠธ๋žœ์žญ์…˜๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ removeTransactions ์—์„œ๋Š” ๋‹ค์Œ์„ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

        countPendingTransaction -= [transactions count];

์‹ค์ œ๋กœ๋Š” ํ•œ ๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ removedTransactions ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ ์• ํ”Œ ๋ฌธ์„œ ์—์„œ๋Š” ํ•˜๋‚˜ ์ด์ƒ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  ์ข‹์€ ์ฐพ๊ธฐ! ๋‚˜๋Š” ์ด๊ฒƒ์— ํ•œ๋™์•ˆ ๋ถ™์–ด ์žˆ์—ˆ๋‹ค.

์•ˆ๋…• ์นœ๊ตฌ, ์ถ”์ฒœ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์„ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๋ณ€๊ฒฝ์œผ๋กœ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์ฐธ๊ณ  : ์˜ˆ, ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ๊ฒ€ํ† ํ–ˆ์ง€๋งŒ ํŠธ๋žœ์žญ์…˜์—์„œ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋งŒ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์•„์ฃผ ์ข‹์€ ๊ถŒ๊ณ ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰