React-native-onesignal: ์ดˆ๊ธฐ ์•Œ๋ฆผ์€ ์–ด๋–ป๊ฒŒ ๋ฐ›๋‚˜์š”?

์— ๋งŒ๋“  2017๋…„ 10์›” 02์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: OneSignal/react-native-onesignal

React Native PushNotificationIOS ๋ชจ๋“ˆ์—๋Š” ์•ฑ์„ ์—ด๊ธฐ ์œ„ํ•ด ํƒญํ•œ ์•Œ๋ฆผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” getInitialNotification() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์žˆ๋Š” ๊ฒฝ์šฐ). ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ฑ์ด ๋‹ซํžŒ ์ƒํƒœ์—์„œ ๋‚ด ์žฅ์น˜์— ํ…Œ์ŠคํŠธ ์•Œ๋ฆผ์„ ๋ณด๋ƒˆ์„ ๋•Œ ์ฝ˜์†”์ด ์—ด๋ ธ์„ ๋•Œ Device info: ๋กœ๊ทธ๋ฅผ ์ˆ˜์‹ ํ–ˆ์ง€๋งŒ ์•Œ๋ฆผ ์ˆ˜์‹ ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ๋กœ๊ทธ๋Š” ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ 3:
์–ด๋–ค ์ด์œ ๋กœ ์ดˆ๊ธฐ ์•Œ๋ฆผ์— ๋Œ€ํ•œ onOpened ์ด๋ฒคํŠธ๋ฅผ ๋” ์ด์ƒ ๋ณผ ์ˆ˜ ์—†์ง€๋งŒ ์ฝ”๋“œ์—์„œ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์€ ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ 2:
๋ฆฌ์Šค๋„ˆ ์ฃผ์œ„๋ฅผ ์ด๋™ํ•˜์—ฌ onOpened ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ˆ˜๋™ ๋ฆฌ์Šค๋„ˆ๋ผ๋Š” ๊ฒƒ์€ ๋‚ด ์•ฑ์ด ์•Œ๋ฆผ๊ณผ ํ•จ๊ป˜ ์—ด๋ ธ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ ๊ทน์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. , ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์ž„์˜์˜ ์‹œ๊ฐ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๊นŒ? ํ‘ธ์‹œ ์•Œ๋ฆผ์œผ๋กœ ์•ฑ์ด ์—ด๋ ธ๋Š”์ง€ ๋Šฅ๋™์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‚˜์š”?

ํŽธ์ง‘ํ•˜๋‹ค:
OneSignal.configure() ๋ฐ onNotificationOpened ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐํ•˜๋Š” ๊ธฐ์‚ฌ ๋ฅผ ์ฐพ์•˜์ง€๋งŒ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด OneSignal.configure() ๊ฐ€ ๋” ์ด์ƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Documentation

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

์ €์—๊ฒŒ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ๋‹ค๋ฅธ ๋งŽ์€ ๋ถ„๋“ค๋„ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ์ผ๋ถ€ ๊ด€๋ จ/์ค‘๋ณต ๋ฌธ์ œ์—๋Š” https://github.com/geektimecoil/react-native-onesignal/issues/206 , https://github.com/geektimecoil/react-native-onesignal/issues/195 , https://github.com/geektimecoil/react-native-onesignal/issues/191 , https://github.com/geektimecoil/react-native-onesignal/issues/336 , https://github.com/geektimecoil/ react-native-onesignal/issues/334 , https://github.com/geektimecoil/react-native-onesignal/issues/264 , https://github.com/geektimecoil/react-native-onesignal/issues/279.

์ด ๋ฌธ์ œ๋Š” ๋ชจ๋‘ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ˆŒ๋Ÿฌ ์•ฑ์„ ์—ด ๋•Œ opened ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ณ  ์•ฑ์ด ์‹คํ–‰ ๋˜์ง€ ์•Š๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ์™€ ๋‚ด๊ฐ€ ์ˆ˜ํ–‰ํ•œ ํ…Œ์ŠคํŠธ์—์„œ ์ฝ์€ ๋‚ด์šฉ์— ๋”ฐ๋ฅด๋ฉด ์ด ๋ฌธ์ œ์˜ ์›์ธ์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก์ด ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ง€์—ฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์˜ˆ: OneSignal.addEventListener('opened', this.onOpened); ๋Š” ์•ฑ ์ž์ฒด๊ฐ€ ๋กœ๋“œ๋จ). ์ด๊ฒƒ์€ React ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์— ์ด ์ฝ”๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: constructor ๋˜๋Š” componentWillMount ๋˜๋Š” componentDidMount ํ•จ์ˆ˜) ๋˜๋Š” ๊ตฌ์„ฑ/์žฌ์ˆ˜ํ™” ํ›„๊นŒ์ง€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜๊ธฐ ์ „์— react-native-onesignal์— ์˜ํ•ด ์ด๋ฒคํŠธ ์ž์ฒด(์•Œ๋ฆผ์ด ์—ด๋ ธ์Œ)๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด ์‹œ์ ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋†“์ณค๊ณ  ๋˜์—ˆ๋Š”์ง€ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ด ๋™์ผํ•œ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(์˜ˆ: ids ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ)์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๋ฐœ์ƒํ•˜๋„๋ก ์ด ์ฝ”๋“œ๋ฅผ ์ด๋™ํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก ์ฝ”๋“œ๋ฅผ index.ios.js ํŒŒ์ผ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ index.ios.js ํŒŒ์ผ์ด ๋‹จ์ˆœํžˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ App.js ํŒŒ์ผ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. App ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค( AppRegistry.registerComponent ๋ฅผ ํ†ตํ•ด).

