React-native-iap: ์—‘์Šคํฌ์—์„œ ์ธ์•ฑ ๊ตฌ๋งค

์— ๋งŒ๋“  2018๋…„ 05์›” 31์ผ  ยท  38์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dooboolab/react-native-iap

์•ˆ๋…•ํ•˜์„ธ์š”,

์šฐ๋ฆฌ๋Š” Expo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ค‘์š”ํ•œ ์ฃผ์ œ๋Š” ์ธ์•ฑ ๊ตฌ๋งค์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋‚˜๋ฅผ ๋„์šธ ์ˆ˜
์—‘์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์•ฑ ๊ตฌ๋งค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋”ฐ๋ผ์•ผ ํ•  ํ•„์š”ํ•œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

โ“ question ๐Ÿšถ๐Ÿป stale

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

๊ฐ„๋‹จํžˆ:

  • ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ detached
  • exp detach
  • ํ‰์†Œ์—ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜์„ธ์š”
  • js ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด master ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค.
  • master ์ฝ”๋”ฉ ํ•  ๋•Œ IAP ๋ชจ๋“ˆ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.
import { NativeModules } from 'react-native';
const { RNIapModule } = NativeModules;
function hasIAP() {
  return !!NativeModules.RNIapModule;
}
  • ์ด๋ ‡๊ฒŒํ•˜๋ฉด IAP ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • IAP๋ฅผ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ๋ถ„๋ฆฌ ๋œ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋ชจ๋‘ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ๋ถˆ๋Ÿ‰> :)

์—ฌ๊ธฐ์—์„œ exp detach ๋ผ๋Š” ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋Š” /ios & /android ํด๋”๋ฅผ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ RN ์•ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜ Expo ์•ฑ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, fastlane์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ธฐ ๋งŒํ•˜๋ฉด ๊ธฐ๋ณธ ํ•ญ๋ชฉ์„ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ„๊ธฐ๋Š” SDK ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ๋“  ์—…๋ฐ์ดํŠธ์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ๋ถ„๋ฆฌํ•˜๊ณ ์ด lib๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐ„๋‹จํžˆ:

  • ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ detached
  • exp detach
  • ํ‰์†Œ์—ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜์„ธ์š”
  • js ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด master ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค.
  • master ์ฝ”๋”ฉ ํ•  ๋•Œ IAP ๋ชจ๋“ˆ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.
import { NativeModules } from 'react-native';
const { RNIapModule } = NativeModules;
function hasIAP() {
  return !!NativeModules.RNIapModule;
}
  • ์ด๋ ‡๊ฒŒํ•˜๋ฉด IAP ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • IAP๋ฅผ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ๋ถ„๋ฆฌ ๋œ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋ชจ๋‘ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ๋ถˆ๋Ÿ‰> :)

์—ฌ๊ธฐ์—์„œ exp detach ๋ผ๋Š” ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋Š” /ios & /android ํด๋”๋ฅผ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ RN ์•ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜ Expo ์•ฑ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, fastlane์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ธฐ ๋งŒํ•˜๋ฉด ๊ธฐ๋ณธ ํ•ญ๋ชฉ์„ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ„๊ธฐ๋Š” SDK ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ๋“  ์—…๋ฐ์ดํŠธ์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ๋ถ„๋ฆฌํ•˜๊ณ ์ด lib๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์• ์ดˆ์— ์—‘์Šคํฌ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” Expo ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ๋„ค์ดํ‹ฐ๋ธŒ ๋นŒ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–์ถ˜ ๋ฌด๋ฃŒ ๋‹ค์ค‘ ํ”Œ๋žซํผ ํ‘ธ์‹œ ์•Œ๋ฆผ ์„œ๋น„์Šค๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๋„ ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

@KevinColemanInc ์˜ˆ. ์ด์ „์— ์—‘์Šคํฌ ์‚ฌ์šฉ์ž ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์—‘์Šคํฌ๊ฐ€ iap ๋ชจ๋“ˆ์„ ํ†ตํ•ฉํ•˜๊ธฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์—‘์Šคํฌ๊ฐ€ iap ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. Apple์€ ๋จผ์ € ์•ฑ ์Šคํ† ์–ด์—์„œ Expo Client ์•ฑ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆํ–ˆ๋“ฏ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๊ทธ๋ฃจํ„ฐ๊ธฐ๋ฅผํ–ˆ๋‹ค๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์œ„ํ•ด ์—‘์Šคํฌ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ git์—์„œ ์ž์ฒด ๋ธŒ๋žœ์น˜๋กœ ๋‚˜๋ˆ„๊ณ  dev ๋ธŒ๋žœ์น˜ ์—‘์Šคํฌ๋ฅผ ์นœ์ ˆํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ํ•  ๋•Œ๊ฐ€๋˜๋ฉด ๊บผ๋‚ธ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ•œ ๋‹ค์Œ ์•ฑ์„ ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ImArtur ์งˆ๋ฌธ์€ "์—‘์Šคํฌ์—์„œ ์ธ์•ฑ ๊ตฌ๋งค"์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ Expo์˜ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://docs.expo.io/versions/latest/introduction/why-not-expo

