React-native: ๊ธด ํƒ€์ด๋จธ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋„๋ก Timing์—์„œ AlarmManager ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 03์›” 16์ผ  ยท  173์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react-native

๋ช‡ ๋ถ„ ๋™์•ˆ ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ Android์˜ React Native์—์„œ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒ€์ด๋จธ๊ฐ€ ๊บผ์ ธ ์•ผ ํ•  ๋•Œ ๊นจ์–ด๋‚˜๋Š” ์‹œ์Šคํ…œ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  Timing ๋ชจ๋“ˆ์ด ๊นจ์–ด์žˆ๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„ ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ด๋จธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹  AlarmManager ๋ฐ Handler.postDelayed์— ์œ„์ž„ํ•˜๋Š” ์ปท์˜คํ”„ ์„ค์ •์„ ํƒ์ƒ‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Bug JavaScript Android

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

@ skv-headless ์˜๊ฒฌ์ด ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. :)

์ œ ์ƒ๊ฐ์—๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ํƒœ๋„๊ฐ€ ์‚ฌ๋ผ์ ธ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ์ž์ฃผ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹น์‹ ์—๊ฒŒ ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์„ ๋ฌด์‹œํ•˜์ง€ ๋ง๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋“  ๊ฒฝ๊ณ ๊ฐ€ ๋ฌด์‹œ๋˜๊ณ  ์ง€์› ์ค‘๋‹จ ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋˜๋Š” ์•ฑ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ์ด ์ค‘๋‹จ๋˜๊ณ  ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ด์ง‘๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์‹œ๊ฐ„ ์ œํ•œ์„ ๊ตฌ์„ฑํ•˜๊ณ  ๋‚ฎ์ถ”๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ์ž๋ฅผ ์ฐŒ๋ฅด๊ณ  ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์„ ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์กฐ์–ธ์€ ๋˜‘๋˜‘ํ•œ ์‚ฌ๋žŒ์ด ์‹ค์ œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋”ฐ๋ผ ๊ฐ€๋ฉด ๊ทธ ๋‹ต์œผ๋กœ ์Šค์Šค๋กœ๋ฅผ ๊ต์œก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋™์•ˆ (๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ) ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TL; DR;

์˜ˆ, ์ผ์‹œ์ ์œผ๋กœ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๋ฒˆ ํ™•์ธํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•œ ์กฐ์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

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

๋Œ€๋‹จํ•œ ๊ฐœ์„ !

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 85000ms ์˜ ํƒ€์ด๋จธ๋ฅผ ์œ ์ง€ํ•˜๋Š” socket.io์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. RN ๋งˆ์Šคํ„ฐ์—์„œ ์ž„๊ณ„ ๊ฐ’์€ 60000ms ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ธด ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Firebase.

firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info. (Saw setTimeout with duration 111862ms)

์ด ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ• ...

firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋˜ํ•œ firebase์™€ ํ•จ๊ป˜์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

"firebase": "^3.9.0",
"react-native": "0.44.0"

๋™์ผํ•œ ๋ฌธ์ œ ( 85000ms )์ด์ง€๋งŒ firebase . ๋‚ด ํŒจํ‚ค์ง€ ๋ชฉ๋ก :

  "dependencies": {
    "apisauce": "0.11.0",
    "format-json": "1.0.3",
    "lodash": "4.17.4",
    "markdown-it": "^8.3.1",
    "native-base": "^2.1.3",
    "normalizr": "^3.2.2",
    "prop-types": "^15.5.10",
    "querystringify": "1.0.0",
    "ramda": "0.23.0",
    "react": "16.0.0-alpha.6",
    "react-markdown": "^2.5.0",
    "react-native": "0.44.0",
    "react-native-animatable": "1.2.0",
    "react-native-config": "0.4.2",
    "react-native-device-info": "0.10.2",
    "react-native-drawer": "2.3.0",
    "react-native-htmlview": "0.9.0",
    "react-native-i18n": "1.0.0",
    "react-native-linear-gradient": "^2.0.0",
    "react-native-photo-view": "^1.2.0",
    "react-native-router-flux": "3.39.1",
    "react-native-scrollable-tab-view": "*",
    "react-native-share": "^1.0.20",
    "react-native-vector-icons": "4.1.1",
    "react-navigation": "^1.0.0-beta.9",
    "react-redux": "5.0.4",
    "redux": "3.6.0",
    "redux-persist": "4.6.0",
    "redux-saga": "0.15.3",
    "reduxsauce": "0.4.1",
    "seamless-immutable": "7.1.2"
  },
  "devDependencies": {
    "ava": "^0.18.2",
    "babel-eslint": "^7.1.1",
    "babel-preset-es2015": "^6.18.0",
    "enzyme": "^2.6.0",
    "husky": "^0.13.1",
    "ignite-animatable": "^0.3.1",
    "ignite-dev-screens": "^2.0.0-beta.9",
    "ignite-i18n": "^0.1.1",
    "ignite-ir-boilerplate-2016": "^0.2.2",
    "ignite-vector-icons": "^0.2.1",
    "mockery": "^2.0.0",
    "nyc": "^10.1.2",
    "react-addons-test-utils": "^15.3.1",
    "react-dom": "^15.4.0",
    "react-native-mock": "^0.3.1",
    "reactotron-apisauce": "^1.7.0",
    "reactotron-react-native": "^1.7.0",
    "reactotron-redux": "^1.7.0",
    "reactotron-redux-saga": "^1.7.0",
    "snazzy": "^6.0.0",
    "standard": "^8.6.0"
  }

Android์—์„œ 0.44.0์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ firebase๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info. (Saw setTimeout with duration 85000ms)

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„ .. ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋น ๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋‹ค :

react-native 0.44 react 16.0.0-alpha.6 feathers-socketio 1.6.0

๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ๋งค์šฐ ์งœ์ฆ๋‚˜๊ฒŒ ํŠ€์–ด ๋‚˜์™€ .. ์–ด์จŒ๋“  ์ง€๊ธˆ์€ ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ ??

firebase 3.9.0๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ

๊ท€์ฐฎ๋‹ค๋ฉด console.ignoredYellowBox = ['Setting a timer']; ๋งŒ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

@ skv-headless ์˜๊ฒฌ์ด ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. :)

์ œ ์ƒ๊ฐ์—๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ํƒœ๋„๊ฐ€ ์‚ฌ๋ผ์ ธ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ์ž์ฃผ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹น์‹ ์—๊ฒŒ ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์„ ๋ฌด์‹œํ•˜์ง€ ๋ง๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋“  ๊ฒฝ๊ณ ๊ฐ€ ๋ฌด์‹œ๋˜๊ณ  ์ง€์› ์ค‘๋‹จ ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋˜๋Š” ์•ฑ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ์ด ์ค‘๋‹จ๋˜๊ณ  ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ด์ง‘๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์‹œ๊ฐ„ ์ œํ•œ์„ ๊ตฌ์„ฑํ•˜๊ณ  ๋‚ฎ์ถ”๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ์ž๋ฅผ ์ฐŒ๋ฅด๊ณ  ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์„ ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์กฐ์–ธ์€ ๋˜‘๋˜‘ํ•œ ์‚ฌ๋žŒ์ด ์‹ค์ œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋”ฐ๋ผ ๊ฐ€๋ฉด ๊ทธ ๋‹ต์œผ๋กœ ์Šค์Šค๋กœ๋ฅผ ๊ต์œก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋™์•ˆ (๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ) ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TL; DR;

์˜ˆ, ์ผ์‹œ์ ์œผ๋กœ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๋ฒˆ ํ™•์ธํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•œ ์กฐ์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@imamatory ๋‚˜๋Š”

Rectotron์— ์˜ํ•œ ๊ฒƒ ๊ฐ™์•„์š”

๊ทธ๋ ‡๋‹ค๋ฉด์ด ๊ฒฝ๊ณ ๋Š” ๋ฌด์‹œํ•ด๋„๋ฉ๋‹ˆ๋‹ค.
...ํ•˜์ง€๋งŒ ๋‚ด ์•ˆ๋“œ๋กœ์ด๋“œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๋•Œ๋•Œ๋กœ ๋Š๋ ค์ง€๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@imamatory ์‹ค์ œ ์†”๋ฃจ์…˜์ด ์‰ฝ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋จผ์ € ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์Œ ํŒŒ์ผ์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. libraries / Core / Timers / JSTimer; js
๊ทธ๊ฒƒ์„ ์—ด๋ฉด์ด const MAX_TIMER_DURATION_MS๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ง€์† ์‹œ๊ฐ„ ์ด์ƒ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ๊ฒฝ๊ณ ๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค!

@nicolasZZ ์•ˆ๋…•ํ•˜์„ธ์š”, ์†”๋ฃจ์…˜์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ ์ž์‹ ์˜ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ JSTimer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์Šต๊ด€์ž…๋‹ˆ๊นŒ?

@nicolasZZ @AmroAly ์ด ์†”๋ฃจ์…˜์€ ๋งค์šฐ ๋ถˆ์•ˆ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์Šต๊ด€์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๊ณต์‹ ์†”๋ฃจ์…˜์ด ์ถœ์‹œ๋˜๋Š” ๋™์•ˆ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

console.ignoredYellowBox = [
    'Setting a timer'
]

@ skv-headless์˜ ์†”๋ฃจ์…˜์€ ์ข‹์ง€๋งŒ ์ œ ๊ฒฝ์šฐ์—๋Š” ๊ด„ํ˜ธ ์‚ฌ์ด์˜ "enter"๋กœ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@rigobcastro ์„ฑ๊ฐ€์‹  ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ฒจ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ DZuz14 PR์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์ ์–ด๋„ ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด

์•ˆ๋…• ~
socket.io๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. nodejs and RN44 or RN 45
๋‚˜๋Š”์ด ํƒ€์ด๋จธ๋ฅผ ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๋‹ค.

์ด ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค
reference reactotron PR

๊ฐœ์ธ ์„œ๋ฒ„ nodejs ๋ฐ scoket.io

const express = require('express')
const app = express()
const server = require('http').Server(app)
const io = require('socket.io')(server, {pingTimeout: 30000})

๊ฐ์‚ฌ!