์ด ์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด ์ด์ œ ์•Œ๋ฆผ์ด ์—ด๋ฆฐ ์ด๋ฒคํŠธ๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•ฑ ์„ค์ • ๋ฐฉ๋ฒ•(์˜ˆ: ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Redux, ๋˜๋Š” redux-persist๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์—ฌ๋ถ€ ๋“ฑ).

๋‚ด ํ˜„์žฌ ์†”๋ฃจ์…˜์€ ๋‚ด App.js ํŒŒ์ผ ์ž์ฒด์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์ •์˜๋œ ๋ณ€์ˆ˜์— ์•Œ๋ฆผ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‚ด App ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์—๋„). ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ดˆ๊ธฐํ™”๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ๋‚ด Redux ์Šคํ† ์–ด(redux-persist์— ์˜ํ•œ ๋‚ด ์Šคํ† ์–ด์˜ ์žฌ์ˆ˜ํ™” ๋Œ€๊ธฐ ํฌํ•จ), ํŽ˜์ด๋กœ๋“œ๋กœ ์•Œ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๋ฐœ์†กํ•˜๊ณ (์•Œ๋ฆผ์ด ์—ด๋ฆฐ ๊ฒฝ์šฐ) ์ตœ์ƒ์œ„ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด App ๊ตฌ์„ฑ ์š”์†Œ ์ž์ฒด์˜ ๋ฆฌ์Šค๋„ˆ(์ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ์•Œ๋ฆผ, ์žฅ์น˜ ID ๋“ฑ์„ ์•ก์…˜ ํŽ˜์ด๋กœ๋“œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ Redux ์ €์žฅ์†Œ์— ์•ก์…˜์„ ์ „๋‹ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค).

์ด ์†”๋ฃจ์…˜์€ ๋ถ„๋ช…ํžˆ ๋งค์šฐ ํ•ดํ‚คํ•˜๊ณ  ์ด๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ผ๋ถ€ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ react-native-onesignal์—์„œ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์ด ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ ์ด๊ฒƒ์€ ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก react-native-onesignal์ด ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด(์˜ˆ: opened ์ด๋ฒคํŠธ) ์ด๋ฒคํŠธ๊ฐ€ ๋Œ€๊ธฐ์—ด์— ๋“ค์–ด๊ฐ€๊ณ  react-native-onesignal์ด ํ˜„์žฌ ๋“ฑ๋ก๋œ ํ•ด๋‹น ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—†๋Š” ๊ฒฝ์šฐ ๋Œ€๊ธฐ์—ด์— ์ด๋ฒคํŠธ๋ฅผ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜์ž๋งˆ์ž ์ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ˆ˜์‹ ํ•  ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ํ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ฑ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์–ธ์ œ๋“ ์ง€ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Redux ์Šคํ† ์–ด๊ฐ€ ๊ตฌ์„ฑ๋˜๊ณ  ์žฌ์ˆ˜ํ™”๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„, ์•ฑ ์ž์ฒด๊ฐ€ ๋กœ๋“œ๋œ ํ›„ 1-2์ดˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ). ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ(์˜ˆ: ์•Œ๋ฆผ์ด ์—ด๋ฆฐ ์ด๋ฒคํŠธ)๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํƒญํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ์ด ์—ด๋ ธ์Œ์„ ์ ์–ด๋„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์€ ์ œ์•ˆํ•œ ๋Œ€๋กœ getInitialNotification() from PushNotificationIOS ์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์ œ๋“ ์ง€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์—ด๊ธฐ ์œ„ํ•ด ํƒญํ•œ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ์ด๊ฒƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ null ). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด react-native-onesignal์—์„œ ๊ตฌํ˜„๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(์˜ˆ: ids ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ)์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๋‹น ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์˜ ํ•ต์‹ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์•ฑ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋†“์น˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์ •๋ง๋กœ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์ €์—๊ฒŒ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ๋‹ค๋ฅธ ๋งŽ์€ ๋ถ„๋“ค๋„ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ์ผ๋ถ€ ๊ด€๋ จ/์ค‘๋ณต ๋ฌธ์ œ์—๋Š” https://github.com/geektimecoil/react-native-onesignal/issues/206 , https://github.com/geektimecoil/react-native-onesignal/issues/195 , https://github.com/geektimecoil/react-native-onesignal/issues/191 , https://github.com/geektimecoil/react-native-onesignal/issues/336 , https://github.com/geektimecoil/ react-native-onesignal/issues/334 , https://github.com/geektimecoil/react-native-onesignal/issues/264 , https://github.com/geektimecoil/react-native-onesignal/issues/279.