๋ฟก ๋นต๋€จ

์•ˆ๋…•ํ•˜์„ธ์š”,์ด ๊ธ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! (๋ถ„๋ฆฌ ํ›„) "๋ถ„๋ฆฌ ๋œ"๋ธŒ๋žœ์น˜์—์„œ exp ๋˜๋Š” xcode๋กœ ๊ณ„์† ๋นŒ๋“œํ•ด์•ผํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

@EvanBacon ๋„ iOS์—์„œ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ƒˆ ๋นŒ๋“œ๋ฅผ ํ‘ธ์‹œ ํ•œ ๋‹ค์Œ ๊ฑฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ด์ „์— ๋กœ์ปฌ์—์„œ iap์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ธ์•ฑ ๊ตฌ๋งค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ CRNA๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋˜๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ RN ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง์ ‘ ์ด๋™ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  ์—‘์Šคํฌ ๊ฐœ๋ฐœ์ž๋Š” ์—‘์Šคํฌ ์ธ์•ฑ ๊ตฌ๋งค๋ฅผ ๊ณง ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

@edoantonioco ์ €๋Š” ์—‘์Šคํฌ์™€ ํ•จ๊ป˜ ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ดํ…œ ๊ตฌ๋งค๋ฅผ์œ„ํ•œ iap ๋ฒ„ํŠผ์ด์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌ๋งค๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  Xcode๋กœ ๋นŒ๋“œ ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—‘์Šคํฌ๋กœ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

์ง€์—ฐ ๋ผ์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ฆฌ ํ•  ๋•Œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์žฅ์น˜์— ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ๋นŒ๋“œ๋ฅผ ์—‘์Šคํฌ ํด๋ผ์ด์–ธํŠธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (๋‹จ์ผ ์•ฑ๋งŒ ์ œ์™ธ). ๋‚˜๋Š” ์—ฌ์ „ํžˆ Expo๋ฅผ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. CRNA๋Š” Expo์—์„œ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ฃผ๋กœ ํ•ด๋‹น ํ™˜๊ฒฝ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. Vanilla React Native๋Š” ๋ถˆํ•„์š”ํ•œ ์„ค์ •์ด ๋งŽ์ด ํ•„์š”ํ•˜๋ฉฐ ๋ชจ๋“ˆ์˜ ๋‚ด๋ถ€ ์ž‘๋™์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด์ œ ์ฃผ์ œ๋ฅผ ๊ฐ€์ ธ ์™”์Šต๋‹ˆ๋‹ค. ์ธ์•ฑ ๊ตฌ๋งค๊ฐ€ Expo์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ "์–ด๋ ค์šด"๊ฒฝ์šฐ. Expo์—์„œ ์•ฑ์„ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ˆ˜์ต์„ ์ฐฝ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆ ๋œ ๋กœ๋“œ๋งต์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ €๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ „๋ฐ˜์ ์ธ ๊ฒฝํ—˜์ด RN๋ณด๋‹ค ํ›จ์”ฌ ์นœ์ˆ™ํ•˜๊ณ  ๋‘ ํ”Œ๋žซํผ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ๋ณต์žกํ•˜๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์— Expo๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. . ๊ทธ๋ ‡๋‹ค๋ฉด PayPal๋กœ ๊ตฌ๋… ๊ณ„ํš์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‹ ์šฉ ์นด๋“œ๋ฅผ ํ†ตํ•ด ์ง€๋ถˆ์„๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์›น๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Expo ์•ฑ ๋‚ด๋ถ€์— Google๊ณผ Apple์ด ๋‚ด์žฅํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? ๊ฐ์‚ฌ.