Android ์šฉ ๊ฐ„๋‹จํ•œ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๊ณ  ๋กœ๊ทธ์ธ ๋ฐ ๊ฐ€์ž…์„ ์œ„ํ•ด react native์™€ ํ•จ๊ป˜ firebase auth๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋…ธ๋ž€์ƒ‰ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? stackoverslow์˜ ๋‚ด ์งˆ๋ฌธ ๋งํฌ (https://stackoverflow.com/questions/44603362/setting-a-timer-for-a-long-period-of-time-ie-multiple-minutes)

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @ DZuz14
react-native run-android ์‹คํ–‰ํ•  ๋•Œ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

D:\Projects 2016\Web\Android\mohajerkade-android\android\app\src\main\java\com\mohajerkade\AlarmManagerModule.java:40: error: cannot find symbol
       Intent intent = new Intent(context, AlarmReceiver.class);
                                           ^
  symbol:   class AlarmReceiver
  location: class AlarmManagerModule
1 error
:app:compileDebugJavaWithJavac FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

๋กœ๊ทธ์ธ ๋ฐ ๊ฐ€์ž…์— ๋Œ€ํ•œ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์™€ ํ•จ๊ป˜ firebase ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋…ธ๋ž€์ƒ‰ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
1 :์ด ๋ชจ๋“ˆ์€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
2 : ๋‚ด ํ”„๋กœ์ ํŠธ์—์ด ๋ชจ๋“ˆ์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๋งํฌ๋ฅผ ํ†ตํ•ด stackoverflow ๋ฅผ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. (https://stackoverflow.com/questions/44603362/setting-a-timer-for-a-long-period-of-time-ie-multiple-minutes)
์ด ๋งํฌ๋ฅผ ํ†ตํ•ด Google Firebase ํŒ€์— ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค : (https://github.com/firebase/firebase-js-sdk/issues/97)

@ DZuz14 @saeedhei ์™€ ๊ฐ™์€ ์งˆ๋ฌธ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค .

๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์žฅ๊ธฐ ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” firebase ๋…ธ๋“œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Javascript ํƒ€์ด๋จธ ๋Œ€์‹  ์•Œ๋žŒ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‹ค์ œ๋กœ firebase ๋…ธ๋“œ ๋ชจ๋“ˆ ๋‚ด์—์„œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @ DZuz14

๋”ฐ๋ผ์„œ firebase ๋ผ๋Š” npm ํŒจํ‚ค์ง€๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ฝค ๋งŽ์€ ๊ณณ์—์„œ setTimeout์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์›น ์‚ฌ์ดํŠธ ๋ฐ node.js ์„œ๋ฒ„์šฉ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. react-native ์€ ์ผ์ข…์˜ node.js ์„œ๋ฒ„์ด์ง€๋งŒ ์ „ํ™”์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€์ ํ–ˆ๋“ฏ์ด ์žฅ๊ธฐ ์‹คํ–‰ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ํƒ€์ด๋จธ๋Š”์ด ํ™˜๊ฒฝ์—์„œ ์ข‹์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜๊ณ  ๋‹ค๋ฅธ ์›์น˜ ์•Š๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

๊ทธ๋ž˜์„œ ์ €๋Š” Firebase ์ง์›๋“ค์ด ์‹ค์ œ๋กœ ๊ท€ํ•˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๊ณ  ํŠนํžˆ react-native ์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•˜๋„๋ก ์„ค๋“ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@BerndWessels https://www.npmjs.com/package/react-native-firebase ์ด๊ฒƒ์„ ๋ณด์…จ์Šต๋‹ˆ๊นŒ? firebase๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‚ฌ์‹ค์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ, ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@ DZuz14 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

console.ignoredYellowBox = [
'ํƒ€์ด๋จธ ์„ค์ •'
]

@rigobcastro ์ด ์ฝ”๋“œ๋ฅผ ์–ด๋””์— ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@ Jazz747 ์„ค์ • ํŒŒ์ผ ์ƒ๋‹จ (์˜ˆ : app.js, index.android.js ๋˜๋Š” index.ios.js)

console.ignoredYellowBox = [ 'Setting a timer' ]
์ด ์ฝ”๋“œ๋Š” React Native ๋‚ด๋ถ€์˜ ๊ฒฝ๊ณ  ๋งŒ ์ˆจ ๊น๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†” ๋‚ด๋ถ€์˜ ๊ฒฝ๊ณ ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

RN ํŒ€์ด๋‚˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๋ชจ์ƒ‰ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฒฝ๊ณ  ํŒ์—…์ด์ด ๋ฌธ์ œ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜์ง€๋งŒ ์ „ํ˜€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹Œ ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ ์™ธ์—๋Š” ์ ์ ˆํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์•„์ด๋””์–ด ๋‚˜ ์ œ์•ˆ?

@SuhairZain ๋ชจ๋“  ๊ฒƒ์ด RN์— ๋Œ€ํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜ค๋ฅ˜์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@rigobcastro ์ด ๊ฒฝ๊ณ ๋Š” setInterval() ํ˜ธ์ถœ๋กœ ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„ (์ œ ๊ฒฝ์šฐ์—๋Š” 5 ๋ถ„)์œผ๋กœ ์‰ฝ๊ฒŒ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

BTW, ๊ทธ ์ดํ›„๋กœ ์—ฌ๊ธฐ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. react-native-background-timer ๋กœ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

@SuhairZain ๋งž์•„์š”! ๋‚ด ๋ฌธ์ œ๋Š” ํƒ€์‚ฌ lib์— ์žˆ์—ˆ์ง€๋งŒ ์†Œ์œ ์ž๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ( setInterval() ) ๋ฐฉ๊ธˆ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์ถ”์ฒœ, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

rn : 0.45.1
firebase : 4.1.3

@escalepion์—๊ฒŒ firebase ํŒ€์—๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค : (https://github.com/facebook/react-native/issues/12981#issuecomment-309595327)

@escalepion ๋ฌธ์ œ๊ฐ€ ์žฅ๊ธฐ ์‹คํ–‰ ํƒ€์ด๋จธ ์„ค์ •์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ์œ„์˜ ๋‚ด ์˜๊ฒฌ์„ ์‚ดํŽด๋ณด๊ณ  ๋„์›€์ด๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@SuhairZain ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ์–ด๋–ป๊ฒŒ setInterval ๋˜๋Š” react-native-background-timer๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค :( ์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๊นŒ?

๋ˆ„๊ตฌ๋“ ์ง€ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•ด๋ฅผ ์ผ์œผํ‚ค๋Š” ์ง€ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ตœ๊ทผ์— RN์„ 0.46์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ์ด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ํ”„๋กœ์ ํŠธ์— ๊ฝค ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ๊ฒƒ๋“ค์„ ํ•˜๋‚˜์”ฉ ์กฐ์‚ฌํ•˜๋Š” ๊ฒƒ๋งŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ!

@ abeltje1 ,์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์—์„œ ์—…๋ฐ์ดํŠธ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@liketurbo ํ™•์‹คํžˆ ๋‚˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค

30 ๋ถ„๋งˆ๋‹ค API ํ† ํฐ์„ ์žฌ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด redux-saga ์™€ ํ•จ๊ป˜์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ์ด ๊ฒฝ์šฐ์ด ์‹œ๊ฐ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์˜ณ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด ์งˆ๋ฌธ์€ ์™œ ์ด๊ฒƒ์ด ๊ฒฝ๊ณ ์ž…๋‹ˆ๊นŒ? ์ค‘๋‹จ / ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? LLT (์žฅ๊ธฐ ๊ฑฐ๋ž˜)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

LLT๊ฐ€ ๊ดœ์ฐฎ๋‹ค๋ฉด. ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? AlarmManager ์‹œ๊ฐ„์„ ํ™•์žฅ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค;)

@sospedra์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” redux-saga ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ 3 ๋ถ„๋งˆ๋‹ค ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ฑ์˜ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ๊ณ ์น˜๋Š” saga๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ saga์— yield call(delay, 3 * 60000); ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ "์žฅ์‹œ๊ฐ„ ํƒ€์ด๋จธ ์„ค์ • ์ค‘ ..."์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ์ œ์•ˆ ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ๋‘๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์žˆ๋Š” ๊ฒฝ์šฐ ํƒ€์ด๋จธ๊ฐ€ ์‹ค์ œ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์‹œ๊ฐ„์— ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์ด ์ฝ”๋“œ์—์„œ 3 ๋ถ„ ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๋Œ€์ฒด ์†”๋ฃจ์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์—ฌ์ „ํžˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ Android ๊ฐœ๋ฐœ๋กœ ์ด๋™ํ•˜๋Š” ์œ ์ผํ•œ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ˆ„๊ตฌ๋“ ์ง€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

firebase๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ธด ์‹œ๊ฐ„ ์ œํ•œ์„ ์„ค์ • ํ•œ ๊ฒฝ์šฐ react-native-background-timer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. README์—๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ setTimeout์ด ํ˜ธ์ถœ ๋œ ์œ„์น˜๋ฅผ ์ฐพ๊ณ  ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜๊ฑฐ๋‚˜ PR์„ ์ œ์ถœํ•˜์—ฌ ์•ž์„œ ์–ธ๊ธ‰ ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”. https://github.com/facebook/react-native/issues/12981#issuecomment -331074444 ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š”์ง€ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋„ ํ›Œ๋ฅญํ•œ ์‹œ๊ฐ„ ์ œํ•œ์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

react-native-background-timer ๋Š” @SuhairZain์ด ๋งํ–ˆ๋“ฏ์ด ์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

socket.io๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์ด ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

socket.io์—๋Š” 85ms์˜ ํƒ€์ด๋จธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

FWIW ์ด๊ฒƒ์€ ๊ฐœ๋ฐœ ์ค‘์— Reactotron์„ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค ...

ํ•œ๋™์•ˆ ๋‚˜๋ฅผ ๋ฏธ์น˜๊ฒŒ ๋งŒ๋“ค์—ˆ ์–ด ์ธ์ •ํ•ด์•ผํ•˜๋Š”๋ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฑธ ์•Œ์•˜์–ด

๋‚˜๋Š” ๋” ์ด์ƒ์ด ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—์ด ์ ‘๊ทผ๋ฒ•์ด ์ž‘๋™ํ•˜๋Š”์ง€ ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ ์–ด๋„ ์ด๋ก ์ ์œผ๋กœ๋Š” ๊ทธ๋ž˜์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ธด ์ง€์—ฐ์ด์žˆ๋Š” setTimeout ๋˜๋Š” setInterval์„ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์‚ฌ ๋ชจ๋“ˆ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ดํ•˜๋Š” ์ผ์€ ์›์ˆญ์ด ํŒจ์น˜ ์ „์—ญ setTimeout ๋ฐ setInterval์„ ๋Œ€์‹  react-native-background-timer ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import BackgroundTimer from 'react-native-background-timer';

setTimeout = BackgroundTimer.setTimeout;
setInterval = BackgroundTimer.setInterval;
clearTimeout = BackgroundTimer.clearTimeout;
clearInterval = BackgroundTimer.clearInterval;

์ดˆ๊ธฐ ์ดˆ๊ธฐํ™”์˜ ์–ด๋”˜๊ฐ€์—์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”. ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ index.android.js ๋˜๋Š” index.ios.js๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋†’์ด ํ‰๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@SuhairZain : ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ์ง€๊ธˆ๊นŒ์ง€ ๋ช‡ ๊ฐ€์ง€ ์กฐ์ •์œผ๋กœ ์ €์—๊ฒŒ

setTimeout = BackgroundTimer.setTimeout.bind(BackgroundTimer)
setInterval = BackgroundTimer.setInterval.bind(BackgroundTimer)
clearTimeout = BackgroundTimer.clearTimeout.bind(BackgroundTimer)
clearInterval = BackgroundTimer.clearInterval.bind(BackgroundTimer)

@levity ๋‚ด app.js์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์ด๊ฑธ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

undefined๋Š” ๊ฐ์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค ( 'RNBackgroundTimer.setTimeout'ํ‰๊ฐ€).

@realtebo ๋Š” react-native link ํ•˜๊ฑฐ๋‚˜ CocoaPods๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ README์— ์„ค๋ช… ๋œ๋Œ€๋กœ react-native-background-timer ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@levity : react-native link ์‹คํ–‰์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

npm install -g react-native-cli
๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋งํฌ
C : UsersrealteboDownloadsmanager2node_modules (54ms)์—์„œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ์œ„ํ•œ ํด๋” ๊ฒ€์ƒ‰
react-native link ๋Š” Create React Native App ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์— ์˜์กดํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋จผ์ € ๊บผ๋‚ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://github.com/react-community/create-react-native-app/blob/master/EJECTING.md ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๊บผ๋‚ด๊ณ  ์‹ถ์ง€ ์•Š์•„ .... ๊ทธ๋ž˜์„œ, .. ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์•„, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. Create React Native App ํ”„๋กœ์ ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋„์™€ ์ค„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ง์ ‘ ์‚ฌ์šฉํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•,
react-native: ^0.49.3 ...

cf. https://github.com/ocetnik/react-native-background-timer/issues/65

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

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” 0.49 ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

export function saveUserData(userInfo){
  return (dispatch) => {
    dispatch(saveDataRequest())
    const userId = firebase.auth().currentUser.uid;
    return firebase.database().ref('users/' + userId).set(userInfo)
      .then(() => {
        dispatch(saveDataSuccess());
        dispatch(NavigationActions.navigate({ routeName: 'TabContactNavigation' }))
      })
      .catch((error) => {
        dispatch(saveDataFailure(error))
      });
  }
}

์œ„๋Š” Action in redux์ด๋ฉฐ redux-thunk .. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์–‘์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ firebase ์— ์ €์žฅํ•˜๋ฉด saveDataSuccess() ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋‹ค์Œ ํƒญ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ ๋ฌธ์ œ๊ฐ€ const userId = firebase.auth().currentUser.uid ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฌธ์ œ์˜ ์Šคํฌ๋ฆฐ ์ƒท์ž…๋‹ˆ๋‹ค. (์•ฑ์€ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ์ด ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ฌด์‹œํ•ด์•ผํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.) ๋˜๋Š” ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค.

warning

warning2

์•ผ, ๊ฒฝ๊ณ ๋Š” setTimeout์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
์˜ˆ, const userId = firebase.auth (). currentUser.uid; ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์•ฝ์†์ด๋ฉฐ userId๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์—ฌ์ „ํžˆ ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋” ์ข‹์€ ๋ฐฉ๋ฒ•์€ actionCreator์—์„œ userId๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ userInfo ๋ณ€์ˆ˜๋ฅผ ๋ณด๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”.

userInfo๊ฐ€ firebase ์ธ์ฆ ๋กœ๊ทธ์ธ์—์„œ ์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐ€์ •ํ•˜๋ฏ€๋กœ uid๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ณด๋‚ด๊ธฐ ํ•จ์ˆ˜ saveUserData (userInfo) {
return (dispatch) => {
๋””์ŠคํŒจ์น˜ (saveDataRequest ())
// const userId = firebase.auth (). currentUser.uid;
return firebase.database (). ref ( 'users /'+ userInfo.uid) .set (userInfo)
.then (() => {
dispatch (saveDataSuccess ());
dispatch (NavigationActions.navigate ({routeName : 'TabContactNavigation'}))
})
.catch ((์˜ค๋ฅ˜) => {
๋””์ŠคํŒจ์น˜ (saveDataFailure (์˜ค๋ฅ˜))
});
}
}
๋‚˜๋Š” ์ด๊ฒƒ์ด ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ, ๋‚˜์˜ ๋‚˜์œ ์˜์–ด = P์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ์—†๋Š” ๊ธฐ์จ

2017 ๋…„ 10 ์›” 23 ์ผ ์˜ค์ „ 23์‹œ 59 ๋ถ„, Yasir [email protected] escribiรณ :

์•ˆ๋…•ํ•˜์„ธ์š”, 0.49๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ณด๋‚ด๊ธฐ ํ•จ์ˆ˜ saveUserData (userInfo) {
return (dispatch) => {
๋””์ŠคํŒจ์น˜ (saveDataRequest ())
const userId = firebase.auth (). currentUser.uid;
return firebase.database (). ref ( 'users /'+ userId) .set (userInfo)
.then (() => {
dispatch (saveDataSuccess ());
dispatch (NavigationActions.navigate ({routeName : 'TabContactNavigation'}))
})
.catch ((์˜ค๋ฅ˜) => {
๋””์ŠคํŒจ์น˜ (saveDataFailure (์˜ค๋ฅ˜))
});
}
}
์œ„๋Š” redux์˜ Action์œผ๋กœ redux-thunk๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์–‘์‹์—์„œ firebase๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ์ €์žฅ์ด ์„ฑ๊ณตํ•˜๋ฉด saveDataSuccess ()๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๋‹ค์Œ ํƒญ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ ๋ฌธ์ œ๊ฐ€ ์—ฌ๊ธฐ์—์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค const userId = firebase.auth (). currentUser.uidํ•˜์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฌธ์ œ์˜ ์Šคํฌ๋ฆฐ ์ƒท์ž…๋‹ˆ๋‹ค. (์•ฑ์€ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ์ด ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ฌด์‹œํ•ด์•ผํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.) ๋˜๋Š” ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค.

https://user-images.githubusercontent.com/12644122/31925375-94b7c464-b89d-11e7-889d-e9d00866ff73.png
https://user-images.githubusercontent.com/12644122/31925386-9e9bf3c4-b89d-11e7-9eaa-65147879629f.png
โ€”
์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub https://github.com/facebook/react-native/issues/12981#issuecomment-338874018 ์—์„œ ๋ณด๊ฑฐ๋‚˜ https://github.com/notifications/unsubscribe-auth/ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ redux ์ €์žฅ์†Œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹จ์ˆœํžˆ ํ•„์š”์— ๋”ฐ๋ผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
...ํ•˜์ง€๋งŒ ... ๋น„์Šทํ•œ ์ƒํ™ฉ์—์„œ ์‹œ๊ฐ„ ์ œํ•œ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

react-native-signalr ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์ผํ•œ ๋ฌธ์ œ (300000ms)

socket.io ์„œ๋ฒ„ ์˜ต์…˜
pingTimeout (60000) + pingInterval (25000) <= 60000

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

๋‚ด ์ด์ „ ์˜๊ฒฌ (8 ์›”๋ถ€ํ„ฐ)์„ ๋”ฐ๋ผ ๊ฐ€๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ ์ฃผ๋ณ€์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์˜ ๊ฐ์ •์„ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.์ด AlarmManager๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์žฅ์ˆ˜ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌ ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€

cc @shergin @cpojer @javache @hramos

Android์˜ react-native-signalr (ms-signalr-client)์— ๋Œ€ํ•œ ์ˆ˜์ •์€ ๊ธฐ๋ณธ pinginterval (300000)์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
connection.start({ pingInterval: 5000, jsonp: true, transport: ['webSockets', 'serverSentEvents', 'longPolling']}).done(() => { console.log('Now connected, connection ID =' + connection.id) })

react-native-pomelo์™€ ๋™์ผํ•œ ๋ฌธ์ œ (80000ms)

console.ignoredYellowBox = ['Setting a timer'];

์›๊ฒฉ์œผ๋กœ ๋””๋ฒ„๊ทธ ํ•  ๋•Œ ํฌ๋กฌ ์ฝ˜์†”์— ๊ฒฝ๊ณ ๊ฐ€ ๊ณ„์† ํ‘œ์‹œ๋˜๋ฏ€๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งค์šฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†” ๋ฌด์‹œ ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๊ฐ€์žฅ ์ข‹์€ ์žฅ์†Œ๋Š” ์–ด๋””์ž…๋‹ˆ๊นŒ? '

-์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์„ธ์š”, ์—ฐ๊ฒฐ๋œ stackexchange ์—์„œ ํžŒํŠธ๋ฅผ ์–ป์—ˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚ด App.js์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

    console.ignoredYellowBox = [
      'Setting a timer'
    ];
  }
...
}
````

and also tried in my index.js as <strong i="8">@haikyuu</strong> just recommended..

'react-native'์—์„œ {AppRegistry} ๊ฐ€์ ธ ์˜ค๊ธฐ;
'./App'์—์„œ ์•ฑ ๊ฐ€์ ธ ์˜ค๊ธฐ;

console.ignoredYellowBox = [
'ํƒ€์ด๋จธ ์„ค์ •'
];

AppRegistry.registerComponent ( 'manager', () => ์•ฑ);
````

๋‘˜ ๋‹ค์—์„œ ์ผํ–ˆ๋‹ค

@CopyJosh ํ•ญ๋ชฉ ํŒŒ์ผ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : index.js

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์‹ค์ œ ํ•ด๊ฒฐ์ฑ…์ด ์•„์ง ์—†์Šต๋‹ˆ๊นŒ? ์ด์ œ 8 ๊ฐœ์›”์ด ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค ..

?

๊ทธ๋Ÿผ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ด…์‹œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ๋‹ค์Œ์„ ์•Œ์•„ ๋‚ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

A.) React ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ ํ•  ์ˆ˜์žˆ๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‰ฌ์šด API์ž…๋‹ˆ๋‹ค. AlarmManagers ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋งŒ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด React Native ์ฝ”๋“œ์—์„œ ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Android ๊ธฐ๊ธฐ ๊ธฐ๋ณธ AlarmManager๋กœ ์•Œ๋žŒ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
AlarmMgr.setInexactRepeating(arg1, arg2...)

B.) ์ด๊ฒƒ์„ ์ž‘๋™์‹œํ‚ค๋Š” ์‹ค์ œ ๊ตฌํ˜„. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, AlarmManager๋กœ ์•Œ๋žŒ์„ ์„ค์ •ํ•˜๋ฉด "๋ณด๋ฅ˜์ค‘์ธ ์ธ ํ…ํŠธ"๊ฐ€ AlarmManager ์„œ๋น„์Šค๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์–ด๋–ค ์œ ํ˜•์˜ "์ž‘์—…"์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  AlarmManager์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด๊ฒŒ๋Š” AlarmManager (๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • React Java ๋ฉ”์„œ๋“œ)๊ฐ€ ์ผ๋ถ€ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ JavaScript ์ฝ”๋“œ๋กœ ๋‹ค์‹œ ๋ณด๋‚ด ๊ฒฝ๋ณด๊ฐ€ ์šธ๋ฆฐ ํ›„ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์•Œ๋ ค์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ ์—์„œ AlarmManager์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