์ด ๋ฌธ์ œ๋Š” ๋ชจ๋‘ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ˆŒ๋Ÿฌ ์•ฑ์„ ์—ด ๋•Œ opened ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ณ  ์•ฑ์ด ์‹คํ–‰ ๋˜์ง€ ์•Š๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ์™€ ๋‚ด๊ฐ€ ์ˆ˜ํ–‰ํ•œ ํ…Œ์ŠคํŠธ์—์„œ ์ฝ์€ ๋‚ด์šฉ์— ๋”ฐ๋ฅด๋ฉด ์ด ๋ฌธ์ œ์˜ ์›์ธ์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก์ด ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ง€์—ฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์˜ˆ: OneSignal.addEventListener('opened', this.onOpened); ๋Š” ์•ฑ ์ž์ฒด๊ฐ€ ๋กœ๋“œ๋จ). ์ด๊ฒƒ์€ React ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์— ์ด ์ฝ”๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: constructor ๋˜๋Š” componentWillMount ๋˜๋Š” componentDidMount ํ•จ์ˆ˜) ๋˜๋Š” ๊ตฌ์„ฑ/์žฌ์ˆ˜ํ™” ํ›„๊นŒ์ง€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜๊ธฐ ์ „์— react-native-onesignal์— ์˜ํ•ด ์ด๋ฒคํŠธ ์ž์ฒด(์•Œ๋ฆผ์ด ์—ด๋ ธ์Œ)๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด ์‹œ์ ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋†“์ณค๊ณ  ๋˜์—ˆ๋Š”์ง€ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ด ๋™์ผํ•œ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(์˜ˆ: ids ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ)์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๋ฐœ์ƒํ•˜๋„๋ก ์ด ์ฝ”๋“œ๋ฅผ ์ด๋™ํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก ์ฝ”๋“œ๋ฅผ index.ios.js ํŒŒ์ผ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ index.ios.js ํŒŒ์ผ์ด ๋‹จ์ˆœํžˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ App.js ํŒŒ์ผ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. App ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค( AppRegistry.registerComponent ๋ฅผ ํ†ตํ•ด).

์ด ์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด ์ด์ œ ์•Œ๋ฆผ์ด ์—ด๋ฆฐ ์ด๋ฒคํŠธ๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•ฑ ์„ค์ • ๋ฐฉ๋ฒ•(์˜ˆ: ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Redux, ๋˜๋Š” redux-persist๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์—ฌ๋ถ€ ๋“ฑ).

๋‚ด ํ˜„์žฌ ์†”๋ฃจ์…˜์€ ๋‚ด App.js ํŒŒ์ผ ์ž์ฒด์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์ •์˜๋œ ๋ณ€์ˆ˜์— ์•Œ๋ฆผ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‚ด App ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์—๋„). ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ดˆ๊ธฐํ™”๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ๋‚ด Redux ์Šคํ† ์–ด(redux-persist์— ์˜ํ•œ ๋‚ด ์Šคํ† ์–ด์˜ ์žฌ์ˆ˜ํ™” ๋Œ€๊ธฐ ํฌํ•จ), ํŽ˜์ด๋กœ๋“œ๋กœ ์•Œ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๋ฐœ์†กํ•˜๊ณ (์•Œ๋ฆผ์ด ์—ด๋ฆฐ ๊ฒฝ์šฐ) ์ตœ์ƒ์œ„ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด App ๊ตฌ์„ฑ ์š”์†Œ ์ž์ฒด์˜ ๋ฆฌ์Šค๋„ˆ(์ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ์•Œ๋ฆผ, ์žฅ์น˜ ID ๋“ฑ์„ ์•ก์…˜ ํŽ˜์ด๋กœ๋“œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ Redux ์ €์žฅ์†Œ์— ์•ก์…˜์„ ์ „๋‹ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค).