์•ˆ๋…•ํ•˜์„ธ์š”.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐ ์ง€์ณ์„œ ์—‘์Šคํฌ๋ฅผ ๋คํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ํ…Œ์ŠคํŠธ์™€ ์ผ๋ถ€ ๊ธฐ๋Šฅ (์˜ˆ : ์•Œ๋ฆผ)์„ ์ง€์›ํ•˜๋Š” ๋ฐ ๋งˆ์ฐฐ์„ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ์ ์–ด๋„ ๋‚ด ๊ฐœ๋ฐœ์ž๋Š” "์—‘์Šคํฌ๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค"๋Š” ๋ง์„ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Expo๋Š” ์ตœ๊ทผ 2019 ๋…„ ํ–ฅํ›„ ๊ณ„ํš์— ๋Œ€ํ•ด ์ด๋ฅผ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด native modules ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@EvanBacon ์˜ ์ฝ”๋“œ๋ฅผ ์œ„์˜ ์ž‘์—…์œผ๋กœ ๋งŒ๋“ค๋ ค๊ณ ํ–ˆ์ง€๋งŒ NativeModules๊ฐ€ ๋น„์–ด ์žˆ๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ RNIapModule์ด ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (์ตœ์†Œํ•œ iOS์—์„œ)

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด์ด ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜ ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

FWIW, ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋งํฌ๊ฐ€ ์ž‘๋™ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ....

$ react-native link react-native-iap
rnpm-install info Linking react-native-iap ios dependency 
rnpm-install info Platform 'ios' module react-native-iap has been successfully linked 
rnpm-install info Linking react-native-iap android dependency 
rnpm-install info Platform 'android' module react-native-iap has been successfully linked 

๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ๊นŒ์ง€ ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์ˆ˜๋™์œผ๋กœ ๋งํฌํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋”๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
https://forums.expo.io/t/trouble-linking-with-expokit-unable-to-find-libraries-in-xcode/16710

@EvanBacon ์•ˆ๋…•ํ•˜์„ธ์š” ์„ ์ƒ๋‹˜,
์ž์„ธํžˆ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
RN iap์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜๋Š” ๋ถ„๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ios dir๋กœ ์ด๋™ํ•˜์—ฌ pod install์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ด์ œ ๋ชจ๋“  ๊ฒƒ์„ ์„ค์น˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์— ๋ฌด์—‡์„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
๊ฐ์‚ฌ

@cellis ์ œ๊ฐ€ 1 ์ฃผ์ผ ๋™์•ˆ ๋…ธ๋ ฅํ•˜๊ณ ์žˆ๋Š” ์ธ์•ฑ ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์—ˆ๋Š”์ง€ ์ž์„ธํžˆ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด์ œ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ
pod ์„ค์น˜ ํ›„ expo ๋˜๋Š” xcode๋กœ ๋นŒ๋“œ ํ–ˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ

ํ‰์†Œ์—ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜์„ธ์š”
js ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋งˆ์Šคํ„ฐ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค.
๋งˆ์Šคํ„ฐ๋กœ ์ฝ”๋”ฉ ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด IAP ๋ชจ๋“ˆ ์ฝ”๋“œ๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.
@EvanBacon ์œ„ ์ค„์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ„๋‹จํžˆ:

  • ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ detached
  • exp detach
  • ํ‰์†Œ์—ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜์„ธ์š”
  • js ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด master ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค.
  • master ์ฝ”๋”ฉ ํ•  ๋•Œ IAP ๋ชจ๋“ˆ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.
import { NativeModules } from 'react-native';
const { RNIapModule } = NativeModules;
function hasIAP() {
  return !!NativeModules.RNIapModule;
}
  • ์ด๋ ‡๊ฒŒํ•˜๋ฉด IAP ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • IAP๋ฅผ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ๋ถ„๋ฆฌ ๋œ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋ชจ๋‘ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ๋ถˆ๋Ÿ‰> :)

