๋ช ๋ถ ๋์ ํ์ด๋จธ๋ฅผ ์ค์ ํ๋ ๊ฒ์ Android์ React Native์์ ์ ๋๋ก ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค. ํ์ด๋จธ๊ฐ ๊บผ์ ธ ์ผ ํ ๋ ๊นจ์ด๋๋ ์์คํ ์ ์์กดํ๋ ๋์ Timing ๋ชจ๋์ด ๊นจ์ด์๋ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
ํ๋ ์ ์ฝ๋ฐฑ์ ์ฌ์ฉํ์ฌ ํ์ด๋จธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋์ AlarmManager ๋ฐ Handler.postDelayed์ ์์ํ๋ ์ปท์คํ ์ค์ ์ ํ์ํด์ผํฉ๋๋ค.
๋๋จํ ๊ฐ์ !
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก 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
๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ํ์คํ์ง ์์ต๋๋ค. ๋ค์์ ๋ฌธ์ ์ ์คํฌ๋ฆฐ ์ท์
๋๋ค. (์ฑ์ ์ ์๋ํ์ง๋ง์ด ๊ฒฝ๊ณ ๊ฐ ๋ํ๋ฉ๋๋ค. ๋จ์ํ ๋ฌด์ํด์ผํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.) ๋๋ ๋ด๊ฐ ์ฌ๊ธฐ์ ๋ญ๊ฐ ์๋ชปํ๊ณ ์์ ์๋ ์์ต๋๋ค. ๋์์ด ํ์ํฉ๋๋ค. ๊ณ ๋ง์ต๋๋ค.
์ผ, ๊ฒฝ๊ณ ๋ 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
์๊ฐ์ ๋ค์ ์๋จ์.
setTimeout
๋ฅผ ์
๋ฐ์ดํธํ์ฌ ๋ถ๋น setInterval
๋ฅผ ์์ํ์ญ์์ค.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)
๋ด ํจํค์ง ์ธ๋ถ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๊ตฌ์ ์ธ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
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๋ก ๋ง์ด๊ทธ๋ ์ด์ ํฉ๋๋ค.
๋๋ถ๋ถ์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค
์์ง ์๋ฌด๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. # ๊ฐ๋ฐ์์๊ฒ ์์น์ฌ; 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์ ๋ค์์ ์ง์ ํฉ๋๋ค.
react-native
๋ด์์ ํด๊ฒฐํด์ผ ํ ๋ ๋ณต์กํ ๋ฌธ์ ์
๋๋ค.๊ทธ๊ฒ ๋ด๊ฐ ๋ค์์ด ๋ฌธ์ ๊ฐ ํ์๋์ด, ํด๋ก์ฐ์ฆ๋์ง ์๋ ์ ์ ์ง์ ํ ๊ฒ์ด๋ผ๊ณ known-issue
๋ฐ Help Wanted
.
๋ฐ๋ ๋์ผ์ ๋ํ ๋ฐ๋ ๋์ผ ๋ต๋ณ :)
์ด ์ค๋ฅ๋ ๋ฌธ์๊ฐ ํ์ํ์ง ์์ผ๋ฉฐ ์๋ช ํฉ๋๋ค. ๊ธด ํ์ด๋จธ๋ฅผ ์ค์ ํ์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง์ด ๋ฌธ์ ๋ ์ข ๊ฒฐ๋์ด์๋ ์๋๋ฉฐ ์๋ ค์ง ๋ฌธ์ ์ด๋ฉฐ ๋์๋ง ๊ตฌํจ์ผ๋ก ํ์๋ฉ๋๋ค.
์์ ํ ๋์. ๊ฒฝ๊ณ ์ URL ์ฐธ์กฐ์์ ์ค๋ ๋ง์ ์ฌ๋๋ค์ ์๊ฐ์ ์ ์ฝ ํ ์ ์์ต๋๋ค.
firebase / firestore ์ฌ์ฉ์์ ๊ฒฝ์ฐ : Firestore ํธ์ถ์ ์ง์ REST ์๋ ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋์๊ฐ์ต๋๋ค. ์ธ์ฆ๊ณผ ํ์ด์ด ์คํ ์ด ๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ค ๋ํซ :
๋ค์๊ณผ ๊ฐ์ด 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์๋ setTimeout
์ ๊ฐ์ JS ํ์ด๋จธ์ ์ฌ์ฉ์ ์ ์ ๊ตฌํ์ด ์์ต๋๋ค. Android์์ ์๋ ๋ฐฉ์์ JS ํ์ด๋จธ๊ฐ ๋ค์ดํฐ๋ธ ์ธก์์ ์ถ์ ๋๊ณ ๋ค์ดํฐ๋ธ ์ธก์์ ์ด๋ฌํ ํ์ด๋จธ๋ฅผ ํธ๋ฆฌ๊ฑฐ ํ ์๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ํตํด React Native๋ ํ์ด๋จธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋์๊ธฐ, ํนํ ํ์ด๋จธ๊ฐ ์ฑ ์๋ช
์ฃผ๊ธฐ ๋ฐ ๋ ๋๋ง๊ณผ ๊ด๋ จ๋๋ ๋ฐฉ์์ ๋ํด ๋ ๋๋ํด์ง๋๋ค.
๋ค์์ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ฝ๊ฐ ํ ์คํธํ์ฌ ์ป์ ์ดํด์ ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ฃผ๋ก ์ ํ์ฑ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ฉฐ ์ฑ๋ฅ์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. ๋ฌธ์ ๋ ์ฌ์ฉ์๊ฐ ์ฑ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธด ํ์ด๋จธ์ ์์กด ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋์ค์ ์ฑ์ด ๋ค์ ํฌ ๊ทธ๋ผ์ด๋ ๋ ๋ ํ์ด๋จธ๊ฐ ํ์ฑํ๋๋๋กํด๋ ์๊ด ์๋ค๋ฉด YellowBox ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฐ๋ฉด์, ํ์ด๋จธ๊ฐ ์ธ์ ์ ์๋ช ๋์ ํธ์ถ ๋ ๊ฒ์ผ๋ก ์์ํ๊ณ ํฌ ๊ทธ๋ผ์ด๋์์ ๋ค์ ํธ๋ฆฌ๊ฑฐ๋์ง ์์์ผํ๋ ๊ฒฝ์ฐ ํฌ ๊ทธ๋ผ์ด๋์์ ํ์ด๋จธ๊ฐ ๋ฌด์๋๋์ง ํ์ธํ๊ธฐ ์ํด ๋ญ๊ฐ๋ฅผํด์ผํฉ๋๋ค.
์ด๋ฌํ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ชจ๋ฆ ๋๋ค. ๊ถ๊ทน์ ์ผ๋ก ์์ ์ง๋ฌธ์ผ๋ก ๊ท๊ฒฐ๋ฉ๋๋ค. ์ด๋ฌํ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌ ๊ทธ๋ผ์ด๋์์ ํด๊ฒฐ๋๋ ํ์ด๋จธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ฌธ์ ๊ฐ์๋ ๊ฒฝ์ฐ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ ์ผ๋ถ ์๊ฒฌ์ Firebase์์์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ํ์ง๋ง ๊ถ๊ทน์ ์ผ๋ก React Native๋ฅผ ์ผ๋์๋๊ณ ํน๋ณํ ๊ฐ๋ฐ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ๋ฉด ๋ ๋์ ์๋น์ค๋ฅผ๋ฐ์ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌ ๊ทธ๋ผ์ด๋์์ ํ์ด๋จธ๊ฐ ํด๊ฒฐ๋๋ ๋ฌธ์ ๊ฐ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.
setTimeout
์ด ์ฒ์์ ์ ์ ๋๋๋ก AlarmManager
ํต๊ณผ ํ ์์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?AlarmManager
์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ๊ฒฝ์ฐ ์ฑ์ ๊นจ์ฐ๊ณ setTimeout
์ ๊ฐ์ ํ์ด๋จธ๊ฐ ์ฑ์ ๊นจ์ ์ผํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ด๋ฌํ ๊ธด ํ์ด๋จธ์ ๋๋ถ๋ถ์ ์๊ฐ ์ ํ๊ณผ ๊ฐ์ ํญ๋ชฉ์ผ๋ก ์ค์ ๋๋ฉฐ ์ฑ์ด ์ด๋ ค์๋ ๋์์ ๋ง ๊ด๋ จ๋ฉ๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฑ์ ๊นจ์ฐ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ๊ฐ๋ฐ์๊ฐ ๋ช
์ ์ ์ผ๋ก ์ด๋ฌํ ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ์๋ง ์ํํด์ผํฉ๋๋ค.
๋์์, ๋ง์ ์ฌ๋๋ค์ ์๋ง๋ ์ด์ ๊ฐ์ ๊ฒ์ ํ์๋ก ํ ๊ฒ์
๋๋ค. setTimeout
๊ฑฐ์น์ง ์๋ API๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ Lean Core ๋
ธ๋ ฅ์ผ๋ก ์ธํด ์ค์ ๋ก React Native์ API ํ๋ฉด์ด ์ฆ๊ฐํ์ง ์๋๋ก ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ react-native-background-timer
์ ๊ฐ์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ฅ ์ ์ฒ๋ฆฌ๋๋ ์์
์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์๋ค์ด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์๊ณ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๊ตฐ๊ฐ setTimeout
์ ์ ํ์ฑ์ ์์กดํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๋์ด ์ ํ์ฑ์ ๋ณด์ฅ ํ ์ ์์์ ์๊ณ ์์ด์ผํฉ๋๋ค. ์ด ๊ฒฝ๊ณ ๊ฐ ํน์ ์ฌ์ฉ ์ฌ๋ก์์ ์ค์ํ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ ๊ฐ๋ณ ๊ฐ๋ฐ์์๊ฒ ๋งก๊ธฐ๊ณ ์ถ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@ skv-headless ์๊ฒฌ์ด ์ ์๋์์ต๋๋ค. :)
์ ์๊ฐ์๋ ๋ฌธ์ ์ ๋ํ ํ๋๊ฐ ์ฌ๋ผ์ ธ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ ์์ฃผ ๋ํ๋๋ ๊ฒ์ ๋ณด์๊ณ ์ฌ๋๋ค์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๊ฒ ๋ง๋ญ๋๋ค. ๊ฒฝ๊ณ ์ ๋๋ค. ๊ทธ๋ค์ ๋น์ ์๊ฒ ๊ฒฝ๊ณ ํฉ๋๋ค. ๊ทธ๋ค์ ๋ฌด์ํ์ง ๋ง๊ณ ๋ฌด์ธ๊ฐ๋ฅผํ์ญ์์ค. ๋ชจ๋ ๊ฒฝ๊ณ ๊ฐ ๋ฌด์๋๊ณ ์ง์ ์ค๋จ ์๋ฆผ์ด ํ์๋๋ ์ฑ์ ๋ณด์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฑ์ด ์ค๋จ๋๊ณ ์ด์ ๊ฐ ๊ถ๊ธํด์ง๋๋ค.
์ด ๊ฒฝ์ฐ ์ด๋ฌํ ์๊ฐ ์ ํ์ ๊ตฌ์ฑํ๊ณ ๋ฎ์ถ๊ฑฐ๋ ๋ค๋ฅธ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด์ฉ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ์๋ฅผ ์ฐ๋ฅด๊ณ ํด๊ฒฐ์ฑ ์ ์ฐพ๋ ๋ฐ ๋์์ ์์ฒญํ ์๋ ์์ต๋๋ค.
๋ด ์กฐ์ธ์ ๋๋ํ ์ฌ๋์ด ์ค์ ํด๊ฒฐ์ฑ ์ ์ฐพ์ ๋๊น์ง์ด ์ค๋ ๋๋ฅผ ๋ฐ๋ผ ๊ฐ๋ฉด ๊ทธ ๋ต์ผ๋ก ์ค์ค๋ก๋ฅผ ๊ต์ก ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋์ (๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฑฐ๋ ์ํ์ง ์๋ ๊ฒฝ์ฐ) ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.
TL; DR;
์, ์ผ์์ ์ผ๋ก ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค. ๋งค๋ฒ ํ์ธํ์ฌ ์ํ๋ฅผ ํ์ธํ๊ณ ํ์ํ ์กฐ์น๊ฐ ์๋์ง ํ์ธํ์ญ์์ค.