์ด ์†”๋ฃจ์…˜์€ ๋ถ„๋ช…ํžˆ ๋งค์šฐ ํ•ดํ‚คํ•˜๊ณ  ์ด๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ผ๋ถ€ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ react-native-onesignal์—์„œ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์ด ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ ์ด๊ฒƒ์€ ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก react-native-onesignal์ด ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด(์˜ˆ: opened ์ด๋ฒคํŠธ) ์ด๋ฒคํŠธ๊ฐ€ ๋Œ€๊ธฐ์—ด์— ๋“ค์–ด๊ฐ€๊ณ  react-native-onesignal์ด ํ˜„์žฌ ๋“ฑ๋ก๋œ ํ•ด๋‹น ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—†๋Š” ๊ฒฝ์šฐ ๋Œ€๊ธฐ์—ด์— ์ด๋ฒคํŠธ๋ฅผ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜์ž๋งˆ์ž ์ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ˆ˜์‹ ํ•  ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ํ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ฑ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์–ธ์ œ๋“ ์ง€ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Redux ์Šคํ† ์–ด๊ฐ€ ๊ตฌ์„ฑ๋˜๊ณ  ์žฌ์ˆ˜ํ™”๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„, ์•ฑ ์ž์ฒด๊ฐ€ ๋กœ๋“œ๋œ ํ›„ 1-2์ดˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ). ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ(์˜ˆ: ์•Œ๋ฆผ์ด ์—ด๋ฆฐ ์ด๋ฒคํŠธ)๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํƒญํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ์ด ์—ด๋ ธ์Œ์„ ์ ์–ด๋„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์€ ์ œ์•ˆํ•œ ๋Œ€๋กœ getInitialNotification() from PushNotificationIOS ์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์ œ๋“ ์ง€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์—ด๊ธฐ ์œ„ํ•ด ํƒญํ•œ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ์ด๊ฒƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ null ). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด react-native-onesignal์—์„œ ๊ตฌํ˜„๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(์˜ˆ: ids ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ)์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๋‹น ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋“ฑ๋ก๋˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์˜ ํ•ต์‹ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์•ฑ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋†“์น˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์ •๋ง๋กœ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@jordanmkoncz๋‹˜ , ์•ˆ๋…•ํ•˜์„ธ์š”, ์ž‘์—…์„ ๋ณด๋‚ธ ํŒŒ์ผ์˜ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๊ฐ™์€ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์„ค์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (redux-persist ๋“ฑ).

@ccoeder ํ™•์‹คํžˆ, ์—ฌ๊ธฐ ๋‚ด ํ˜„์žฌ App.js ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

import React, { Component } from 'react';
import { Provider } from 'react-redux';
import OneSignal from 'react-native-onesignal';
import isNil from 'lodash/isNil';
import configureStore from '../redux/configureStore';
import {
  pushNotificationIdsReceived,
  pushNotificationOpened,
  pushNotificationReceived,
  pushNotificationRegistered,
} from '../redux/actionCreators';
import AppNavigator from './AppNavigator';
import Blank from './Blank';

let openedPushNotificationResult = null;
let receivedPushNotification = null;
let receivedNotificationUserInfo = null;
let receivedIds = null;

const onOpened = openResult => {
  openedPushNotificationResult = openResult;
};

const onReceived = notification => {
  receivedPushNotification = notification;
};

const onRegistered = notificationUserInfo => {
  receivedNotificationUserInfo = notificationUserInfo;
};

const onIds = ids => {
  receivedIds = ids;
};

OneSignal.addEventListener('opened', onOpened);
OneSignal.addEventListener('received', onReceived);
OneSignal.addEventListener('registered', onRegistered);
OneSignal.addEventListener('ids', onIds);

class App extends Component {
  constructor() {
    super();

    this.state = {
      isStoreInitialised: false,
    };

    this.store = null;

    this.onOpened = this.onOpened.bind(this);
    this.onReceived = this.onReceived.bind(this);
    this.onRegistered = this.onRegistered.bind(this);
    this.onIds = this.onIds.bind(this);
  }

  componentDidMount() {
    this.store = configureStore(store => {
      if (!isNil(openedPushNotificationResult)) {
        store.dispatch(pushNotificationOpened(openedPushNotificationResult));
      }

      if (!isNil(receivedPushNotification)) {
        store.dispatch(pushNotificationReceived(receivedPushNotification));
      }

      if (!isNil(receivedNotificationUserInfo)) {
        store.dispatch(pushNotificationRegistered(receivedNotificationUserInfo));
      }

      if (!isNil(receivedIds)) {
        store.dispatch(pushNotificationIdsReceived(receivedIds));
      }

      OneSignal.addEventListener('opened', this.onOpened);
      OneSignal.addEventListener('received', this.onReceived);
      OneSignal.addEventListener('registered', this.onRegistered);
      OneSignal.addEventListener('ids', this.onIds);

      OneSignal.removeEventListener('opened', onOpened);
      OneSignal.removeEventListener('received', onReceived);
      OneSignal.removeEventListener('registered', onRegistered);
      OneSignal.removeEventListener('ids', onIds);

      this.setState({ isStoreInitialised: true });
    });
  }