btw-์ด ๋น„ ํšจ์œจ์„ฑ (๊ธด ์ˆ˜ ๋ถ„์˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ์™€ ๊ด€๋ จ๋œ)์€ RN ๋ฒ„์ „> 0.43์—์„œ๋งŒ ์ƒˆ๋กœ์šด ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹จ์ง€ ๊ฒฝ๊ณ ๊ฐ€ RN> 0.43์—์„œ ๋ฑ‰์–ด๋‚ด๋Š” ๊ฒƒ์ผ๊นŒ ์š”? 0.43.x์—์„œ 0.47.x๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ  ๊ฒฝ๊ณ ๋ฅผ๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋น„ ํšจ์œจ์„ฑ์ด ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , RN์ด ์ด์ œ ๋ง‰ ๊ฒฝ๊ณ ๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค ..

๊ทธ๋Ÿฌ๋‚˜ ๋ฉฐ์น  ์ „ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•œ ์ดํ›„๋กœ ๋‚ด ์•ฑ์ด ํœด๋Œ€ ์ „ํ™”์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  diff์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์€ ๋ช…๋ฐฑํ•œ ๋ฒ”์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค)

์•ˆ๋…•ํ•˜์„ธ์š” @astreet ,์ด ๋ฌธ์ œ๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์—ฌ๊ธฐ https://github.com/facebook/react-native/commit/3637bce479 ์—์ด ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ ํ•  ๋•Œ ์–ธ๊ธ‰ ํ•œ ๋‚ด์šฉ์„ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ?

2 ๋ถ„ ๋ฐ˜๋ณต ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ํ›„ ์ตœ๊ทผ์— ๋‚˜์—๊ฒŒ ๊ฝค ์งœ์ฆ์ด ๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์—์ด ๊ฒฝ๊ณ ๊ฐ€ ์ฒ˜์Œ์— ์ถ”๊ฐ€ ๋œ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ €๋Š”์ด ๋ฌธ์žฅ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค : "Timing ๋ชจ๋“ˆ์„ ๊นจ์šฐ์‹ญ์‹œ์˜ค". ๋‚ด๊ฐ€ ์–ธ๊ธ‰ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ Timer ๋ชจ๋“ˆ์ด ์•ˆ๋ฌด๊ฐ€ ์ฝœ๋ฐฑ์„ ์„ค์ •ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํƒ€์ด๋จธ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์ฝœ๋ฐฑ์ด ์„ค์ •๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ. ๊ด€๋ จ ์ฝ”๋“œ ๋ถ€๋ถ„์€ https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/ReactAndroid/src/main/java/com/facebook/react/modules/core/Timing.java#L106
์˜ˆ์•ฝ ๋œ ํƒ€์ด๋จธ๊ฐ€ ์—†์„ ๋•Œ ์ฝœ๋ฐฑ์„ ์ค‘์ง€ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€์—†๊ณ  ํƒ€์ด๋จธ๊ฐ€ ์ถ”๊ฐ€ ๋  ๋•Œ ์˜ˆ์•ฝ์„ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์€ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ์ผ์‹œ ์ค‘๋‹จ๋˜๊ณ  ๋‹ค์‹œ ํฌ ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๋ฉด ๋ณต์›๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์•ˆ๋ฌด๊ฐ€ ์ฝœ๋ฐฑ์€ ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋™์•ˆ ํƒ€์ด๋จธ๊ฐ€ ์žˆ๋Š”์ง€, ์งง์€ ๊ธฐ๊ฐ„ ๋™์•ˆ ํƒ€์ด๋จธ๊ฐ€ ์žˆ๋Š”์ง€ ๋˜๋Š” ์ „ํ˜€ ์„ค์ •๋œ ํƒ€์ด๋จธ๊ฐ€ ์—†๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๊ฐ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•ด ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ธด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์„ฑ๋Šฅ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

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