์—ฌ๊ธฐ์—์„œ exp detach ๋ผ๋Š” ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋Š” /ios & /android ํด๋”๋ฅผ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ RN ์•ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜ Expo ์•ฑ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, fastlane์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ธฐ ๋งŒํ•˜๋ฉด ๊ธฐ๋ณธ ํ•ญ๋ชฉ์„ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ„๊ธฐ๋Š” SDK ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ๋“  ์—…๋ฐ์ดํŠธ์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ๋ถ„๋ฆฌํ•˜๊ณ ์ด lib๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…• ์—๋ฐ˜,
์ œ์•ˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์กฐ์–ธ์„ ๋”ฐ๋ž๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค (react-native-iap์„ ์ˆ˜๋™์œผ๋กœ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ hasIAP ํ•จ์ˆ˜๋Š” RNIap.initConnection ();์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

async componentDidMount() {
    try {
      const result = await RNIap.initConnection();
      console.log("hasIAP " + hasIAP())  // returns false
      console.log('result', result);   // returns true
    } catch (err) {
      console.warn(err.code, err.message);
    }
}

๋ฌด์—‡์ด ๋ฌธ์ œ์ธ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? (๋˜๋Š” ์ด๊ฒƒ์„ ์ฝ๋Š” ์‚ฌ๋žŒ)

๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด https://docs.expo.io/versions/v32.0.0/sdk/payments/ ๊ธฐ๊ธฐ์—์„œ ๊ฒฐ์ œ๋ฅผ ์„ค์ • ํ–ˆ์Šต๋‹ˆ๊นŒ? (์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค)

์ด ๊ฒŒ์‹œ๋ฌผ์˜ ์ด์ „ ์‚ฌ์šฉ์ž์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋ฒˆ 1 ๋ถ„๊ธฐ์— ์•ฑ์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ React Native ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด Expo์˜ ์ตœ์„ ์˜ ์˜๋„์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ CLI๋กœ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋ฒ ํƒ€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ณง ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. ์ตœ๊ทผ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ™œ๋™์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์—ฌ์ „ํžˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋Š” ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์ข…๊ฒฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ "ํ† ๋ก  ์šฉ"๋˜๋Š” "์ข‹์€ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ"๋กœ ํ‘œ์‹œ ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ์—ด์–ด ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์—ด์–ด ๋‘์‹œ๊ณ  Expo SDK versiรณn 33.0๋ถ€ํ„ฐ ์ด๊ฒƒ์„ ํ˜„์‹ค๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋„๋ก ๋„์™€์ฃผ์„ธ์š”.

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

https://docs.expo.io/versions/latest/sdk/in-app-purchases/

์—…๋ฐ์ดํŠธ : ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“ˆ์€ ํ˜„์žฌ ๋ฒ ์–ด ์›Œํฌ ํ”Œ๋กœ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@kkarkos Expo์˜ ์ž์ฒด ์ธ์•ฑ ๊ตฌ๋งค ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด Expo ์•ฑ์„ ๊บผ๋‚ด์•ผํ•˜๋ฏ€๋กœ (๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์—) ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ @EvanBacon ์ด ์„ค๋ช…ํ•˜๋Š” ์†์ž„์ˆ˜์— ๋Œ€ํ•ด ๋” ์ฒ ์ €ํ•œ ๊ฐ€์ด๋“œ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค. ๋ฐ๋ชจ ์•ฑ์ผ๊นŒ์š”?

@TheInternet "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ"ํด๋”๊ฐ€ ๋ˆ„๋ฝ ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. iOS์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์…จ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”.
ํฅ๋ฏธ ๋กญ๊ตฐ์š”. ์—‘์Šคํฌ์—์„œ ์•ฑ์„ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ˆ˜์ต์„ ์ฐฝ์ถœ ํ•  ์ˆ˜์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๋‚˜์š”?

WebView์—์„œ ์ „์ž ๊ฒฐ์ œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•ฉ๋ฒ•์ ์ž…๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ํƒ€์‚ฌ ์†”๋ฃจ์…˜์„ ์›น ์•ฑ (์˜ˆ : ์ŠคํŠธ๋ผ์ดํ”„ ๋˜๋Š” PayPal)์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ AppStore ๋˜๋Š” PlayStore ๋‚ด๋ถ€์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Expo๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์ดํ›„๋กœ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ธฐ๋‹ค๋ ค์˜จ API๋ฅผ ํ†ตํ•ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ๋•Œ๊นŒ์ง€ ์•ฑ์ด ์ซ“๊ฒจ๋‚˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์ƒํ’ˆ ๋ฐ ์„œ๋น„์Šค๋ฅผ ๊ตฌ๋งคํ•˜๋Š” ํ•œ (์˜ˆ : amazon์—์„œ ์ œํ’ˆ์„ ๊ตฌ๋งคํ•˜๊ฑฐ๋‚˜ Uber ์•ฑ์—์„œ ๊ฒฐ์ œ ํ•  ๋•Œ) ์•ฑ์—์„œ Stripe ๋˜๋Š” Paypal์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ฑ ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ๋Šฅ์„ ์ž ๊ธˆ ํ•ด์ œํ•˜๋Š” ๋ฐ Stripe๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (์˜ˆ : ๊ฒŒ์ž„ ํ† ํฐ ๋˜๋Š” ํ”„๋ฆฌ๋ฏธ์—„ ๊ธฐ๋Šฅ ํŒ๋งค)

์˜๊ฒฌ์„ ๋ณด๋‚ด ์ฃผ์‹  KevinColemanInc์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์˜ํ™” ๋Œ€์—ฌ, ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€, ์˜จ๋ผ์ธ ์ฝ”์Šค์— ๋Œ€ํ•œ ๋ฉค๋ฒ„์‹ญ ํŒ๋งค ๋˜๋Š” ๋ฐ˜๋ณต ๊ฒฐ์ œ ์—ฌ๋ถ€๋ฅผ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ? ์•ฑ ๋‚ด์—์„œ Stripe ๋˜๋Š” PayPal์„ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ๊ฒฐ์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค-> (PlayStore ๋˜๋Š” AppStore) ? ์˜๊ฒฌ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š”.

์•ฑ ๋‚ด์˜ ๊ธฐ๋Šฅ์„ ์ž ๊ธˆ ํ•ด์ œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ (์˜ˆ : ๊ตฌ๋…, ๊ฒŒ์ž„ ๋‚ด ํ†ตํ™”, ๊ฒŒ์ž„ ๋ ˆ๋ฒจ, ํ”„๋ฆฌ๋ฏธ์—„ ์ฝ˜ํ…์ธ  ์•ก์„ธ์Šค ๋˜๋Š” ์ •์‹ ๋ฒ„์ „ ์ž ๊ธˆ ํ•ด์ œ)

๋‹ค์Œ์€ Apple์˜ ์ง€์นจ์ž…๋‹ˆ๋‹ค.
https://developer.apple.com/app-store/review/guidelines/#in -app-purchase

์„ค๋ช…ํ•˜์‹  ๋‚ด์šฉ์˜ ๋Œ€๋ถ€๋ถ„์ด "ํ”„๋ฆฌ๋ฏธ์—„ ์ฝ˜ํ…์ธ "์— ํ•ด๋‹น ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Netflix๋Š” ์‚ฌ๊ณผ ์„ธ ๋ฅผ ์ง€๋ถˆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Dropbox๋Š” ๋ชจ๋ฐ”์ผ์—์„œ ๊ฐ€์ž…ํ•˜๋ฉด ์‚ฌ๊ณผ ์„ธ๋„ ์ง€๋ถˆํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Udemy์˜ ์•ฑ์„ ํ™•์ธํ•˜์—ฌ IAP๋„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. ์ตœ๊ทผ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ™œ๋™์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์—ฌ์ „ํžˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋Š” ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์ข…๊ฒฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ "ํ† ๋ก  ์šฉ"๋˜๋Š” "์ข‹์€ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ"๋กœ ํ‘œ์‹œ ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ์—ด์–ด ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ:

  • ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ detached
  • exp detach
  • ํ‰์†Œ์—ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜์„ธ์š”
  • js ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด master ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค.
  • master ์ฝ”๋”ฉ ํ•  ๋•Œ IAP ๋ชจ๋“ˆ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.
import { NativeModules } from 'react-native';
const { RNIapModule } = NativeModules;
function hasIAP() {
  return !!NativeModules.RNIapModule;
}
  • ์ด๋ ‡๊ฒŒํ•˜๋ฉด IAP ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • IAP๋ฅผ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ๋ถ„๋ฆฌ ๋œ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋ชจ๋‘ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ๋ถˆ๋Ÿ‰> :)