  componentWillUnmount() {
    OneSignal.removeEventListener('opened', this.onOpened);
    OneSignal.removeEventListener('received', this.onReceived);
    OneSignal.removeEventListener('registered', this.onRegistered);
    OneSignal.removeEventListener('ids', this.onIds);
    OneSignal.removeEventListener('opened', onOpened);
    OneSignal.removeEventListener('received', onReceived);
    OneSignal.removeEventListener('registered', onRegistered);
    OneSignal.removeEventListener('ids', onIds);
  }

  onOpened(openResult) {
    this.store.dispatch(pushNotificationOpened(openResult));
  }

  onReceived(notification) {
    this.store.dispatch(pushNotificationReceived(notification));
  }

  onRegistered(notificationUserInfo) {
    this.store.dispatch(pushNotificationRegistered(notificationUserInfo));
  }

  onIds(ids) {
    this.store.dispatch(pushNotificationIdsReceived(ids));
  }

  render() {
    if (!this.state.isStoreInitialised) {
      return <Blank />;
    }

    return (
      <Provider store={this.store}>
        <AppNavigator />
      </Provider>
    );
  }
}

export default App;

์ฐธ๊ณ : configureStore ๋Š” Redux ์ €์žฅ์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ (์˜ˆ: createStore() ํ˜ธ์ถœ) redux-persist๋ฅผ ์„ค์ •ํ•˜๋Š”(์˜ˆ: persistStore() ํ˜ธ์ถœ) ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. configureStore ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  persistStore ํ•จ์ˆ˜์˜ onComplete ์ฝœ๋ฐฑ์—์„œ configureStore ์— ์ „๋‹ฌ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ €์žฅ์†Œ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ ์ด ์ฝœ๋ฐฑ์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ configureStore ๋Š” ์ €์žฅ์†Œ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

@jordanmkoncz ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ €์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ๋ฌด์Œ ์•Œ๋ฆผ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋œ ์ƒํƒœ์—์„œ ์•Œ๋ฆผ์ด ์˜ค๋ฉด ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ฝ”๋“œ๊ฐ€ ์ €์—๊ฒŒ ๋งž์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฑฑ์ •๋งˆ์„ธ์š” @ccoeder. ์˜ˆ, ์•ฑ์ด ๋‹ซํžŒ ์ƒํƒœ ์—์„œ ์•Œ๋ฆผ์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ์กฐ์น˜๋ฅผ ์ทจํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํŠนํžˆ ์•ฑ์ด ์‹œ์ž‘๋  ๋•Œ(์ด์ „์— ์ „ํ˜€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์„ ๋•Œ) ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์—ด๊ธฐ ์œ„ํ•ด ์•Œ๋ฆผ์„ ํƒญํ–ˆ์Œ์„ ์•ฑ์—์„œ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

react-native-fcm์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”. getInitialNotification์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@jordanmkoncz ๊ฒŒ์‹œํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ์ˆ˜์‹ ํ•˜๋ฉด ํ™”๋ฉด์ด ์›ํ•˜๋Š” ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์•Œ๋ฆผ์„ ์—ด๋ฉด ํƒ์ƒ‰ ํ‘ธ์‹œ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜ˆ์‹œ:
componentWillMount() {
OneSignal.addEventListener('์ˆ˜์‹ ', this._onReceived);
OneSignal.addEventListener('์—ด๋ฆผ', this._onOpened);
}
componentWillUnmount() {
OneSignal.removeEventListener('์ˆ˜์‹ ', this.__onReceived);
OneSignal.removeEventListener('์—ด๋ฆผ', this._onOpened);
}
_onReceived(์•Œ๋ฆผ) {
console.log('์•Œ๋ฆผ ์ˆ˜์‹ : ', ์•Œ๋ฆผ); // ์ž˜ ์ž‘๋™
this.props.navigator.push({ pushSreen, passProps : { ๋งค๊ฐœ๋ณ€์ˆ˜ } }); // ์ž˜ ์ž‘๋™
}
_onOpened(์˜คํ”ˆ ๊ฒฐ๊ณผ) {
console.log('์•Œ๋ฆผ ๋ณธ๋ฌธ: ', openResult.notification.payload.body); // ์ž˜ ์ž‘๋™
this.props.navigator.push({ pushSreen, passProps : { ๋งค๊ฐœ๋ณ€์ˆ˜ } }); // ์ž‘๋™ ์•ˆํ•จ
}

์ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”? ๋‹น์‹ ์ด ๋‚˜๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์— ํšŒ์‹  ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”

ํ .. Redux Provider ์˜ ์ž์‹์œผ๋กœ PushNotificationHelper ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ ์š”์†Œ๋Š” store ๊ฐ€ ์žฌ์ˆ˜ํ™”๋œ ํ›„์—๋งŒ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

componentWillMount() {
    AppState.addEventListener("change", this.handleAppStateChange);
    OneSignal.configure({
      onNotificationOpened: this.handleOpenNotification
    });
    OneSignal.addEventListener("received", this.onReceived);
    OneSignal.addEventListener("opened", this.onOpened);
    OneSignal.addEventListener("registered", this.onRegistered);
    OneSignal.addEventListener("ids", this.onIds);

    if (!IOS) {
      OneSignal.inFocusDisplaying(0);
    }
  }

  componentWillUnmount() {
    AppState.removeEventListener("change", this.handleAppStateChange);
    OneSignal.removeEventListener("received", this.onReceived);
    OneSignal.removeEventListener("opened", this.onOpened);
    OneSignal.removeEventListener("registered", this.onRegistered);
    OneSignal.removeEventListener("ids", this.onIds);
  }

handleOpenNotification = (message, data, isActive) => {
    console.log("Notification", message, data, isActive);

    if (isActive) {
      // touchable banner displaying info from push notification
    } else {
      // act on data received from push notification
    }
  };

onReceived = notification => {
    console.log("Notification received: ", notification);
  };

onOpened = openResult => {
    console.log("Message: ", openResult.notification.payload.body);
    console.log("Data: ", openResult.notification.payload.additionalData);
    console.log("isActive: ", openResult.notification.isAppInFocus);
    console.log("openResult: ", openResult);
  };

๋‚ด ์•ฑ์ด ๋‹ซํžŒ ๊ฒฝ์šฐ์—๋„( background AppState๊ฐ€ ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ๋‹ซํ˜€ ์žˆ์Œ) ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํƒญํ•˜๋ฉด onOpened ๋ฉ”์„œ๋“œ๊ฐ€ openResult ์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด ๋ฐ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ dispatch redux ์ž‘์—…์„ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@wkoutre ํฅ๋ฏธ๋กญ๋„ค์š”. ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ react-native , react-native-onesignal ๋“ฑ์˜ ๋ฒ„์ „์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? iOS์™€ Android ๋ชจ๋‘์—์„œ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธ ํ–ˆ์Šต๋‹ˆ๊นŒ? ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํƒญํ•  ๋•Œ ์•ฑ์ด ์™„์ „ํžˆ ๋‹ซํžŒ ์ƒํƒœ์—์„œ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํƒญํ•˜์—ฌ ์•ฑ์„ ์—ฌ๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ onOpened ๋ฉ”์„œ๋“œ๊ฐ€ 100% ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๊นŒ?

PushNotificationHelper ์˜ ๋กœ๋”ฉ์„ ์ธ์œ„์ ์œผ๋กœ ๋” ๋Šฆ์ถ”๋Š” ๊ฒฝ์šฐ, ์˜ˆ๋ฅผ ๋“ค์–ด 5์ดˆ ์ •๋„ ์ง€์—ฐ๋˜๋Š” setTimeout์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ, ๊ทธ ํ›„ PushNotificationHelper ๊ฐ€ ๋งˆ์šดํŠธ๋˜๊ณ  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ OneSignal์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@jordanmkoncz

"react-native": "0.50.4"
"react-native-onesignal": "^3.0.7"

iOS์™€ Android ๋ชจ๋‘์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ. ๋‘˜ ๋‹ค 100%:

  • ์•ฑ์ด ์™„์ „ํžˆ ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค
  • ํ‘ธ์‹œ ์•Œ๋ฆผ์ด ์ˆ˜์‹ ๋จ
  • ํ‘ธ์‹œ ์•Œ๋ฆผ์ด ๋„์ฒญ๋จ
  • ์•ฑ ๋กœ๋“œ
  • onOpened ๋Š” ํ‘ธ์‹œ ์•Œ๋ฆผ์˜ ๋ฐ์ดํ„ฐ๋กœ ํ˜ธ์ถœ๋˜๊ณ  openResult.notification.isAppInFocus === false

setTimeout ํ•˜๊ณ  ๋‹ค์‹œ ์—ฐ๋ฝ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


EDIT1: ์ €๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ด์ œ๋Š” Android์—์„œ 100% ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.