socket.io์—์„œ ๊ธฐ๋ณธ ํ•‘ ๋ฃจํ”„๋Š” 85000ms, = pingInterval (25000ms) + pingTimeout (60000ms)์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„์—์„œ ์ด๋Ÿฌํ•œ ์˜ต์…˜์„ ์žฌ์„ค์ •ํ•˜๊ณ  pingInterval ๋ฐ pingTimeout <= 60000ms์˜ ํ•ฉ๊ณ„๋ฅผ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด :

var socket = require('socket.io')(12345, {
  pingInterval: 20000, 
  pingTimeout: 40000
})

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์—์„œ ์•ฝ 5 ๋ถ„ ์‹œ๊ฐ„ ์ œํ•œ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์–ผ๋งˆ๋‚˜ ์‹ฌ๊ฐํ•˜๋ฉฐ ๋‚˜์—๊ฒŒ ์–ผ๋งˆ๋‚˜ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ ๊นŒ?

@ntomallen ์•ฑ์ด ํ•ญ์ƒ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 5 ๋ถ„ ํ›„์— ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ •ํ™•ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Android ๋ณ€๊ฒฝ ์†Œ์ผ“ ์„œ๋ฒ„ ์˜ต์…˜ pingTimeout ์—์„œ 30000์œผ๋กœ React Native์™€ ํ•จ๊ป˜ laravel echo๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@sospedra gotcha . ๋„ˆ๋ฌด ๋‚˜์˜์ง€ ์•Š์€์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

ํ•ญ์ƒ Handler.postDelayed๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋น ๋ฅธ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐฉ๊ธˆ Firebase์—์„œ RN์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํƒ€์ด๋จธ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ (์ผ๊ด€๋˜๊ฒŒ) ์ž‘๋™ํ•˜๋Š” ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

setInterval์„ ์‚ฌ์šฉํ•˜์—ฌ 10 ๋ถ„๋งˆ๋‹ค ์„œ๋ฒ„๋ฅผ pingํ–ˆ์Šต๋‹ˆ๋‹ค. setInterval(myFunction, 60000) ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒŒ ์ œ๊ฐ€ ๊ฑฑ์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ธ๊ฐ€์š”?

๋‚ด ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ์•ฑ์ด ์—ด๋ ค์žˆ๋Š” ๋™์•ˆ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์•ฑ์ด ์ผ์‹œ ์ค‘๋‹จ ๋œ ํ›„ (ํ•œ ๋ฒˆ์˜ ํ™ˆ ๋ฒ„ํŠผ ๋ˆ„๋ฆ„) ์š”์ฒญ์ด ์‹คํ–‰์„ ์ค‘์ง€ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์˜ˆ์ƒ ํ•  ์ˆ˜์žˆ๋Š” ๋™์ž‘์ž…๋‹ˆ๊นŒ? ์•ฑ์ด ์ผ์‹œ ์ค‘๋‹จ๋˜๋Š” ๋™์•ˆ ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜๋ช…์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ ๊นŒ?

์—ฌ๊ธฐ์„œ๋Š” ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๊ฒฝ๊ณ ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์œผ๋ฏ€๋กœ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊นจ์–ด์žˆ๋Š” "ํƒ€์ด๋ฐ ๋ชจ๋“ˆ"์€์—†๊ณ , ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํƒ€์ด๋จธ๋ฅผ ํ™•์ธํ•˜๋Š” ์•ˆ๋ฌด๊ฐ€ ์ฝœ๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค (ํƒ€์ด๋จธ์˜ ์ตœ์†Œ ๋‹จ์œ„๋ฅผ ~ 16ms๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค).

iOS ๋˜๋Š” Android์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํƒ€์ด๋จธ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ์ •ํ™•์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ๊ณ ๋Š” ํŠนํžˆ Android์— ๊ด€ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํƒ€์ด๋จธ๋Š” ์•ฑ์ด ํฌ ๊ทธ๋ผ์šด๋“œ๋กœ ๋Œ์•„์˜ฌ ๋•Œ ๊ฒฐ๊ตญ ์‹คํ–‰๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๊ณง ํ•ด๊ฒฐํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋กœ๊ทธ๋Š” Android ํœด๋Œ€ํฐ์—์„œ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ๋งˆ๋‹ค ์„ฑ๊ฐ€์‹œ๋‹ค.

๋‚ด ๋ฌธ์ œโ€ฆ

์ œํ•œ ์‹œ๊ฐ„์ด ์ตœ๋Œ€ ~ 59 ๋ถ„ ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์‹œ๊ฐ„์˜ ์ƒ๋‹จ์— ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์—ˆ๋‹คํ•˜๋ ค๋ฉด setTimeout ์ƒ์„ฑ ํ•  setInterval ์‹œ๊ฐ„์˜ ๋‹ค์Œ ์ƒ๋‹จ์—.

๋‚ด ์†”๋ฃจ์…˜โ€ฆ

  1. setTimeout ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ถ„๋‹น setInterval ๋ฅผ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.
  2. ํ˜„์žฌ ๋ถ„์ด 0 ๊ฒฝ์šฐ์—๋งŒ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก setInterval์— ์˜ํ•ด ํ˜ธ์ถœ ๋œ ํ•จ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค.

์ด ๊ธฐ๋Šฅ์€ ์ด์ œ ๋งค์‹œ๊ฐ„์ด ์•„๋‹Œ 1 ๋ถ„๋งˆ๋‹ค ์‹คํ–‰๋˜์ง€๋งŒ 60 ๋ฒˆ ์ค‘ 59 ๋ฒˆ์€ ์•„๋ฌด ์ผ๋„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฌดํ•ดํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ—ค์ด @beausmith , ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ 60 ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๋Š” ์†”๋ฃจ์…˜์ž…๋‹ˆ๊นŒ? ๋‚ด ์ดํ•ด๋กœ๋Š” ์—ฌ์ „ํžˆ timerModule์„ ๊ฐ™์€ ์‹œ๊ฐ„ ๋™์•ˆ ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :)

@newah- ์˜ˆ, ์•ฝ๊ฐ„

@beausmith , ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” https://github.com/ocetnik/react-native-background-timer ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.์ด lib์˜ ๊ตฌํ˜„์œผ๋กœ setTimout ๋ฐ setInterval์„ ๋ฎ์–ด ์ผ์Šต๋‹ˆ๋‹ค.

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํƒ€์ด๋จธ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ํ•„์š”์— ๋”ฐ๋ผ ํ”Œ๋Ÿฌ์Šค ๋˜๋Š” ๋งˆ์ด๋„ˆ์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :))

์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. :)

react-intl FormattedRelative๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ FormattedRelative๊ฐ€ ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— :

scheduleNextUpdate(props, state) {
    // Cancel and pending update because we're scheduling a new update.
    clearTimeout(this._timer);

    const {value, units, updateInterval} = props;
    const time = new Date(value).getTime();

    // If the `updateInterval` is falsy, including `0` or we don't have a
    // valid date, then auto updates have been turned off, so we bail and
    // skip scheduling an update.
    if (!updateInterval || !isFinite(time)) {
      return;
    }

    const delta = time - state.now;
    const unitDelay = getUnitDelay(units || selectUnits(delta));
    const unitRemainder = Math.abs(delta % unitDelay);

    // We want the largest possible timer delay which will still display
    // accurate information while reducing unnecessary re-renders. The delay
    // should be until the next "interesting" moment, like a tick from
    // "1 minute ago" to "2 minutes ago" when the delta is 120,000ms.
    const delay =
      delta < 0
        ? Math.max(updateInterval, unitDelay - unitRemainder)
        : Math.max(updateInterval, unitRemainder);

    this._timer = setTimeout(() => {
      this.setState({now: this.context.intl.now()});
    }, delay);
  }

๋‹ค์Œ์€ ๋‚ด ์ฝ”๋“œ์—์„œ์˜ ์‚ฌ์šฉ ์˜ˆ์ž…๋‹ˆ๋‹ค.

<FormattedRelative value={date}>
    {(message: string) => <Text>{message}</Text>}
</FormattedRelative>

์ด ๊ฒฝ๊ณ ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Android์—์„œ firebase ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠนํžˆ ์งœ์ฆ์ด๋‚ฉ๋‹ˆ๋‹ค. ๊ณ ์ณ์ฃผ์„ธ์š”.

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

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

@vongohren์€ ๊ท€ํ•˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€๋Š” ๋ชปํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์ง„์ž… ํ•  ๋•Œ ์•ฑ ๋‚ด์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‚ ์งœ๋ฅผ ์ €์žฅ ํ•œ ๋‹ค์Œ ํฌ ๊ทธ๋ผ์šด๋“œ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ์ €์žฅ๋œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‚ ์งœ์™€ ๋น„๊ตํ•˜๊ณ  ์ผ๋ถ€ ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ...

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์„ ์ˆ˜๋ฝํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์•ฑ์—์„œ ์˜ˆ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์— ์˜์กดํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด๋ณด์‹ญ์‹œ์˜ค. Feks๋Š” ํŽ˜์ด์Šค ๋ถ ์•ฑ์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ํƒ€์‚ฌ์˜ ๋กœ๊ทธ์ธ ์š”์ฒญ์— ์˜ˆ๋ผ๊ณ  ๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ค‘์ธ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋Š” uPort, https://www.uport.me/์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์— ์˜์กด ํ•  ๋•Œ ์ด์ œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ๋งํ•˜๋ฉด ๋‚˜์ค‘์— ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ ‘๊ทผํ•˜์ง€ ์•Š๋Š” ํ•œ firebase์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ •๋ณด๋ฅผ ๋‚ด ๋ณด๋‚ธ ์งํ›„์— ์ •๋ฆฌ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ๋ง‰ ๋ถ™์–ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ •๋ณด๊ฐ€ ์ด๋ฏธ ๋‚ด ๋ณด๋ƒˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์™œ firebase ์ ‘๊ทผ ๋ฐฉ์‹์ด React Native์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ผ๊นŒ ์š”? ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ž๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

์ด ์ž‘์—…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์™„๋ฃŒ๋˜๋ฉด React์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?

์™€์šฐ, ์ด๊ฑด ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค

@nbennink ์—ฌ๊ธฐ์—์„œ ๋Œ€๋‹ต์„ ํ™•์ธ

socket.io๋ฅผ ์‚ฌ์šฉํ•œ ํ›„์—๋„ ๋™์ผํ•œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
๊ฒฝ๊ณ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info.
(Saw setTimeout with duration 85000ms)

๋‚ด ํŒจํ‚ค์ง€ ์„ธ๋ถ€ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • "react": "^ 16.3.0-alpha.1",
  • "๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ": "0.54.4",
  • "socket.io": "^ 2.1.1",
  • "socket.io-client": "^ 2.1.1",

์˜๊ตฌ์  ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

socket.io๋ฅผ ์‚ฌ์šฉํ•œ ํ›„์—๋„ ๋™์ผํ•œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
๊ฒฝ๊ณ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info.
(Saw setTimeout with duration 85000ms)