์—ฌ๊ธฐ์—์„œ exp detach ๋ผ๋Š” ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋Š” /ios & /android ํด๋”๋ฅผ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ RN ์•ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜ Expo ์•ฑ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, fastlane์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ธฐ ๋งŒํ•˜๋ฉด ๊ธฐ๋ณธ ํ•ญ๋ชฉ์„ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ„๊ธฐ๋Š” SDK ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ๋“  ์—…๋ฐ์ดํŠธ์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ๋ถ„๋ฆฌํ•˜๊ณ ์ด lib๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ์กฐ๋ฐ€ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ ์ง€์ ์— IAP ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ถ”๊ฐ€ ํ•œ ๋‹ค์Œ (์—‘์Šคํฌ ์ง€์ ์„ ์œ„ํ•ด 'ํฌ์žฅ'ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ) ์ถ”๊ฐ€ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ ์ง€์ ์—์„œ ๋‹ค์‹œ ๊บผ๋ƒ…๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ์— ์—‘์Šคํฌ ์ฝ”๋“œ ๋˜๋Š” ๋‹น์‹ ์€ ์–ด๋Š ์‹œ์ ์—์„œ ๋ถ„๊ธฐ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ ??! ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ๊ด€๋ฆฌ ์—‘์Šคํฌ ์•ฑ์— IAP๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ํฐ ์•ฑ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์–ด๋–ป๊ฒŒ ๋“ ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋ฉฐ ๋ถ„๊ธฐ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ ์˜ต์…˜์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›Œํฌ ํ”Œ๋กœ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค! ๋‚˜๋Š” ๋˜ํ•œ ๋‚ด๊ฐ€ ์—‘์Šคํฌ๋ฅผ ์‚ฌ๋ž‘ํ•œ๋‹ค๊ณ  ๋งํ•ด์•ผํ•œ๋‹ค! ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ˜์‘์„ ํ•  ์ˆ˜์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ๊ณ  ๊ทธ๊ฒƒ ์—†์ด๋Š” ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. ์ตœ๊ทผ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ™œ๋™์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์—ฌ์ „ํžˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋Š” ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์ข…๊ฒฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ "ํ† ๋ก  ์šฉ"๋˜๋Š” "์ข‹์€ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ"๋กœ ํ‘œ์‹œ ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ์—ด์–ด ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์žฅ๊ธฐ๊ฐ„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค์— ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์‹  ์ •๋ณด๋กœ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