EDIT2: setTimeout ์ง€์—ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํƒญํ•˜์—ฌ ์•ฑ ๋กœ๋“œ ์‹œ onOpened ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๊ฒƒ์„ App.js ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค -- index.ios.js ๋ฐ index.android.js ์— ๋“ฑ๋ก๋œ ๋ฃจํŠธ ๊ตฌ์„ฑ ์š”์†Œ -- ๊ทธ๋ฆฌ๊ณ  onOpened ๋Š” 100%๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. iOS์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„์˜ ~50%, Android์˜ ๊ฒฝ์šฐ ์•ฝ 50%์ž…๋‹ˆ๋‹ค.

Android๊ฐ€ ์ผ๊ด€์„ฑ์ด ์—†๋Š” ์ด์œ ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Android์—์„œ ์•ฑ์ด ์™„์ „ํžˆ ๋‹ซํžˆ๊ณ  ์•Œ๋ฆผ์ด ์ˆ˜์‹ ๋˜๋ฉด ๋””๋ฒ„๊ฑฐ๊ฐ€ ์ง€์›Œ์ง€๊ณ  ํด๋ž˜์Šค ์ž์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๊นŒ์ง€ ๋‚ด App.js ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

const IOSX = HEIGHT === 812 && PLATFORM === "ios";

const wrapperStyle = [Styles.flex1];
if (IOSX) wrapperStyle.push(Styles.backgroundDarkGray);

let SPLASH_TIME;

console.log(`Change to TRUE below to reset store state`);

const PURGE = DEV ? false : false;

if (DEV) SPLASH_TIME = 4000;
else SPLASH_TIME = 4000;

// const composeEnhancers = composeWithDevTools({
//   realtime: true,
//   port: 8000
// });

const composeEnhancers =
  typeof window === "object" &&
  window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
  DEV
    ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
        // Specify extensionโ€™s options like name, actionsBlacklist, actionsCreators, serialize...
      })
    : compose;

const middlewares = [ReduxThunk];

// debugging tooling
// if (DEV) {
//   // add logger
// middlewares.push(logger)

//   // middlewares = [...middlewares, logger];
//   middlewares = [...middlewares];

// replace these transient reducers when they've been created

export const store = createStore(
  Reducers,
  {},
  composeEnhancers(
    applyAppStateListener(),
    applyMiddleware(...middlewares),
    autoRehydrate()
  )
);

// if (module.hot) {
//   // Enable hot module replacement for reducers
//   module.hot.accept(() => {
//     const nextRootReducer = require("./reducers/index").default;
//     store.replaceReducer(nextRootReducer);
//   });
// }

console.log(`right before APP`);

// Debugger logs everything before this line.

export default class App extends Component {
    ...
}

@jordanmkoncz ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. https://github.com/wix/react-native-notifications

์ข‹์Šต๋‹ˆ๋‹ค. iOS์™€ Android ๋ชจ๋‘์—์„œ 100% ์ž‘๋™ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด App.js ์—์„œ ๋‚ด ์•ฑ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

const handleOnOpened = openResult => {
  store.dispatch(setInitialNotification(openResult));
};

OneSignal.configure({});
OneSignal.addEventListener("opened", handleOnOpened);

... ์—ฌ๊ธฐ์„œ setInitialNotification ๋Š” ์•ก์…˜ ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ (์ง€๊ธˆ ํƒ‘์žฌ๋œ) ์•ฑ์ด ์žฌ์ˆ˜ํ™”๋ฅผ ๋งˆ์น˜๋ฉด ๋‹ค์Œ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

this.setState({ rehydrated: true }, () => {
          OneSignal.removeEventListener("opened", handleOnOpened);
        });

๋‚ด ์•ฑ -- redux Provider ๋กœ ๋ž˜ํ•‘๋œ -- render ๋ฉ”์„œ๋“œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

<Provider store={store}>
        <IphoneXAwareView style={wrapperStyle}>
          <StatusBar hidden={false} barStyle="light-content" />
          <MyAlert />
          <Loading />
          <ConnectedAppWithNavigationState />
          <PushNotificationHelper />
        </IphoneXAwareView>
      </Provider>

๊ฑฐ๊ธฐ์—์„œ PushNotificationHelper ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ชจ๋“  ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

@bhoop ๋ช‡ ๋‹ฌ์ด ์ง€๋‚ฌ์œผ๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ฐพ๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ... ๊ทธ๋ ‡๋‹ค๋ฉด ์‹œ๋„ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

@wkoutre redux์— ๋Œ€ํ•œ ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํฌํ•จ๋œ Readme ํŒŒ์ผ ์—…๋ฐ์ดํŠธ๋กœ PR์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@avishayil ๋ฌผ๋ก ์ด์ฃ . ์˜ค๋Š˜ ์ €๋…๊นŒ์ง€ ๋„์ฐฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