๋‚ด ํŒจํ‚ค์ง€ ์„ธ๋ถ€ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"react": "^ 16.3.0-alpha.1",
"๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ": "0.54.4",
"socket.io": "^ 2.1.1",
"socket.io-client": "^ 2.1.1",

์˜๊ตฌ์  ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฑธ ๋Œ์•„๋ณผ ๋ฐฉ๋ฒ•์ด ์—†๋‚˜์š”?

react-native 0.57์—์„œ์ด ๊ฒฝ๊ณ ๊ฐ€ ๊ณ„์† ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹ ์ด ๋ฌธ์ œ๊ฐ€ ์—ด๋ ค ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๊ฑฐ์˜ 1 ๋…„ ๋™์•ˆ React Native๋Š” ์—ฌ์ „ํžˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค !!!

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋™์ผํ•œ ๊ฒฝ๊ณ ๊ฐ€ 3 ~ 4 ํšŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์†”๋ฃจ์…˜์œผ๋กœ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ์ œ๊ฑฐ https://stackoverflow.com/a/48778011/7427111

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dhavaljardosh ๋„ค, ๋‹น์‹ ์˜ ์ถ”์ธก์ด ๋งž์Šต๋‹ˆ๋‹ค.

Java ๋ฐ Objective C๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ํƒ€์ด๋จธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด๋ฉฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆจ ๊น๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ๊ธด ํƒ€์ด๋จธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํ„ฐ๋ฆฌ ๋“ฑ์— ์—ฌ์ „ํžˆ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์€ ํด๋ง ๊ธฐ๋Šฅ์ด ์ •๋ง๋กœ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ์ง€๋งŒ,์ด ๋ฌธ์ œ๋กœ ์ธํ•ด _some_ ๋ฐ˜ ๋นˆ๋„๋กœ ์‹คํ–‰ํ•˜๋ฉด๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ์ด์ œ ์•ฑ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ณ ์ด ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ”ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. YMMV.

Pusher๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ™์€ ๋ฌธ์ œ ...

60 ์ดˆ๋งˆ๋‹ค ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์„ฑ๋Šฅ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์•ฑ์„ ํ…Œ์ŠคํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ๋ถ„ ์ค‘ ์ผ๋ถ€๋Š” ๊ทธ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝํ—˜์„ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ ์˜ํ–ฅ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ?

์ตœ์‹  ๋ฒ„์ „๊ณผ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์–ด๋–ค ํ•ด๊ฒฐ์ฑ…?

๋‚˜๋„ ๊ทธ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์•ฑ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์€ firebase๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ๋ฟ์ž…๋‹ˆ๋‹ค.
์–ด๋–ค ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

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

์ด๊ฒƒ๋„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ setInterval์€ ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ? ์ด ๊ฒฝ๊ณ ๋Š”๋ฐ›์ง€ ์•Š์ง€๋งŒ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋…ธ๋ž€์ƒ‰ ๋ฉ”์‹œ์ง€๋Š” "... ์•ฑ์ด ํฌ ๊ทธ๋ผ์šด๋“œ์—์žˆ์„ ๋•Œ๋งŒ ํƒ€์ด๋จธ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.
ํƒ€์ด๋จธ ๋ชจ๋“ˆ์€ ๊นจ์–ด ์žˆ์ง€๋งŒ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์žˆ์„ ๋•Œ ํƒ€์ด๋จธ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌธ์ œ๋Š” ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์žˆ์„ ๋•Œ ํƒ€์ด๋จธ ๋ชจ๋“ˆ์„ ๊นจ์–ด์žˆ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์„ฑ๋Šฅ / ๋ฐฐํ„ฐ๋ฆฌ ํšจ๊ณผ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ ๊นŒ์š”?

@BerndWessels https://www.npmjs.com/package/react-native-firebase ์ด๊ฒƒ์„ ๋ณด์…จ์Šต๋‹ˆ๊นŒ? firebase๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‚ฌ์‹ค์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ, ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ „ํ™˜ํ•˜๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๋‚ด ๋ง์€, ๊ทธ๊ฒƒ์€๋ณ„๋กœ ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

์ตœ์‹  RN0.59์˜ Pusher์™€ ๋™์ผํ•œ ๋ฌธ์ œ์ด๋ฉฐ UI๊ฐ€ ๋ช‡ ์ดˆ ๋™์•ˆ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...

firebase์˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ๋งŒ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

await firebase.database().ref('users/' + id).set(data);

RN 0.57.1

0.59๋กœ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@swushi RN 0.59 ์—์„œ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info. (Saw setTimeout with duration 111862ms)

์ด ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ• ...

๋ˆ„๊ตฌ๋“ ์ง€ ์ˆจ๊ธฐ์ง€ ์•Š๊ณ ์ด ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ ??
react-native-firebase๊ฐ€ ์•„๋‹Œ firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ณ  ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์—์„œ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ •๋ง ๊ฑฑ์ •์ด ๋ผ์„œ ๋ˆ„๊ตฐ๊ฐ€ ์ œ๋ฐœ ๋„์™€ ์ฃผ๋ฉด ...

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด (ํ˜„์žฌ) ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/firebase/firebase-js-sdk/issues/97#issuecomment -427512040 ์ฐธ์กฐ

fixtimerbug.js

/////////////////////////////////////////////////////////////////////////////
////// temporary fix to bug about 'Setting a timer' /////////////////////////
////// See: https://github.com/pusher/pusher-js/issues/248 //////////////////
////// See: https://github.com/facebook/react-native/issues/12981 ///////////
////// See: https://github.com/firebase/firebase-js-sdk/issues/97 ///////////
/////////////////////////////////////////////////////////////////////////////
import { Platform, InteractionManager } from 'react-native';
const _setTimeout = global.setTimeout;
const _clearTimeout = global.clearTimeout;
const MAX_TIMER_DURATION_MS = 60 * 1000;
if (Platform.OS === 'android') {
  const timerFix = {};
  const runTask = (id, fn, ttl, args) => {
    const waitingTime = ttl - Date.now();
    if (waitingTime <= 1) {
      InteractionManager.runAfterInteractions(() => {
        if (!timerFix[id]) {
          return;
        }
        delete timerFix[id];
        fn(...args);
      });
      return;
    }
    const afterTime = Math.min(waitingTime, MAX_TIMER_DURATION_MS);
    timerFix[id] = _setTimeout(() => runTask(id, fn, ttl, args), afterTime);
  };
  global.setTimeout = (fn, time, ...args) => {
    if (MAX_TIMER_DURATION_MS < time) {
      const ttl = Date.now() + time;
      const id = '_lt_' + Object.keys(timerFix).length;
      runTask(id, fn, ttl, args);
      return id;
    }
    return _setTimeout(fn, time, ...args);
  };
  global.clearTimeout = id => {
    if (typeof id === 'string' && id.startsWith('_lt_')) {
      _clearTimeout(timerFix[id]);
      delete timerFix[id];
      return;
    }
    _clearTimeout(id);
  };
}
/////////////////////////////////////////////////////////////////////////////

@cpmech
๋…๋ฆฝ์  ์ธ .js ํŒŒ์ผ์—์„œ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํƒ€์ด๋จธ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“œ๋Š” ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์œ„์˜ ์ฝ”๋“œ๋Š” 'fixtimerbug.js'๋ผ๋Š” ํŒŒ์ผ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ App.js์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

import './src/fixtimerbug'; // <<<<<<<<<<<<<<<<<<

import React from 'react';
import { Platform, View, StatusBar } from 'react-native';
import AppNavigator from './src/navigation/AppNavigator';
import Store from './src/model/Store';

const store = new Store();

const App = () => (
  <View style={{ flex: 1, backgroundColor: '#fff' }}>
    {Platform.OS === 'ios' && <StatusBar barStyle="default" />}
    <AppNavigator screenProps={{ store }} />
  </View>
);

export default App;