๊ฐ„๋‹จํžˆ:

  • ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ detached
  • exp detach
  • ํ‰์†Œ์—ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜์„ธ์š”
  • js ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด master ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค.
  • master ์ฝ”๋”ฉ ํ•  ๋•Œ IAP ๋ชจ๋“ˆ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.
import { NativeModules } from 'react-native';
const { RNIapModule } = NativeModules;
function hasIAP() {
  return !!NativeModules.RNIapModule;
}
  • ์ด๋ ‡๊ฒŒํ•˜๋ฉด IAP ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • IAP๋ฅผ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ๋ถ„๋ฆฌ ๋œ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋ชจ๋‘ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ๋ถˆ๋Ÿ‰> :)

์—ฌ๊ธฐ์—์„œ exp detach ๋ผ๋Š” ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋Š” /ios & /android ํด๋”๋ฅผ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ RN ์•ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜ Expo ์•ฑ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, fastlane์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ธฐ ๋งŒํ•˜๋ฉด ๊ธฐ๋ณธ ํ•ญ๋ชฉ์„ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ„๊ธฐ๋Š” SDK ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ๋“  ์—…๋ฐ์ดํŠธ์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ๋ถ„๋ฆฌํ•˜๊ณ ์ด lib๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ์กฐ๋ฐ€ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ ์ง€์ ์— IAP ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ถ”๊ฐ€ ํ•œ ๋‹ค์Œ (์—‘์Šคํฌ ์ง€์ ์„ ์œ„ํ•ด 'ํฌ์žฅ'ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ) ์ถ”๊ฐ€ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ ์ง€์ ์—์„œ ๋‹ค์‹œ ๊บผ๋ƒ…๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ์— ์—‘์Šคํฌ ์ฝ”๋“œ ๋˜๋Š” ๋‹น์‹ ์€ ์–ด๋Š ์‹œ์ ์—์„œ ๋ถ„๊ธฐ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ ??! ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ๊ด€๋ฆฌ ์—‘์Šคํฌ ์•ฑ์— IAP๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ํฐ ์•ฑ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์–ด๋–ป๊ฒŒ ๋“ ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋ฉฐ ๋ถ„๊ธฐ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ ์˜ต์…˜์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›Œํฌ ํ”Œ๋กœ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค! ๋‚˜๋Š” ๋˜ํ•œ ๋‚ด๊ฐ€ ์—‘์Šคํฌ๋ฅผ ์‚ฌ๋ž‘ํ•œ๋‹ค๊ณ  ๋งํ•ด์•ผํ•œ๋‹ค! ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ˜์‘์„ ํ•  ์ˆ˜์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ๊ณ  ๊ทธ๊ฒƒ ์—†์ด๋Š” ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”! ๋‹ต์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ ํ–ˆ์Šต๋‹ˆ๊นŒ?

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