์•„๋น„์ƒค์ผ PR์ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋Ÿฐ ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๋Š” ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ๋‹ค. ์•ฑ์ด ์—ด๋ฆฌ๋ฉด ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„ ๋•Œ๋„ ๋ชจ๋“  ์ฝœ๋ฐฑ์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‘ธ์‹œ๋ฅผ ๋ฐ›์œผ๋ฉด ๋‚ด ์•ฑ ์•„์ด์ฝ˜์ด +1 ์ฆ๊ฐ€ํ•˜๊ณ  ์‹œ์Šคํ…œ์€ ์•Œ๋ฆผ ์ฝ˜ํ…์ธ ๊ฐ€ ์žˆ๋Š” ๋ฐฐ๋„ˆ๋ฅผ ํ‘œ์‹œํ•˜์ง€๋งŒ ๋ฐฐ๋„ˆ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์•„์ด์ฝ˜(์•Œ๋ฆผ ๋ฐฐ๋„ˆ๊ฐ€ ์•„๋‹˜)์œผ๋กœ ์•ฑ์„ ์—ด๋ฉด ์ฝœ๋ฐฑ์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. =[ ๋ฐฉ๋ฒ• ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌ?

  • ์—‘์Šคํฌ ๋ถ„๋ฆฌ ์•ฑ
  • ๋ฐ˜์‘ 16.3.1
  • ์›์‹œ๊ทธ๋„ 3.2.5
  • ์—‘์Šคํฌ 27.0.1

@brunoandradebr ์ด๊ฒƒ์€ ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์•ฑ ์•„์ด์ฝ˜์—์„œ ์•ฑ์„ ์—ด๋ฉด ์ˆ˜์‹ ํ•œ ์•Œ๋ฆผ์ด ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์•ฑ์„ ์—ฝ๋‹ˆ ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์•Œ๋ฆผ์„ ์ˆ˜์‹ ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์•ฑ์ด ์‹œ์ž‘๋  ๋•Œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์‹œ์ž‘ ์‹œ ์ง์ ‘ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ผ ๋•Œ ์•„์ด์ฝ˜์œผ๋กœ ์•ฑ์„ ์—ด๋ฉด ์›ํ•˜๋Š” ๋Œ€๋กœ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ(์Šค์™€์ดํ”„)ํ•œ ๋‹ค์Œ ์•„์ด์ฝ˜์œผ๋กœ ์—ด๋ฉด ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌ ์ค‘์ด์—ˆ๊ณ  XCode๊ฐ€ ์•ฑ์„ ์ค‘์ง€ํ•˜๊ณ  oonesignal lib ๋งํฌ๋ฅผ ๋‹ซ๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@brunoandradebr ๊ท€ํ•˜๊ฐ€ ๊ฒช๊ณ  ์žˆ๋Š” ๋ฌธ์ œ์™€ ์–ด๋–ค ์ฝœ๋ฐฑ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ received ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ฑ์ด ์ข…๋ฃŒ๋˜๋ฉด ์–ด๋–ค ์ด๋ฒคํŠธ๋„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•Œ๋ฆผ์ด ์•ฑ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•(์ตœ์†Œํ•œ iOS์˜ ๊ฒฝ์šฐ)์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์•Œ๋ฆผ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@brunoandradebr ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์–ป์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๋‚ด๊ฐ€ ํ‹€๋ฆฌ์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ด์ „ ์ฝ”๋ฉ˜ํŠธ์—์„œ ์„ค๋ช…ํ•œ ํ–‰๋™์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ์ด๊ฒƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด repo์—์„œ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jordanmkoncz ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ onesignal ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ •๋ง ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „์€ react-native-onesignal: ^3.2.8 ๋ฐ react-native: 0.56.0์ž…๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ฐ ํฌ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌ ์•Œ๋ฆผ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ง€๊ธˆ ์•ฑ์ด ๋‹ซํžˆ๊ณ  ์•Œ๋ฆผ์„ ํƒญํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์„ ๋‹ซ๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ํ•œ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๋นˆ ํฐ์ƒ‰ ํ™”๋ฉด๋งŒ ์•ฑ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. OneSignal์˜ ์›น์‚ฌ์ดํŠธ์—์„œ ๋ฌธ์„œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐ์šฐ๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด ๋งค์šฐ ์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ index.js์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฝ์—ˆ์ง€๋งŒ ๋ฐ˜์‘ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ค‘์ฒฉ๋œ ์Šคํƒ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด App.js์— ์„ ์–ธ๋œ ๊ธฐ๋ณธ ํƒ์ƒ‰๊ธฐ์—์„œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์กฐ์–ธ์„ ์ฃผ์‹œ๋ฉด ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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