์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ?

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @cpmech

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋“œ (https://github.com/firebase/firebase-js-sdk/issues/97#issuecomment-427512040)๋Š” ๋‹จ์ˆœํžˆ setTimeout (์ „์—ญ) ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์žฅ๊ธฐ๊ฐ„ ์‚ฌ์šฉ.

์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ๊ธฐ๊ฐ„์ด MAX_TIMER_DURATION_MS ์ž„๊ณ„ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋กœ์ปฌ์ง€๋„ ( timerFix )์— id ๋ฅผ ์ €์žฅ ํ•œ ๋‹ค์Œ ๊ธฐ๊ฐ„์„ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” runTask ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. runTask ๋Š” waitingTime ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋  ๋” ์ž‘์€ ์ฒญํฌ๋กœ ์‹œ๊ฐ„ ์ œํ•œ (์›๋ณธ _setTimeout )์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. waitingTime ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘ ์œผ๋ฉด ์›ํ™œํ•œ ์‹คํ–‰์„ ์œ„ํ•ด React Native์˜ runAfterInteractions ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์‹œ์— ๋กœ์ปฌ์ง€๋„์—์„œ id ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์‹œ _setTimeout ๋กœ ์ „ํ™”ํ•˜์ง€ ๋งˆ์„ธ์š”. afterTime ๋Š” _setTimeout ๋˜์–ด ์žฅ๊ธฐ๊ฐ„ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ์ง€์† ์‹œ๊ฐ„์ด ์ž„๊ณ„ ๊ฐ’ MAX_TIMER_DURATION_MS ๋ณด๋‹ค ์ž‘ ์œผ๋ฉด ์ „์—ญ setTimeout ( _setTimeout ์ €์žฅ ๋จ)์„ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ „์—ญ clearTimeout ๋„ ๋กœ์ปฌ ๋งต์—์„œ id ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ •๋ฆฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉด .. ๋‹น๋ถ„๊ฐ„ ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ฒจ์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
componentDidMount() { console.disableYellowBox = true; ... }

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋“œ (์—ฌ๊ธฐ์—์„œ : firebase / firebase-js-sdk # 97 (comment) )๋Š” ๋‹จ์ˆœํžˆ setTimeout (global) ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์žฅ๊ธฐ๊ฐ„ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ๊ธฐ๊ฐ„์ด MAX_TIMER_DURATION_MS ์ž„๊ณ„ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋กœ์ปฌ์ง€๋„ ( timerFix )์— id ๋ฅผ ์ €์žฅ ํ•œ ๋‹ค์Œ ๊ธฐ๊ฐ„์„ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” runTask ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. runTask ๋Š” waitingTime ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋  ๋” ์ž‘์€ ์ฒญํฌ๋กœ ์‹œ๊ฐ„ ์ œํ•œ (์›๋ณธ _setTimeout )์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. waitingTime ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘ ์œผ๋ฉด ์›ํ™œํ•œ ์‹คํ–‰์„ ์œ„ํ•ด React Native์˜ runAfterInteractions ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์‹œ์— ๋กœ์ปฌ์ง€๋„์—์„œ id ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์‹œ _setTimeout ๋กœ ์ „ํ™”ํ•˜์ง€ ๋งˆ์„ธ์š”. afterTime ๋Š” _setTimeout ๋˜์–ด ์žฅ๊ธฐ๊ฐ„ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ์ง€์† ์‹œ๊ฐ„์ด ์ž„๊ณ„ ๊ฐ’ MAX_TIMER_DURATION_MS ๋ณด๋‹ค ์ž‘ ์œผ๋ฉด ์ „์—ญ setTimeout ( _setTimeout ์ €์žฅ ๋จ)์„ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ „์—ญ clearTimeout ๋„ ๋กœ์ปฌ ๋งต์—์„œ id ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ •๋ฆฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ •๋ง ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค! ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋“œ (์—ฌ๊ธฐ์—์„œ : firebase / firebase-js-sdk # 97 (comment) )๋Š” ๋‹จ์ˆœํžˆ setTimeout (global) ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์žฅ๊ธฐ๊ฐ„ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ๊ธฐ๊ฐ„์ด MAX_TIMER_DURATION_MS ์ž„๊ณ„ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋กœ์ปฌ์ง€๋„ ( timerFix )์— id ๋ฅผ ์ €์žฅ ํ•œ ๋‹ค์Œ ๊ธฐ๊ฐ„์„ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” runTask ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. runTask ๋Š” waitingTime ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋  ๋” ์ž‘์€ ์ฒญํฌ๋กœ ์‹œ๊ฐ„ ์ œํ•œ (์›๋ณธ _setTimeout )์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. waitingTime ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘ ์œผ๋ฉด ์›ํ™œํ•œ ์‹คํ–‰์„ ์œ„ํ•ด React Native์˜ runAfterInteractions ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์‹œ์— ๋กœ์ปฌ์ง€๋„์—์„œ id ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์‹œ _setTimeout ๋กœ ์ „ํ™”ํ•˜์ง€ ๋งˆ์„ธ์š”. afterTime ๋Š” _setTimeout ๋˜์–ด ์žฅ๊ธฐ๊ฐ„ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ์ง€์† ์‹œ๊ฐ„์ด ์ž„๊ณ„ ๊ฐ’ MAX_TIMER_DURATION_MS ๋ณด๋‹ค ์ž‘ ์œผ๋ฉด ์ „์—ญ setTimeout ( _setTimeout ์ €์žฅ ๋จ)์„ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ „์—ญ clearTimeout ๋„ ๋กœ์ปฌ ๋งต์—์„œ id ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ •๋ฆฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋“œ (์—ฌ๊ธฐ์—์„œ : firebase / firebase-js-sdk # 97 (comment) )๋Š” ๋‹จ์ˆœํžˆ setTimeout (global) ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์žฅ๊ธฐ๊ฐ„ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ๊ธฐ๊ฐ„์ด MAX_TIMER_DURATION_MS ์ž„๊ณ„ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋กœ์ปฌ์ง€๋„ ( timerFix )์— id ๋ฅผ ์ €์žฅ ํ•œ ๋‹ค์Œ ๊ธฐ๊ฐ„์„ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” runTask ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. runTask ๋Š” waitingTime ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋  ๋” ์ž‘์€ ์ฒญํฌ๋กœ ์‹œ๊ฐ„ ์ œํ•œ (์›๋ณธ _setTimeout )์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. waitingTime ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘ ์œผ๋ฉด ์›ํ™œํ•œ ์‹คํ–‰์„ ์œ„ํ•ด React Native์˜ runAfterInteractions ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์‹œ์— ๋กœ์ปฌ์ง€๋„์—์„œ id ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์‹œ _setTimeout ๋กœ ์ „ํ™”ํ•˜์ง€ ๋งˆ์„ธ์š”. afterTime ๋Š” _setTimeout ๋˜์–ด ์žฅ๊ธฐ๊ฐ„ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ์ง€์† ์‹œ๊ฐ„์ด ์ž„๊ณ„ ๊ฐ’ MAX_TIMER_DURATION_MS ๋ณด๋‹ค ์ž‘ ์œผ๋ฉด ์ „์—ญ setTimeout ( _setTimeout ์ €์žฅ ๋จ)์„ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ „์—ญ clearTimeout ๋„ ๋กœ์ปฌ ๋งต์—์„œ id ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ •๋ฆฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋“œ (์—ฌ๊ธฐ์—์„œ : firebase / firebase-js-sdk # 97 (comment) )๋Š” ๋‹จ์ˆœํžˆ setTimeout (global) ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์žฅ๊ธฐ๊ฐ„ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค.
์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ๊ธฐ๊ฐ„์ด MAX_TIMER_DURATION_MS ์ž„๊ณ„ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋กœ์ปฌ์ง€๋„ ( timerFix )์— id ๋ฅผ ์ €์žฅ ํ•œ ๋‹ค์Œ ๊ธฐ๊ฐ„์„ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” runTask ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. runTask ๋Š” waitingTime ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋  ๋” ์ž‘์€ ์ฒญํฌ๋กœ ์‹œ๊ฐ„ ์ œํ•œ (์›๋ณธ _setTimeout )์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. waitingTime ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘ ์œผ๋ฉด ์›ํ™œํ•œ ์‹คํ–‰์„ ์œ„ํ•ด React Native์˜ runAfterInteractions ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์‹œ์— ๋กœ์ปฌ์ง€๋„์—์„œ id ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์‹œ _setTimeout ๋กœ ์ „ํ™”ํ•˜์ง€ ๋งˆ์„ธ์š”. afterTime ๋Š” _setTimeout ๋˜์–ด ์žฅ๊ธฐ๊ฐ„ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ์ง€์† ์‹œ๊ฐ„์ด ์ž„๊ณ„ ๊ฐ’ MAX_TIMER_DURATION_MS ๋ณด๋‹ค ์ž‘ ์œผ๋ฉด ์ „์—ญ setTimeout ( _setTimeout ์ €์žฅ ๋จ)์„ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ „์—ญ clearTimeout ๋„ ๋กœ์ปฌ ๋งต์—์„œ id ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ •๋ฆฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค.
๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋“œ (์—ฌ๊ธฐ์—์„œ : firebase / firebase-js-sdk # 97 (comment) )๋Š” ๋‹จ์ˆœํžˆ setTimeout (global) ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์žฅ๊ธฐ๊ฐ„ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค.
์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ๊ธฐ๊ฐ„์ด MAX_TIMER_DURATION_MS ์ž„๊ณ„ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋กœ์ปฌ์ง€๋„ ( timerFix )์— id ๋ฅผ ์ €์žฅ ํ•œ ๋‹ค์Œ ๊ธฐ๊ฐ„์„ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” runTask ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. runTask ๋Š” waitingTime ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋  ๋” ์ž‘์€ ์ฒญํฌ๋กœ ์‹œ๊ฐ„ ์ œํ•œ (์›๋ณธ _setTimeout )์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. waitingTime ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘ ์œผ๋ฉด ์›ํ™œํ•œ ์‹คํ–‰์„ ์œ„ํ•ด React Native์˜ runAfterInteractions ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์‹œ์— ๋กœ์ปฌ์ง€๋„์—์„œ id ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์‹œ _setTimeout ๋กœ ์ „ํ™”ํ•˜์ง€ ๋งˆ์„ธ์š”. afterTime ๋Š” _setTimeout ๋˜์–ด ์žฅ๊ธฐ๊ฐ„ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆ˜์ • ๋œ global.setTimeout ํ•จ์ˆ˜์—์„œ ์ง€์† ์‹œ๊ฐ„์ด ์ž„๊ณ„ ๊ฐ’ MAX_TIMER_DURATION_MS ๋ณด๋‹ค ์ž‘ ์œผ๋ฉด ์ „์—ญ setTimeout ( _setTimeout ์ €์žฅ ๋จ)์„ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ „์—ญ clearTimeout ๋„ ๋กœ์ปฌ ๋งต์—์„œ id ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ •๋ฆฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค.
๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ์„ฑ๋Šฅ์— ์ „ํ˜€ ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋Œ€ํ•œ ๋น ๋ฅธ ๋ฉ”๋ชจ

์‹ ๊ฒฝ ์“ฐ์ด๋Š” ๊ฒฝ์šฐ console.ignoredYellowBox = [ 'ํƒ€์ด๋จธ ์„ค์ •'];

๊ณผ

๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉด .. ๋‹น๋ถ„๊ฐ„ ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ฒจ์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
componentDidMount () {console.disableYellowBox = true; ...}

์ด๊ฒƒ์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ? ์˜ค๋ฅ˜ ๊ตฌ๋ฌธ ๋ถ„์„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฐœ์ƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Firebase ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋งŽ์€ ์˜ค๋ฅ˜๊ฐ€ ์ˆจ๊ฒจ ์ง€์ง€๋งŒ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ ์ ˆํ•œ ์‚ฌ๋ก€ : ๋‚ด ์—‘์Šคํฌ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ชจ๋“  ํƒ€์ด๋จธ ์˜ค๋ฅ˜๋ฅผ ์†Œ์Šค ๋งคํ•‘ํ•˜๋ ค๊ณ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์† ์ถฉ๋Œํ–ˆ์Šต๋‹ˆ๋‹ค.

React Native๊ฐ€ ํ•ต์‹ฌ์— AlarmManager์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค. ํƒ€์‚ฌ ๋ชจ๋“ˆ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@cpmech ์˜ ์†”๋ฃจ์…˜์ด ์•„์ง ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? RN60.4์—์„œ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„์ง ๊ธด ํƒ€์ด๋จธ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋จผ์ € ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์Œ ํŒŒ์ผ์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. libraries / Core / Timers / JSTimer; js
๊ทธ๊ฒƒ์„ ์—ด๋ฉด์ด const MAX_TIMER_DURATION_MS๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ง€์† ์‹œ๊ฐ„ ์ด์ƒ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ๊ฒฝ๊ณ ๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค!

ํƒ€์ด๋จธ๋ฅผ ๋Š˜๋ฆฌ์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ?

@dulmandakh ๋‹น์‹ ์ด ์•Œ๊ณ ์žˆ๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@dulmandakh ๋‹น์‹ ์ด ์•Œ๊ณ ์žˆ๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

RNFirebase ์ผ๊นŒ์š”? ๋ฟก ๋นต๋€จ

๋งŒ๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ณ ์ • ๋œ ์‹œ๊ฐ„์œผ๋กœ ํƒ€์ด๋จธ๋ฅผ ๋‹ค์‹œ ์˜ˆ์•ฝ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const setLogoutTimer = expirationTime => {

  return dispatch => {
    timer = setTimeout(() => {
        if (expirationTime>60000)
        {
            console.log(`set new exp:${expirationTime-60000}`);
            dispatch(setLogoutTimer(expirationTime-60000));
        }
        else
        {
            console.log('logout');
            dispatch(logout());
        }
    }, 60000); 
  };
};

2 ๋…„์ด ์ง€๋‚˜์„œ react-native ๋˜๋Š” firebase๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :(

๋ช‡ ์‹œ๊ฐ„์˜ ๊ธด ์กฐ์‚ฌ ๋์— ๋‚ด๊ฐ€ ์•Œ๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋“  ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.
์–ธ์ œ ๋‚˜ํƒ€ ๋‚ฌ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
firestore์— ์ „ํ™”ํ•˜์ž๋งˆ์ž ํŒ์—… ๋˜๋‚˜์š”?
๋‚ด ์•ฑ์—์„œ ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@luismasg ๋‚˜์œ ์Šต๊ด€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์ฝ”๋“œ์—์„œ setTimeout์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ์˜ค๋ฅ˜์˜ ์›์ธ์„ ์•Œ๊ณ  ๋ฉˆ์ถœ ์ˆ˜ ์—†์œผ๋ฉฐ ๋ถ„๋ช…ํžˆ ๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์›๊ฒฉ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜์—ฌ ๋‚˜์˜จ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ TTL์„ ์œ ์ง€ํ•˜๊ธฐ์œ„ํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ, ์ข…์†์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™•์ธ ๋ฐ ๋ฌธ์ œ์˜ ์›์ธ์„ ์‹๋ณ„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ

์†”์งํžˆ, JS ํƒ€์ด๋จธ / ๊ฐ„๊ฒฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด์จŒ๋“  ๊ธด ํƒ€์ด๋จธ์— ๋Œ€ํ•ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  ์ˆ˜๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์งง์€ ํƒ€์ด๋จธ๋ฅผ ์ถ”๊ฐ€ / ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํฌ ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค (Android) ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… (iOS)๊ณผ ํ•จ๊ป˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์†”์งํžˆ, JS ํƒ€์ด๋จธ / ๊ฐ„๊ฒฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด์จŒ๋“  ๊ธด ํƒ€์ด๋จธ์— ๋Œ€ํ•ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋” ๊ธด ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์–ด๋ ค์›€์„ ๊ฒช์Šต๋‹ˆ๋‹ค. "Firebase๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"๋Š” ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์ข…์ข… ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋ฉฐ,์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ๊ถ๊ทน์  ์ธ ๋ชฉํ‘œ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š” react-native ์˜ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” "Firebase๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค"๊ฐ€ ๋Œ€๋‹ต์ด๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๊ธด ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก firebase๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๊ธด ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์— ์ ์ ˆํ•œ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค."

๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค. RN์ด ์–ด๋–ป๊ฒŒ ๋“  ๊ธด ํƒ€์ด๋จธ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“ ์ฃผ์˜ ์‚ฌํ•ญ (๋†’์€ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ, ๋ถˆํ•„์š”ํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์‹œ๊ฐ„ ๋“ฑ)์„ ๊ณ ๋ คํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์Šค์Šค๋กœ๋ฅผ ์˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌด์—‡์ด๋“  ๋ณ„๋„์˜ ํƒ€์ด๋จธ / ๊ฐ„๊ฒฉ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์—‡์ด๋“  ๋ณ„๋„์˜ ํƒ€์ด๋จธ / ๊ฐ„๊ฒฉ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดํ•ด๋Š” ๊ทธ๋Ÿฌํ•œ ์›์‹œ์  ์š”์†Œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜„

ํƒ€์ด๋จธ ๋‚ด๋ถ€์˜ ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

@dulmandakh ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ฌธ์ œ๊ฐ€ ์ง€์†๋˜๊ณ  ํ† ๋ก ์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์„ App.js์— ์ถ”๊ฐ€ํ–ˆ๊ณ  ์ด๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค (๊ณต์‹์ ์ธ ์ˆ˜์ •์ด์žˆ์„ ๋•Œ๊นŒ์ง€ ์ผ์‹œ์ ์œผ๋กœ)

const _setTimeout = global.setTimeout;
const _clearTimeout = global.clearTimeout;
const MAX_TIMER_DURATION_MS = 60 * 1000;
if (Platform.OS === "android") {
  // Work around issue `Setting a timer for long time`
  // see: https://github.com/firebase/firebase-js-sdk/issues/97
  const timerFix = {};
  const runTask = (id, fn, ttl, args) => {
    const waitingTime = ttl - Date.now();
    if (waitingTime <= 1) {
      InteractionManager.runAfterInteractions(() => {
        if (!timerFix[id]) {
          return;
        }
        delete timerFix[id];
        fn(...args);
      });
      return;
    }

    const afterTime = Math.min(waitingTime, MAX_TIMER_DURATION_MS);
    timerFix[id] = _setTimeout(() => runTask(id, fn, ttl, args), afterTime);
  };

  global.setTimeout = (fn, time, ...args) => {
    if (MAX_TIMER_DURATION_MS < time) {
      const ttl = Date.now() + time;
      const id = "_lt_" + Object.keys(timerFix).length;
      runTask(id, fn, ttl, args);
      return id;
    }
    return _setTimeout(fn, time, ...args);
  };

  global.clearTimeout = id => {
    if (typeof id === "string" && id.startWith("_lt_")) {
      _clearTimeout(timerFix[id]);
      delete timerFix[id];
      return;
    }
    _clearTimeout(id);
  };
}

์ด๊ฒƒ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ App.js์— ์ถ”๊ฐ€ํ–ˆ๊ณ  ์ด๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค (๊ณต์‹์ ์ธ ์ˆ˜์ •์ด์žˆ์„ ๋•Œ๊นŒ์ง€ ์ผ์‹œ์ ์œผ๋กœ)

...
    if (typeof id === "string" && id.startWith("_lt_")) {
...

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด 'startWith'๊ฐ€ 'startsWith'์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

AWS Amplify Datastore์—์„œ ์ด๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์ˆ˜์ • ๋Œ€์‹  ๊ฒฝ๊ณ ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

import { YellowBox } from 'react-native';
YellowBox.ignoreWarnings(['Setting a timer']);

๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๊ฐ€ RN์ด ๊ณ ์ณ์•ผํ•˜๋Š” ๊ฒƒ์ธ์ง€, Amplify๊ฐ€ ๊ณ ์ณ์•ผํ•˜๋Š” ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ํŒจ์น˜ํ•ด์•ผ ํ•  ๊ฒƒ์ธ์ง€๊ฐ€ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋‚˜๋Š” โ€‹โ€‹์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ท€์ฐฎ๋‹ค๋ฉด console.ignoredYellowBox = ['Setting a timer']; ๋งŒ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

์ด๊ฒƒ์„ ์–ด๋””์— ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ํ™”๋ฉด ํŒŒ์ผ๊ณผ ์ž‘์—… ํŒŒ์ผ์—์„œ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

App.js ํŒŒ์ผ ์–ด๋”˜๊ฐ€์— ๋„ฃ์œผ์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์„ฑ์ž์— ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์ด ์ตœ๊ณ ์˜ ์žฅ์†Œ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋” ์ž˜ ์•„๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

Firebase๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ (๋กœ๊ทธ์ธ / ๊ฐ€์ž…) ํ›„ ์•ฑ์˜ ์ง€์†์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

* ์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ๋ฉ๋‹ˆ๋‹ค.

https://firebase.google.com/docs/auth/web/auth-state-persistence

๊ทธ๋ž˜์„œ ... ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

firebase์˜ ๊ธฐ๋ณธ๊ฐ’์€ local ์ž…๋‹ˆ๋‹ค. "firebase.auth.Auth.Persistence.LOCAL"

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
firebase.auth.Auth.Persistence.SESSION
firebase.auth.Auth.Persistence.NONE

๋˜๋Š” localStorage ์‚ฌ์šฉ ...

๊ฒฐ์ •์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ๋•Œ๊นŒ์ง€ ...

"react-native"์—์„œ {YellowBox} ๊ฐ€์ ธ ์˜ค๊ธฐ;
"lodash"์—์„œ _ ๊ฐ€์ ธ ์˜ค๊ธฐ;
YellowBox.ignoreWarnings ([ "ํƒ€์ด๋จธ ์„ค์ •"]);
const _console = _.clone (์ฝ˜์†”);
console.warn = (๋ฉ”์‹œ์ง€) => {
if (message.indexOf ( "ํƒ€์ด๋จธ ์„ค์ •") <= -1) {
_console.warn (๋ฉ”์‹œ์ง€);
}
};

ํ•ด๊ฒฐ๋˜๋ฉด ์ •ํฌ ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ์งœ์ž”!

์ด๊ฒƒ์€ RxJS๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ 5200 ํƒ€์ด๋จธ๋ฅผ 5 * 1000 + 200 ํƒ€์ด๋จธ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.

import { of, range } from 'rxjs';
import {
  concatMap,
  delay,
  filter,
  mapTo,
  switchMap,
  tap,
} from 'rxjs/operators';

// ~ setTimeout(..., 5200);

const source = of(5200).pipe(
  switchMap(duration => {
    const times = Math.floor(duration / 1000); // = 5
    const remainder = duration % 1000; // = 200

    return range(1, times).pipe(
      concatMap(i => of(i).pipe(delay(1000))),
      tap(console.log),
      filter(i => i === times),
      delay(remainder),
      tap(console.log),
      mapTo('Done !'),
    );
  }),
);

source.subscribe(console.log);

1 // After 1s
2 // After 2s
3 // After 3s
4 // After 4s
5 // After 5s
5 // After 5s + 200 ms
'Done !'

Firebase๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ (๋กœ๊ทธ์ธ / ๊ฐ€์ž…) ํ›„ ์•ฑ์˜ ์ง€์†์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

* ์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ๋ฉ๋‹ˆ๋‹ค.

https://firebase.google.com/docs/auth/web/auth-state-persistence

๊ทธ๋ž˜์„œ ... ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

firebase์˜ ๊ธฐ๋ณธ๊ฐ’์€ local ์ž…๋‹ˆ๋‹ค. "firebase.auth.Auth.Persistence.LOCAL"

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
firebase.auth.Auth.Persistence.SESSION
firebase.auth.Auth.Persistence.NONE

๋˜๋Š” localStorage ์‚ฌ์šฉ ...

ํฐ! ๊ทธ๋ž˜๋„ Firestore๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

Firebase๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ (๋กœ๊ทธ์ธ / ๊ฐ€์ž…) ํ›„ ์•ฑ์˜ ์ง€์†์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
* ์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ๋ฉ๋‹ˆ๋‹ค.
https://firebase.google.com/docs/auth/web/auth-state-persistence
๊ทธ๋ž˜์„œ ... ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
firebase์˜ ๊ธฐ๋ณธ๊ฐ’์€ local ์ž…๋‹ˆ๋‹ค. "firebase.auth.Auth.Persistence.LOCAL"
๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
firebase.auth.Auth.Persistence.SESSION
firebase.auth.Auth.Persistence.NONE
๋˜๋Š” localStorage ์‚ฌ์šฉ ...

ํฐ! ๊ทธ๋ž˜๋„ Firestore๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ด์ „ Firebase SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ firestore ๊ด€๋ฆฌ์ž SDK๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค

https://firebase.google.com/docs/reference/admin

์•„์ง ์•„๋ฌด๋„์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. # ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ˆ˜์น˜์‹ฌ; p

์•„์ง ์•„๋ฌด๋„์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. # ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ˆ˜์น˜์‹ฌ; p

์˜คํ”ˆ ์†Œ์Šค ๊ธฐ์—ฌ์ž๋ฅผ ์ ˆ๋Œ€ ๋ถ€๋„๋Ÿฝ๊ฒŒํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์ด ์ˆ˜์ •๋˜์ง€ ์•Š์€ ๊ฒƒ์ด ์•„์‰ฝ์ง€๋งŒ ์†Œ์Šค๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•ˆ๋‹ค๋ฉด ํ’€ ์š”์ฒญ์— ๊ฐ์‚ฌ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์ง€๊ตฌ์ƒ์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๊ฒฐ ๋œ ์ด์œ ๋ฅผ ๋งํ•ด ์ค€๋‹ค.

๋ฌธ์ œ๊ฐ€๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ˆ˜์ •๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ตฌํ˜„ ๋ฐฉ์‹์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋“ค์€ ์ด๊ฒƒ์— ๋Œ€ํ•ด _ ์กฐ๊ธˆ _ ๋ถ€๋„๋Ÿฌ์›Œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

์—ฌ๋Ÿฌ๋ถ„, ๊ธด ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๋Š” ๋‹จ์ˆœํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด "ํ•ด๊ฒฐ"๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ / ์ด๋ฒคํŠธ์—์„œ ํƒ€์ด๋จธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ๋‘ ํ”Œ๋žซํผ ๋ชจ๋‘์—์„œ ํŠนํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@eightyfive ์˜ ์˜๊ฒฌ์— ๋”ฐ๋ผ rxjs6 delay , timeout & interval ํ•จ์ˆ˜๋ฅผ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ์งˆ๋ฌธ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž‘์€ ๊ฐ„๊ฒฉ์„ ์‚ฌ์šฉํ•  ๋•Œ "ํƒ€์ด๋จธ ๋ชจ๋“ˆ"์ด ์ž ๊ธด ์ƒํƒœ์ธ์ง€ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฑ์ด ํฌ ๊ทธ๋ผ์šด๋“œ์— ์žˆ์ง€ ์•Š์„ ๋•Œ ํƒ€์ด๋จธ๊ฐ€ ์ค‘์ง€๋˜๋„๋กํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ผ๊นŒ ์š”?

import { switchMap, concatMap, delay as nativeDelay, mapTo, filter, switchMapTo, repeat } from 'rxjs/operators'
import { range, of, race, throwError, TimeoutError } from 'rxjs'

const TIMER_INTERVAL = 1000
const reactNativeTimer = (duration) => {
  const times = Math.floor(duration / TIMER_INTERVAL)
  const remainder = duration % TIMER_INTERVAL
  if (times < 1) {
    return of(true).pipe(nativeDelay(remainder))
  }
  return range(1, times).pipe(
    concatMap(i => of(i).pipe(nativeDelay(TIMER_INTERVAL))),
    filter(i => i === times),
    nativeDelay(remainder)
  )
}

/**
 * React Native compatible version of delay pipe
 * <strong i="11">@param</strong> {number} duration in ms
 */
export const delay = (duration) => {
  return (source) => {
    return source.pipe(
      switchMap(next =>
        reactNativeTimer(duration).pipe(mapTo(next))
      )
    )
  }
}

/**
 * React Native compatible version of timeout pipe
 * <strong i="12">@param</strong> {number} duration in ms
 */
export const timeout = (duration) => {
  return (source) => {
    const timeoutTimer = reactNativeTimer(duration).pipe(
      switchMapTo(throwError(new TimeoutError()))
    )
    return race(source, timeoutTimer)
  }
}

/**
 * React Native compatible version of interval
 * <strong i="13">@param</strong> {number} duration in ms
 */
export const interval = (duration) => {
  return reactNativeTimer(duration).pipe(
    repeat()
  )
}

์žฌ๋ฏธ์žˆ๋Š” ์ ์€์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์ด์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋…ผ์˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ฒฝ๊ณ ์—์„œ์ด "๋ฌธ์ œ"๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜์—ˆ์„ ๋•Œ "๋ฐฉ๋ฒ•"์„ ์„ค๋ช…ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฌธ์„œ๋ฅผ ์ฐพ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  "์™œ?"์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ถ”๋ก .

ํ”„๋ŸฐํŠธ ์—”๋“œ # ๋ฐ€๋ ˆ ๋‹ˆ์–ผ

์ด #millenial์€ ๋‹ค์Œ์„ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ์˜ค๋ฅ˜๋Š” ๋ฌธ์„œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ž๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ธด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ์Šค๋ ˆ๋“œ๋Š” ์†Œ์œ ํ•˜์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜ˆ : firebase)์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋กœ ๊ฐ€๋“ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์Šค๋ ˆ๋“œ์˜ (์ƒ์‚ฐ์ ์ธ) ํ† ๋ก ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด๊ฒƒ์€ react-native ๋‚ด์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋” ๋ณต์žกํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ๋‚ด๊ฐ€ ๋‹ค์‹œ์ด ๋ฌธ์ œ๊ฐ€ ํ‘œ์‹œ๋˜์–ด, ํด๋กœ์šฐ์ฆˆ๋˜์ง€ ์•Š๋Š” ์ ์„ ์ง€์  ํ•  ๊ฒƒ์ด๋ผ๊ณ  known-issue ๋ฐ Help Wanted .

๋ฐ€๋ ˆ ๋‹ˆ์–ผ์— ๋Œ€ํ•œ ๋ฐ€๋ ˆ ๋‹ˆ์–ผ ๋‹ต๋ณ€ :)

์ด ์˜ค๋ฅ˜๋Š” ๋ฌธ์„œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ž๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ธด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฒฝ๊ณ ์ž…๋‹ˆ๋‹ค (์ฐจ์ด์— ๋Œ€ํ•ด ๋ฌป์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊นŠ์€ ์ฒ ํ•™์  ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. :)
  • ์ด ํ‹ฐ์ผ“์— ๋Œ€ํ•œ ์ œ๊ณต๋œ ์ฐธ์กฐ๋กœ ์ธํ•ด ์ด๋ฏธ ๋ฌธ์„œํ™” ๋œ ์ฒ™ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์—์„œ ์š”์•ฝ ๋Œ€์‹  ๋งŽ์€ ์˜๊ฒฌ์„ ์ฝ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ด๋ฏธ ์ œ์•ˆํ•œ ์•Œ๋ ค์ง„ ๋ฌธ์ œ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค).
    image
  • ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ '์ž๊ธฐ ์„ค๋ช… ์ '์ด๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์ œ๊ณต๋œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์„ค๋ช…์—๋Š” ๋‘ ๊ฐœ์˜ ๋ฌธ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ์ด ๋ฌธ์ œ๋Š” ์ข…๊ฒฐ๋˜์–ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ ์•Œ๋ ค์ง„ ๋ฌธ์ œ์ด๋ฉฐ ๋„์›€๋ง ๊ตฌํ•จ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์™„์ „ํžˆ ๋™์˜. ๊ฒฝ๊ณ ์˜ URL ์ฐธ์กฐ์—์„œ ์˜ค๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์‹œ๊ฐ„์„ ์ ˆ์•ฝ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

firebase / firestore ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ : Firestore ํ˜ธ์ถœ์— ์ง์ ‘ REST ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ์•„๊ฐ”์Šต๋‹ˆ๋‹ค. ์ธ์ฆ๊ณผ ํŒŒ์ด์–ด ์Šคํ† ์–ด ๋งŒ ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์Šค ๋‹ˆํŽซ :

https://stackoverflow.com/a/62446792

๋‹ค์Œ๊ณผ ๊ฐ™์ด App () ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

'react-native'์—์„œ {YellowBox} ๊ฐ€์ ธ ์˜ค๊ธฐ;
๋‚ด๋ณด๋‚ด๊ธฐ ๊ธฐ๋ณธ ํ•จ์ˆ˜ App () {
YellowBox.ignoreWarnings ([ 'ํƒ€์ด๋จธ ์„ค์ •']);
...
...
..
}

๊ธฐ์–ต

๋‚ด๊ฐ€ ํ•œ ์ผ์ด ๋‚˜์™€ ํ•จ๊ป˜ ์ผํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ข‹์€ ์Šต๊ด€์ธ์ง€ ์•„๋‹Œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ๋กœ ์ด๋™

node_modulesreact-nativeLibrariesCoreTimersJSTimers.js

const MAX_TIMER_DURATION_MS = 60 * 1000 ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ  ์‹œ๊ฐ„์„ 60 * 100000์œผ๋กœ ๋Š˜๋ ธ๊ณ  ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•,
์ด ๋ฌธ์ œ๋Š” ์•ฝ 3 ๋…„์ด ์ง€๋‚ฌ์œผ๋ฉฐ ์—ฌ์ „ํžˆ์ด ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.)
@RWOverdijk ๊ฐ€ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๊ณ  ๋งํ–ˆ๋“ฏ์ด.
๋‚ด๊ฐ€ ๋†“์นœ ์†”๋ฃจ์…˜์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค <3

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

React Native์—์„œ Android์—์„œ ํƒ€์ด๋จธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹

React Native์—๋Š” setTimeout ์™€ ๊ฐ™์€ JS ํƒ€์ด๋จธ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. Android์—์„œ ์ž‘๋™ ๋ฐฉ์‹์€ JS ํƒ€์ด๋จธ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์ธก์—์„œ ์ถ”์ ๋˜๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ์ธก์—์„œ ์ด๋Ÿฌํ•œ ํƒ€์ด๋จธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ• ์‹œ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด React Native๋Š” ํƒ€์ด๋จธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š”์‹œ๊ธฐ, ํŠนํžˆ ํƒ€์ด๋จธ๊ฐ€ ์•ฑ ์ˆ˜๋ช…์ฃผ๊ธฐ ๋ฐ ๋ Œ๋”๋ง๊ณผ ๊ด€๋ จ๋˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋” ๋˜‘๋˜‘ํ•ด์ง‘๋‹ˆ๋‹ค.

๊ธด ๊ฐ„๊ฒฉ์œผ๋กœ ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

๋‹ค์Œ์€ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์•ฝ๊ฐ„ ํ…Œ์ŠคํŠธํ•˜์—ฌ ์–ป์€ ์ดํ•ด์ž…๋‹ˆ๋‹ค.

  1. ๊ธด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ํƒ€์ด๋จธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋Š” ๋™์•ˆ ์•ฑ์ด ์—ด๋ ค ์žˆ์œผ๋ฉด ํƒ€์ด๋จธ๊ฐ€ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ธด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ํƒ€์ด๋จธ๊ฐ€ ๋๋‚˜๊ธฐ ์ „์— ์ „ํ™”๊ธฐ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ๋‹ค์Œ์— ์•ฑ์„ ์—ด ๋•Œ๊นŒ์ง€ ํƒ€์ด๋จธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ํ—ค๋“œ๋ฆฌ์Šค JS ์ž‘์—…์—๋Š” ์˜ˆ์™ธ๊ฐ€ ์žˆ์œผ๋ฉฐ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋”๋ผ๋„ ํƒ€์ด๋จธ๊ฐ€ ๊ณ„์† ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธด ๊ฐ„๊ฒฉ์œผ๋กœ ํƒ€์ด๋จธ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

๋‚˜์ค‘์— ์•ฑ์ด ๋‹ค์‹œ ํฌ ๊ทธ๋ผ์šด๋“œ ๋  ๋•Œ ํƒ€์ด๋จธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋„๋กํ•ด๋„ ์ƒ๊ด€ ์—†๋‹ค๋ฉด YellowBox ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์—, ํƒ€์ด๋จธ๊ฐ€ ์„ธ์…˜์˜ ์ˆ˜๋ช… ๋™์•ˆ ํ˜ธ์ถœ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  ํฌ ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์‹œ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ๊ฒฝ์šฐ ํฌ ๊ทธ๋ผ์šด๋“œ์—์„œ ํƒ€์ด๋จธ๊ฐ€ ๋ฌด์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ญ”๊ฐ€๋ฅผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ธด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๋Š” Socket.io ๋ฐ Firebase์™€ ๊ฐ™์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?

์ด๋Ÿฌํ•œ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ์œ„์˜ ์งˆ๋ฌธ์œผ๋กœ ๊ท€๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌ ๊ทธ๋ผ์šด๋“œ์—์„œ ํ•ด๊ฒฐ๋˜๋Š” ํƒ€์ด๋จธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ์ผ๋ถ€ ์˜๊ฒฌ์€ Firebase์—์„œ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ React Native๋ฅผ ์—ผ๋‘์—๋‘๊ณ  ํŠน๋ณ„ํžˆ ๊ฐœ๋ฐœ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜๋ฉด ๋” ๋‚˜์€ ์„œ๋น„์Šค๋ฅผ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌ ๊ทธ๋ผ์šด๋“œ์—์„œ ํƒ€์ด๋จธ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๋ฌธ์ œ๊ฐ€์—†๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

setTimeout ์ด ์ฒ˜์Œ์— ์ œ์•ˆ ๋œ๋Œ€๋กœ AlarmManager ํ†ต๊ณผ ํ•  ์ˆ˜์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

AlarmManager ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์žˆ๋Š” ๊ฒฝ์šฐ ์•ฑ์„ ๊นจ์šฐ๊ณ  setTimeout ์™€ ๊ฐ™์€ ํƒ€์ด๋จธ๊ฐ€ ์•ฑ์„ ๊นจ์›Œ ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธด ํƒ€์ด๋จธ์˜ ๋Œ€๋ถ€๋ถ„์€ ์‹œ๊ฐ„ ์ œํ•œ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์œผ๋กœ ์„ค์ •๋˜๋ฉฐ ์•ฑ์ด ์—ด๋ ค์žˆ๋Š” ๋™์•ˆ์— ๋งŒ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ฑ์„ ๊นจ์šฐ๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋™์‹œ์—, ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ์•„๋งˆ๋„ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ•„์š”๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. setTimeout ๊ฑฐ์น˜์ง€ ์•Š๋Š” API๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ Lean Core ๋…ธ๋ ฅ์œผ๋กœ ์ธํ•ด ์‹ค์ œ๋กœ React Native์˜ API ํ‘œ๋ฉด์ด ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋„๋ก ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ react-native-background-timer ์™€ ๊ฐ™์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ€์žฅ ์ž˜ ์ฒ˜๋ฆฌ๋˜๋Š” ์ž‘์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ setTimeout ์˜ ์ •ํ™•์„ฑ์— ์˜์กดํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๋Š”์ด ์ •ํ™•์„ฑ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์—†์Œ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๊ณ ๊ฐ€ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ค‘์š”ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ณ„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งก๊ธฐ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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