Androidã®ReactNativeã§ã¯ãã¿ã€ããŒã®è€æ°åã®èšå®ãé©åã«åŠçãããŸãããã¿ã€ããŒããªãã«ãªããšãã«ã·ã¹ãã ããŠã§ã€ã¯ã¢ããããã®ã§ã¯ãªããã¿ã€ãã³ã°ã¢ãžã¥ãŒã«ãèµ·åãããŸãŸã«ãªããŸãã
framecallbacksã䜿çšããŠã¿ã€ããŒãåŠçãã代ããã«ã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
ç§ãéçºããŠããéããã®éåžžã«è¿·æãªé£ã³åºã..ãšã«ããç§ã¯ä»ã®ãšããèŠåãé ãããšãã§ããŸããïŒ
Firebase3.9.0ã§ãåãåé¡ãçºçããŸã
æ°ã«ãªãå Žåã¯ã console.ignoredYellowBox = ['Setting a timer'];
è¿œå ããã ãã§ã
@ skv-ãããã¬ã¹æèŠãå ¥ããŸãã :)
ç§ã®æèŠã§ã¯ãåé¡ã«å¯Ÿããæ 床ã¯ãªããªãå¿ èŠããããŸãã ç§ã¯ãããããé »ç¹ã«ãããã¢ããããã®ãèŠãŠããŸããããããŠããã¯äººã ã«èŠåãç¡èŠãããŠããŸãã ãããã¯èŠåã§ãã 圌ãã¯ããªãã«èŠåããŸãã ããããç¡èŠããªãã§ãäœããããŠãã ããã éæšå¥šã®éç¥ãå«ãããã¹ãŠã®èŠåãç¡èŠãããã¢ããªãèŠãããšããããŸãã ãã®åŸãã¢ããªãå£ããŠããªãã ãããšæããŸãŸã«ãªããŸãã
ãã®å Žåããããã®ã¿ã€ã ã¢ãŠããæ§æããŠççž®ããããããããåŠçããå¥ã®ã¢ãããŒããèšå®ã§ããŸãã ãã¶ããå³æžé€šã®ã¡ã³ãããçªããŠã解決çãèãåºãã®ãæäŒã£ãŠãããããã«é ŒãããšãããããŸãã
ç§ã®ã¢ããã€ã¹ã¯ãè³¢ã誰ããå®éã®è§£æ±ºçãæãä»ããŸã§ãã®ã¹ã¬ããããã©ãããšã§ããããããã°ããã®çãã§èªåèªèº«ãæè²ããããšãã§ããŸãã ãããŠãããããããã®éïŒåé¡ã解決ã§ããªã/ããããªãå ŽåïŒãèŠåãç¡èŠããŸãã
TL; DR;
ã¯ããäžæçã«èŠåãç¡èŠããããšãã§ããŸãã æã ãã§ãã¯ã€ã³ããŠãã¹ããŒã¿ã¹ãäœã§ãããããããŠå¿ èŠãªã¢ã¯ã·ã§ã³ããããã©ããã確èªããŠãã ããã
@imamatoryç§ã¯ãããšæããŸã
Rectotronã«ãããšæããŸã
ãã®å Žåããã®èŠåã¯åã«ç¡èŠã§ããŸãã
...ãã ããAndroidãšãã¥ã¬ãŒã¿ãŒãé
ããªãããšããããŸããããããçç±ã®1ã€ãããããŸããã
@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çšã®ã·ã³ãã«ãªreactnativeãããžã§ã¯ããããããã°ã€ã³ãšãµã€ã³ã¢ããã«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.
ãã°ã€ã³ãšãµã€ã³ã¢ããã«reactnativeã§firebaseauthã䜿çšãããã®ã§ãããé»è²ã®ãšã©ãŒãçºçããŸããã
1ïŒãã®ã¢ãžã¥ãŒã«ã¯æ£ç¢ºã«ã¯äœã§ããïŒ
2ïŒãããžã§ã¯ãã«ãã®ã¢ãžã¥ãŒã«ãå¿
èŠãªçç±
ç§ã¯ãã®ãªã³ã¯ãä»ããŠstackoverflowã«å°ããŸããïŒïŒhttps://stackoverflow.com/questions/44603362/setting-a-timer-for-a-long-period-of-time-ie-multiple-minutesïŒ
ãã®ãªã³ã¯ããGoogleFirebaseããŒã ã«å ±åã
@ DZuz14 @ saeedheiãšåã質åããããŸããã
åºæ¬çã«ããããã®é·æéã®ã¿ã€ããŒã䜿çšããfirebase
ããŒãã¢ãžã¥ãŒã«ã䜿çšããŠããŸãã
ã¢ãžã¥ãŒã«ãè¿œå ããã ãã§ã¯äžååã ãšæããŸããJavascriptã¿ã€ããŒã§ã¯ãªãã¢ã©ãŒã ã䜿çšããã«ã¯ãå®éã«ã¯firebase
ããŒãã¢ãžã¥ãŒã«å
ã®ã³ãŒããæžãçŽãå¿
èŠããããŸãã
ããããšã@ DZuz14
ãããã£ãŠã firebase
ãšããnpmããã±ãŒãžã調ã¹ããšãããªãå€ãã®å Žæã§setTimeoutã䜿çšãããŠããããšãããããŸãã ã©ã€ãã©ãªã¯Webãµã€ããšnode.jsãµãŒããŒçšã«äœæãããŠãããããããã¯åé¡ãããŸããã react-native
ã¯node.jsãµãŒããŒã®äžçš®ã§ãããé»è©±ã§å®è¡ãããŸã-èŠåãæ£ããææããŠããããã«-é·æéå®è¡ãããJavascriptã¿ã€ããŒã¯ãã®ç°å¢ã§ã¯é©åã§ã¯ãªããããããªãŒãæ¶èãããã®ä»ã®æãŸãããªãå¯äœçšãåŒãèµ·ããå¯èœæ§ããããŸãã
ãããã£ãŠã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' ]
ãã®ã³ãŒãã¯ãreactnativeå
ã®èŠåã®ã¿ãé衚瀺ã«ããŸãã
ãã©ãŠã¶ã³ã³ãœãŒã«å ã®èŠåã¯ã©ãã§ããïŒ
RNããŒã ãŸãã¯ã³ãã¥ããã£ã®èª°ãããã®åé¡ã®è§£æ±ºã«åãçµãã§ãããã©ãã誰ããç¥ã£ãŠããŸããïŒ
èŠåãããã¢ããã¯ãã®åé¡ã«ãªãã€ã¬ã¯ããããŸãããèŠåãé衚瀺ã«ãã以å€ã«é©åãªè§£æ±ºçãããã§èŠã€ããããšãã§ããŸãããããã¯ãŸã£ãã解決çã§ã¯ãããŸããã äœãã¢ã€ãã¢ãææ¡ã¯ãããŸããïŒ
@SuhairZainãã¹ãŠãRNã«å¯Ÿããå€éšã©ã€ãã©ãªã®ãšã©ãŒã§ããããšã瀺ããŠããããã§ã
@rigobcastroãã®èŠåã¯ãååãªæéïŒç§ã®å Žåã¯5åïŒã®setInterval()
åŒã³åºãã§ç°¡åã«åçŸã§ããŸãã ãããã£ãŠãããã¯ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã«ãã£ãŠåŒãèµ·ãããããã®ã§ã¯ãªããšæããŸãã
ãšããã§ãç§ã¯ããã§ã©ã€ãã©ãªãèŠã€ããŸããïŒ react-native-background-timerã¯ç§ãä»äºã
@SuhairZainã¯ããããã§ãïŒ ç§ã®åé¡ã¯ãµãŒãããŒãã£ã®libã«ãããŸããããææè
ããšã©ãŒãä¿®æ£ãïŒ setInterval()
å€æŽããã ãã ãšæããŸãïŒãèŠåãæ¶ããŸããã
è¯ããå§ããããããšãã
ç§ã¯ããã§åãåé¡ãæ±ããŠããŸãã ãããŠãããã§ãç§ã¯ãã®åé¡ãã©ã®ããã«æ±ãã¹ããç解ã§ããŸããã§ããã
rnïŒ0.45.1
FirebaseïŒ4.1.3
芪æãªã@escalepionFirebaseããŒã ã«å ±åããŸããïŒïŒhttps://github.com/facebook/react-native/issues/12981#issuecomment-309595327ïŒ
@escalepionåé¡ãé·æéå®è¡ã¿ã€ããŒã®èšå®ã«é¢ãããã®ã§ããå Žåã¯ãäžèšã®ç§ã®ã³ã¡ã³ããèŠãŠãããã圹ç«ã€ãã©ããã確èªããŠãã ããã
@SuhairZainç³ãèš³ãããŸããããsetIntervalãŸãã¯react-native-background-timerã®äœ¿çšæ¹æ³ãç解ã§ããŸããã§ãã:(ã©ãã§ã©ã®ããã«ã³ãŒããèšè¿°ããŸããïŒäŸã¯ãããŸããïŒ
ã©ã®ã©ã€ãã©ãªã害ãåŒãèµ·ãããŠããã®ããææ¡ããæ¹æ³ã«ã€ããŠèª°ãããã³ããæã£ãŠããŸããïŒ æè¿RNã0.46ã«ã¢ããã°ã¬ãŒãããŸããããçªç¶ãã®ãšã©ãŒãçºçããŸããã ç§ã®ãããžã§ã¯ãã«ã¯ããªãã®æ°ã®ã©ã€ãã©ãªãããããããã1ã€ãã€èª¿æ»ããããšããèããããŸããããããã¯æããã«çæ³çã§ã¯ãããŸããã
也æ¯ïŒ
@ abeltje1 ããã®åé¡ãä¿®æ£ããæ¹æ³ã
@liketurbo確ãã«ç§ã¯
30åããšã«APIããŒã¯ã³ãåæ€èšŒããããã«ã redux-saga
ãšäžç·ã«ãã®åé¡ãçºçããŠããŸãã
ãããã£ãŠããã®å Žåãããã ãé·ãåŸ ã€ããšã¯å®éã«ã¯æ£ããããšã§ãã ãããŠãç§ã¯é·ãéåŸ ã€ããšãäºæ³ãããä»ã®ã·ããªãªããããšæããŸãã
ããããç§ã®è³ªåã¯ããªããããèŠåãªã®ããšããããšã§ãã äœãå£ã/èµ·ããå¯èœæ§ããããŸããïŒ LLTïŒé·æãã©ã³ã¶ã¯ã·ã§ã³ïŒã䜿çšã§ããªãããã«ããå¿ èŠããããŸããïŒ
LLTã«åé¡ããªãå Žåã ãã®åé¡ãåŠçããããã®æè¯ã®ã¢ãããŒãã¯äœã§ããããïŒ AlarmManageræéãæ¡åŒµããŸããïŒ
åãã£ãŠæè¬ããŸã ;ïŒ
@sospedraãšåãåé¡ãçºçããŠããŸãã ç§ã¯redux-saga
ã䜿çšããŠãããã¢ããªå
ã®äžéšã®ããŒã¿ã3åããšã«ããã¯ã°ã©ãŠã³ãã§æŽæ°ãããµã¬ãããããããµã¬ã«ã¯ã³ãŒãyield call(delay, 3 * 60000);
å«ãŸããŠããŸãã ãã®çµæããã®ãã¿ã€ããŒãé·æéèšå®ããŠããŸã...ããšãããšã©ãŒãçºçããŸãã
ç§ã¯ãŸããææ¡ãããã¢ãããŒãããã®ãããªãã®ã®ããã«äœã§ãããçåã«æã£ãŠããŸãã ã³ãŒãããã®ããã«æ©èœããããŸãŸã«ãããšãã©ã®ãããªåé¡ãçºçããŸããã ãšã©ãŒã¡ãã»ãŒãžã¯ãããã©ãŒãã³ã¹ã®åé¡ãããå¯èœæ§ãããããšã瀺ããŠããŸããã¢ããªãããã¯ã°ã©ãŠã³ãã«ããå Žåãã¿ã€ããŒãå®éã«æ£ããæéã«èµ·åãããªãå¯èœæ§ããããŸããïŒ
ãã®ã³ãŒãã§3åã®ã¿ã€ããŒãèšå®ããããšã«åé¡ãããå¯èœæ§ãé«ãå Žåãåãæ©èœãå®çŸãããããã®åé¡ã«ééããªã代æ¿ãœãªã¥ãŒã·ã§ã³ã¯ã©ãã§ããïŒ
ãŸã åãåé¡ãçºçããŠããŸãã
ãã€ãã£ãAndroidéçºã«ç§»è¡ããå¯äžã®è§£æ±ºçã ãšæããŸã
åé¡ã¯ãŸã 解決ã§ããŸãããïŒ èª°ãã解決çãèŠã€ããŸãããïŒ
Firebaseã®äœ¿çšäžã«èŠåã衚瀺ãããŸãã
åé¡ããµãŒãããŒãã£ã®ã©ã€ãã©ãªã«ããã®ã§ã¯ãªããèªåã§é·ãã¿ã€ã ã¢ãŠããèšå®ããŠããå Žåã¯ã react-native-background-timerã©ã€ãã©ãªã䜿çšããããšããå§ãããŸãã READMEã«ã¯ç°¡åãªäŸãå«ãŸããŠããŸãã
æ®å¿µãªãããåé¡ããµãŒãããŒãã£ã®ã©ã€ãã©ãªããã®ãã®ã§ããå Žåã¯ãsetTimeoutãåŒã³åºãããå ŽæãèŠã€ããŠåé¡ãæèµ·ãããã代ããã«https://github.com/facebook/react-native/issues/12981#issuecomment -331074444ãããŠããããããªãã®ããã«åããã©ããè©ŠããŠã¿ãŠãã ããã
ã¢ã³ããã€ãã§ã倧ããªã¿ã€ã ã¢ãŠããäœã£ãŠãã ããã
@SuhairZainãèšã£ãããã«ã react-native-background-timerã¯è¯ãåé¿çã§ãã ããã«ãããèŠåã¡ãã»ãŒãžãã¯ãªã¢ã§ããŸã
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
react-nativeãªã³ã¯
CïŒ\ Users \ realtebo \ Downloads \ manager2 \ node_modulesïŒ54msïŒã®ã·ã³ããªãã¯ãªã³ã¯ã®ãã©ã«ããŒãã¹ãã£ã³ããŠããŸã
react-native link
ã¯ãCreate React NativeAppãããžã§ã¯ãã§ã¯äœ¿çšã§ããŸããã ã«ã¹ã¿ã ãã€ãã£ãã³ãŒãã«äŸåããã©ã€ãã©ãªãå«ããå¿ èŠãããå Žåã¯ãæåã«ã€ãžã§ã¯ãããå¿ èŠãããå ŽåããããŸãã 詳现ã«ã€ããŠã¯ã httpsïŒ//github.com/react-community/create-react-native-app/blob/master/EJECTING.mdãåç §ããŠ
æåºããããªã....ã ããã..ã©ãããã°ããã§ããïŒ
ããããã¿ãŸãããCreate React NativeAppãããžã§ã¯ããæ¯æŽããæ¹æ³ãããããŸããã ç§ã¯ãããèªåã§äœ¿ã£ãããšããããŸããã
ããã«ã¡ã¯ã
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))
});
}
}
äžèšã¯reduxã®Action
ã§ããããredux-thunk
ãŸã..ãã¿ã³ãã¯ãªãã¯ããŠãã©ãŒã ããfirebase
ã«ããŒã¿ãä¿åãããšãä¿åã«æåãããšsaveDataSuccess()
ãã£ã¹ããããããŸãã
ä»ãç§ã¯åé¡ãããconst userId = firebase.auth().currentUser.uid
ã«ããããã«èŠããã®ã§ã¯ãªãããšçã£ãŠããŸãããããããããŸããã ãããåé¡ã®ã¹ã¯ãªãŒã³ã·ã§ããã§ãã ïŒã¢ããªã¯æ£åžžã«åäœããŸããããã®èŠåã衚瀺ãããŸããåã«ç¡èŠããå¿
èŠããããã©ããããããŸããïŒãŸãã¯ãããã§äœãééã£ãããšãããŠããå¯èœæ§ããããŸãã
ãããèŠåã¯setTimeoutã«é¢ãããã®ã§ããã³ã³ããŒãã³ãã§äœ¿çšããŠããŸããïŒ
ã¯ããè¡const userId = firebase.authïŒïŒãcurrentUser.uid; ãæ©èœããŠããŸãããããã¯çŽæã§ãããuserIdã䜿çšããŠããŸã æ©èœããŸããã
ãããè¡ãããã®ããè¯ãæ¹æ³ã¯ãactionCreatorããuserIdãååŸããããšã§ãããã§ã«ãuserInfoå€æ°ãéä¿¡ããŠããŸãããããè©ŠããŠãã ããã
userInfoã¯firebaseauth loginããã®ãã®ã§ãããšæ³å®ããŠããã®ã§ãuidãå«ãŸããŠããŸã
ãšã¯ã¹ããŒãé¢æ°saveUserDataïŒuserInfoïŒ{
è¿åïŒçºéïŒ=> {
dispatchïŒsaveDataRequestïŒïŒïŒ
// const userId = firebase.authïŒïŒãcurrentUser.uid;
firebase.databaseïŒïŒãrefïŒ 'users /' + userInfo.uidïŒ.setïŒuserInfoïŒãè¿ããŸã
.thenïŒïŒïŒ=> {
dispatchïŒsaveDataSuccessïŒïŒïŒ;
dispatchïŒNavigationActions.navigateïŒ{routeNameïŒ 'TabContactNavigation'}ïŒïŒ
}ïŒ
.catchïŒïŒerrorïŒ=> {
ãã£ã¹ãããïŒsaveDataFailureïŒãšã©ãŒïŒïŒ
}ïŒ;
}
}
ç§ã¯ããã圹ç«ã€ããšãé¡ã£ãŠããŸãããããŠç§ã®æªãè±èª= Pããè©«ã³ããŸã
è³çŠ
ãšã«23/10/2017ãã©ã¹åå23æ59åãã€ã·ã«[email protected] escribióïŒ
ããã«ã¡ã¯ãç§ã¯0.49ã䜿çšããŠããã®ãšåãåé¡ããããŸãããããè¡ã£ãåŸã«è¡šç€ºãããŸãã
ãšã¯ã¹ããŒãé¢æ°saveUserDataïŒuserInfoïŒ{
è¿åïŒçºéïŒ=> {
dispatchïŒsaveDataRequestïŒïŒïŒ
const userId = firebase.authïŒïŒãcurrentUser.uid;
firebase.databaseïŒïŒãrefïŒ 'users /' + userIdïŒ.setïŒuserInfoïŒãè¿ããŸã
.thenïŒïŒïŒ=> {
dispatchïŒsaveDataSuccessïŒïŒïŒ;
dispatchïŒNavigationActions.navigateïŒ{routeNameïŒ 'TabContactNavigation'}ïŒïŒ
}ïŒ
.catchïŒïŒerrorïŒ=> {
ãã£ã¹ãããïŒsaveDataFailureïŒãšã©ãŒïŒïŒ
}ïŒ;
}
}
äžèšã¯reduxã®ã¢ã¯ã·ã§ã³ã§ãããããredux-thunkã䜿çšããŸããä¿åãæåãããšãã«ãã¿ã³ãã¯ãªãã¯ããŠãã©ãŒã ããFirebaseã«ããŒã¿ãä¿åãããšãsaveDataSuccessïŒïŒããã£ã¹ãããããã次ã®ã¿ãã«ç§»åããŸãã
ããã§åé¡ãçºçããŠããããã«èŠããã®ã§ã¯ãªãããšçã£ãŠããŸããconstuserId= 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/ããã¥ãŒãããŸã
éåžžãç§ã¯userinfoãreduxã¹ãã¢ã«ä¿åããŸãã
ã ããç§ã¯å¿
èŠã«å¿ããŠåã«åå©çšããŸãã
...ããã...åæ§ã®ç¶æ³ã§ãç§ã¯ã¿ã€ã ã¢ãŠãã«é¢ããŠåãåãåé¡ãæ±ããŠããŸã
react-native-signalrã©ã€ãã©ãªãšåãåé¡ïŒ300000msïŒ
socket.ioãµãŒããŒãªãã·ã§ã³
pingTimeoutïŒ60000ïŒ+ pingIntervalïŒ25000ïŒ<= 60000
Androidã§ããã«å¯ŸåŠããæ¹æ³ã«é¢ããæŽæ°ã¯ãããŸããïŒ ãŸã ååŸããŠããŸãããsetTimeoutã䜿çšããŠããŸãã...
ã¡ããã©ç§ã®ãã©ããŒã¢ãããã以åã®ã³ã¡ã³ãç§ã¯ããã®åšãã®ãã¹ãŠã®äººã ã®ææ ãŸã§ã®åèšãä¿¡ããŠïŒ8æããã®ïŒïŒç§ãã¡ãããŠãã[OK]ãããã®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'];
ãªã¢ãŒãã§ãããã°ãããšãã«Chromeã®ã³ã³ãœãŒã«ã«èŠåã衚瀺ããããããããã¯åé¿çãšããŠéåžžã«å®å šã§ãã
ã³ã³ãœãŒã«ã®ç¡èŠã³ãŒããé 眮ããã®ã«æé©ãªå Žæã¯æ£ç¢ºã«ã¯ã©ãã§ããïŒã
--nevermind ããªã³ã¯ããã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..
import {AppRegistry} from'react-native ';
'./App'ããã¢ããªãã€ã³ããŒãããŸãã
console.ignoredYellowBox = [
ãã¿ã€ããŒã®èšå®ã
];
AppRegistry.registerComponentïŒ 'manager'ãïŒïŒ=> AppïŒ;
ãã
äž¡æ¹ã§åãã
@CopyJoshãšã³ããªãã¡ã€ã«ã«å
¥ããããšãã§ããŸãïŒ index.js
ããã§ãããã«å¯Ÿããå®éã®è§£æ±ºçã¯ãŸã ãããŸãããïŒ 8ã¶æ以äžçµã¡ãŸããã
ïŒ
ããã§ã¯ãããã解決ããŸãããã ç§ãã¡ã¯ããããç解ããå¿ èŠããããŸãïŒ
A.ïŒReactã³ãŒããä»ããŠåŒã³åºãããšãã§ããç°¡åãªæ¡åŒµAPIã ãã¶ããAlarmManagersã¡ãœããã®1ã€ã ããæ©èœãããããšã«åãçµãã®ãè³¢æã ãšæããŸãã ããšãã°ãReact Nativeã³ãŒãã§æ¬¡ã®ã¡ãœãããåŒã³åºããšãAndroidããã€ã¹ã®ãã€ãã£ãAlarmManagerã§ã¢ã©ãŒã ãèšå®ãããŸãã
AlarmMgr.setInexactRepeating(arg1, arg2...)
B.ïŒãããæ©èœãããããã®å®éã®å®è£ ã ç§ã®ç¥ãéããAlarmManagerã§ã¢ã©ãŒã ãèšå®ãããšããããããä¿çäžã®ã€ã³ãã³ãããAlarmManagerãµãŒãã¹ã«éä¿¡ãããŸãã å°æ¥ãããçš®ã®ãã¿ã¹ã¯ããå®è¡ãããããšãAlarmManagerã«äŒããŸãã ç§ã«ã¯ãAlarmManagerïŒãŸãã¯ã«ã¹ã¿ã React Javaã¡ãœããïŒã«äœããã®ã¿ã€ãã®ããŒã¿ãJavaScriptã³ãŒãã«è¿éãããã¢ã©ãŒã ã鳎ã£ãåŸã«å®è¡ããã³ãŒããæ瀺ããå¿ èŠãããããã«æãããŸãã
ãã®åé¡ã«åãçµãã§ãã人ã¯ããŸããïŒ è©³çŽ°ã«ã€ããŠã¯ãAlarmManagerã®ãã¡ããã芧
ãšããã§-ãã®éå¹çæ§ïŒé·ããæ°åã®ã¿ã€ã ã¢ãŠãã«é¢é£ããïŒã¯ãRNããŒãžã§ã³> 0.43ã®å Žåã«ã®ã¿æ°ããåé¡ã§ããïŒ ãããšããèŠåãRN> 0.43ããåãåºãããŠããã ãã§ããïŒ 0.43.xãã0.47.xã«ç§»è¡ããèŠåã衚瀺ããå§ããŸããã ç§ã¯éå¹çæ§ãåžžã«ããã«ãã£ããšæããŸããããããŠRNã¯ã¡ããã©ä»ããã«ã€ããŠç§ã«èŠåãå§ããŸããã
ãã ããæ°æ¥åã®ç§»è¡ä»¥æ¥ãã¢ããªãæºåž¯é»è©±ã®ããããªãŒãããå€ãæ¶è²»ããŠããããšã«æ°ã¥ããŸããã ïŒããã³diffã®ä»ã®æ©èœã¯æãããªåå ã§ã¯ãããŸããïŒ
ãã@astreet ããã®åé¡ãæçš¿ããŠãã®èŠåãããã«è¿œå ãããšãã«äœãåç §ããŠãããããŸã èŠããŠããŸãã
2åã®å®æã¿ã€ããŒãèšå®ãã1ã€ã®ã©ã€ãã©ãªã䜿ãå§ããåŸãæè¿éåžžã«ç ©ããããªããŸããããã®ããããã®èŠåãæåã«è¿œå ãããçç±ãç解ããããã«ããããæãäžãå§ããŸããã
ä»ãç§ã¯ãã®æã«ã€ããŠå¿é
ããŠããŸãïŒãã¿ã€ãã³ã°ã¢ãžã¥ãŒã«ãç®èŠããããŠãããã ããªããèšåããŠãããšæãã®ã¯ãTimerã¢ãžã¥ãŒã«ãæ¯ä»åž«ã®ã³ãŒã«ããã¯ãèšå®ããŠãããšããããšã§ãã ã¿ã€ããŒã®æç¡ã«é¢ä¿ãªããã³ãŒã«ããã¯ã¯èšå®ãããŠããããã§ããã ããã§é¢é£ããã³ãŒãéšåãåç
§ããŠãã ããïŒ https ïŒ
ã¿ã€ããŒãã¹ã±ãžã¥ãŒã«ãããŠããªããšãã«ã³ãŒã«ããã¯ãåæ¢ããã³ãŒãã¯ãªããã¿ã€ããŒãè¿œå ããããšãã«ã¹ã±ãžã¥ãŒã«ãéå§ããã³ãŒãããããŸããã ã³ãŒã«ããã¯ã¯ãã¢ããªãããã¯ã°ã©ãŠã³ãã«ç§»åãããšãã«ã®ã¿äžæåæ¢ããããã©ã¢ã°ã©ãŠã³ãã«æ»ã£ããšãã«åŸ©å
ãããŸãã
çµæãšããŠãæ¯ä»åž«ã®ã³ãŒã«ããã¯ã¯ãã¿ã€ããŒãé·æéãçæããŸãã¯ãŸã£ããèšå®ãããŠããªããã©ããã«é¢ä¿ãªãããã¬ãŒã ããšã«ãã¥ãŒã«å ¥ããããŸãã ãã®å Žåãé·ãã¿ã€ããŒãèšå®ãããšããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ãããããããŸããã ããã§ãèŠåã¯å¿ èŠãªããšããããšã§ããïŒ
é·ãã¿ã€ããŒãèšå®ããããšããæ£ç¢ºæ§ã®åé¡ãã§ããéããã¿ã€ããŒã¯ãã©ã¢ã°ã©ãŠã³ãã¢ããªã®ç¶æ ã§ã®ã¿åŒã³åºããããšããäºå®ãåç §ããŠãããšæããŸãïŒãããã£ãŠãå°æ¥é·ãéèšå®ããŠã¢ããªãbgã«å ¥ããšå®è¡ãããªãããã¢ããªããã©ã¢ã°ã©ãŠã³ãã«ãªã£ããšãã«å®è¡ãããŸããããã¯ãäºæ³ãããå€§å¹ ã«é ããå¯èœæ§ããããŸãïŒã ããã¯ãèŠåã衚瀺ããªãiOSã®å Žåãšåãã ãšæããŸãã
socket.ioã§ã¯ãããã©ã«ãã®pingã«ãŒãã¯85000msã= pingIntervalïŒ25000msïŒ+ pingTimeoutïŒ60000msïŒã§ãã ãµãŒããŒã§ãããã®ãªãã·ã§ã³ããªã»ãããã pingInterval
ãšpingTimeout
<= 60000msã®åèšã確èªããå¿
èŠããããŸãã
äŸãã°ïŒ
var socket = require('socket.io')(12345, {
pingInterval: 20000,
pingTimeout: 40000
})
奜å¥å¿ã匷ã-ã¢ããªã§çŽ5åã®ã¿ã€ã ã¢ãŠããèšå®ã§ããããã«ããå¿ èŠããããŸãã ãã®åé¡ã¯ã©ã®ãããæ·±å»ã§ãã©ã®ããã圱é¿ããŸããïŒ
@ntomallenã¢ããªãåžžã«ç»é¢ã«è¡šç€ºãããå Žåãäœãå€æŽãããŸããã ã¹ã ãŒãºã«åäœããŸãã ãã以å€ã®å Žåã¯ã5åã®çµããã«ããªã¬ãŒãããªãå¯èœæ§ããããŸãã ãŸãã¯ããã¯äžæ£ç¢ºã«ãªããŸãã
Androidã®ReactNativeã§laravelechoã䜿çšããŠãœã±ãããµãŒããŒãªãã·ã§ã³ãpingTimeout
ãã30000ã«å€æŽããŸããããã¯æ©èœããŸã
@sospedraã®èœãšãç©Žã æªããªãããšã確èªããããã«ãããã€ãã®ãã¹ããè¡ãå¿ èŠããããŸãã
Handler.postDelayedãåžžã«äœ¿çšãããšã¯éããªãçç±ã¯ãããŸããïŒ
ãã®åé¡ã®ç°¡åãªä¿®æ£ã¯ãããŸããïŒ Firebaseã§RNã䜿ãå§ãããšããã§ãã
ç§ã¯ããã€ãã®ç°ãªãã¿ã€ããŒãœãªã¥ãŒã·ã§ã³ãè©ŠããŸããããããã¯ã°ã©ãŠã³ãã§ïŒäžè²«ããŠïŒæ©èœãããããšãã§ããŸããã§ããã
setIntervalã䜿çšããŠ10åããšã«ãµãŒããŒã«pingãå®è¡ããŸãã- setInterval(myFunction, 60000)
ãå®è¡ããŠããããããã®ãšã©ãŒã¡ãã»ãŒãžã«æ°ã¥ããŸããã ããã¯ç§ãå¿é
ããå¿
èŠããããã®ã§ããïŒ
ç§ã®äºæ³ãããåäœã¯ãã¢ããªãéããŠããéã¯ãªã¯ãšã¹ããéä¿¡ã§ããŸãããã¢ããªãäžæåæ¢ãããåŸïŒããŒã ãã¿ã³ã1åæŒãïŒããªã¯ãšã¹ãã®èµ·åãåæ¢ããã¯ãã§ãã ããã¯ç§ãæåŸ ã§ããåäœã§ããïŒã¢ããªãäžæåæ¢ãããŠããéãããããªãŒã®å¯¿åœã¯åœ±é¿ãåããŸããïŒ
ããã§å¿é ããããšã¯äœããããŸãããèŠåã¯æ£ãããªããããåé€ããå¿ èŠããããŸãã ç®ãèŠãŸãç¶ããããã®ãã¿ã€ãã³ã°ã¢ãžã¥ãŒã«ãã¯ãããŸããããã¬ãŒã ããšã«ã¿ã€ããŒããã§ãã¯ããChoreographerã³ãŒã«ããã¯ããããŸãïŒããã«ãããã¿ã€ããŒã®æå°ç²åºŠãæ倧16msã«ãªããŸãïŒã
iOSãŸãã¯Androidã®ã©ã¡ãã§ããã¿ã€ããŒãããã¯ã°ã©ãŠã³ãã§èµ·åããªããšããæå³ã§ãæ£ç¢ºæ§ã®åé¡ããããŸãã ãã ãããã®èŠåã¯ç¹ã«Androidã«é¢ãããã®ã®ããã§ãããæ£ç¢ºã§ã¯ãªãããã§ãã ã¢ããªããã©ã¢ã°ã©ãŠã³ãã«æ»ã£ããšãã«ããã¹ãŠã®ã¿ã€ããŒãæçµçã«èµ·åããã¯ãã§ãã
ããã«ããã«å¯ŸåŠããèšç»ã¯ãããŸããïŒ ç§ãã¡ãAndroidæºåž¯ã§ãã¹ãããŠãããšãã¯ãã€ã§ããã°ã¯è¿·æã§ãã
ã¿ã€ã ã¢ãŠããæ倧59åã ã£ãããããã®ãšã©ãŒãçºçããŠããŸããã ã³ãŒãã¯ãæéã®äžã«ã¡ãœãããåŒã³åºããŠããããŸãsetTimeout
äœæããsetInterval
æéã®æ¬¡ã®äžéšã«ãããŸãã
setTimeout
ãæŽæ°ããŠãåã®å
é ããsetInterval
ãéå§ããŸãã0
å Žåã«ã®ã¿é¢æ°ãå®è¡ããããã«ãsetIntervalã«ãã£ãŠåŒã³åºãããé¢æ°ãæŽæ°ããŸãããã®é¢æ°ã¯ã1æéããšã§ã¯ãªãã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ã¯ããŠãŒã¹ã±ãŒã¹ãå®å šã«ç解ããŠããããã§ã¯ãããŸããããåé¿çã®1ã€ã¯ãããã¯ã°ã©ãŠã³ããžã®ãšã³ããªæã«ã¢ããªå ã«ããã¯ã°ã©ãŠã³ãæ¥ä»ãä¿åãããã©ã¢ã°ã©ãŠã³ãã«æ»ã£ããšãã«ãçŸåšã®æ¥ä»ãä¿åãããŠããããã¯ã°ã©ãŠã³ãæ¥ä»ãšæ¯èŒããŠãã¯ãªãŒã³ã¢ãããå®è¡ããããšã§ããäžå®æéãçµéããå Žå...
ç§ã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠè©³ãã説æããŸãã ãã°ã€ã³ãåãå ¥ããããã«ãå¥ã®ã¢ããªã§ãã¯ãããšèšãããšã«äŸåããŠãããšããŸãã Feksã¯Facebookã¢ããªã«åãæ¿ããŠããµãŒãããŒãã£ã®ãã°ã€ã³èŠæ±ã«ãã¯ãããšçããŸãã 䜿çšããŠããå ·äœçãªäŸã¯ãuPortã httpsïŒ //www.uport.me/
æ å ±ãéä¿¡ãããçŽåŸã«ã¯ãªãŒã³ã¢ãããè¡ãããå¯èœæ§ãããããšã«åºå·ãããšæããŸãããªããªããæ å ±ã¯ãã§ã«éä¿¡ãããŠãããå¿ èŠãªãããã§ãã ããããFirebaseã¢ãããŒããReactNativeã§æ©èœããªãã®ã¯ãªãã§ããïŒ ããã¯ã°ã©ãŠã³ãã¯ãŒã«ãŒãåæ¢ããããšã
ã¢ããªã§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"ã
"react-native"ïŒ "0.54.4"ã
"socket.io"ïŒ "^ 2.1.1"ã
"socket.io-client"ïŒ "^ 2.1.1"ã
æä¹ çãªè§£æ±ºçã¯ãããŸããïŒ
åäžããããåé¿ããæ¹æ³ã¯ãããŸãããïŒ
ããã§ãreact-native0.57ã§ãã®èŠåã衚瀺ãããŸããããã®åé¡ã¯ä»£ããã«éãããŠããã¯ãã§ããïŒ
ã»ãŒ1幎ãšReactNativeã«ã¯ãŸã åãåé¡ããããŸã!!!
åãåé¡ã«çŽé¢ããŠãåãèŠåã3ã4å衚瀺ãããŸãã ãšãŠãããããã
ãã®åé¡ã解決ããããã®è§£æ±ºçã¯ãããŸããïŒ
ãã®ãœãªã¥ãŒã·ã§ã³ã«ãã£ãŠèŠåã¡ãã»ãŒãžãåãé€ããŸããhttps://stackoverflow.com/a/48778011/7427111
åºæ¬çã«ã¯ã¡ãã»ãŒãžãé ãã ãã§åé¡ã¯è§£æ±ºããªããšæããŸãã
@dhavaljardoshã¯ããããªãã®æšæž¬ã¯æ£ããã§ãã
JavaãšObjectiveCã䜿çšããŠãã€ãã£ãã¿ã€ããŒãäœæããŸãããããã¯ç§ã®ããã«æ©èœããã¡ãã»ãŒãžãé衚瀺ã«ããŸãã ãããå®éã«ããã©ãŒãã³ã¹ãåäžããããã©ããã¯ããããŸããã äžèšã®ããã«ïŒããã¯ã°ã©ãŠã³ãã§é·ãã¿ã€ããŒããããããããããªãŒãªã©ã«ã¯ãŸã æªãã§ãã
質åã®1ã€ã¯ãæ¬åœã«ããŒãªã³ã°æ©èœãå¿ èŠãã©ããã§ãã ãã£ããšæã£ãŠããã®ã§ããããã®åé¡ã®ããã«ãå®è¡ããå¿ èŠãããã®ã¯åé »åºŠã®æéã ãã§ããããšã«æ°ä»ããŸããã ãã®ãããã¢ããªã®ããã¯ã°ã©ãŠã³ãã§å®è¡ãããã®åé¡ãå®å šã«åé¿ããŠããŸãã YMMVã
ããã·ã£ãŒã䜿çšãããšãã«åãåé¡...
ã¢ããªããã¹ãããŠã60ç§ããšã«ã¿ã€ããŒãèšå®ããå Žåã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã確èªããŸãã
ããããããªãæ¹ã®äœäººãã¯ãããçµéšããŠãããšæããŸãã ãã®çµéšãå
±æããŠããã ããŸãããïŒ åœ±é¿ã¯éèŠã§ããïŒ
ææ°ããŒãžã§ã³ã§ãåãåé¡ã
解決çã¯ãããŸããïŒ
ç§ããã®åé¡ã«çŽé¢ããŠããŸãã
ã¢ããªã¯æ£åžžã«æ©èœããŠããŸãããèŠåã衚瀺ãããã®ã¯ãFirebaseã䜿ãå§ãããšãã ãã§ãã
解決çã¯ãããŸããïŒ
ãã®ã¡ãã»ãŒãžã®èåŸã«ããæå³ãç解ãããã®ã§ãããæè¿è£œåã«è¿œå ããæ©èœã®åŸã§ã¡ãã»ãŒãžãåãåãå§ããŸããã ãã®åé¡ã¯ãã¢ããªãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããéãã¿ã€ããŒãå®è¡ããç¶ãããšããäºå®ã«ã®ã¿é¢ä¿ããŠããŸããïŒ ã¢ããªã®ç¶æ ã€ãã³ãããµãã¹ã¯ã©ã€ãããã¢ããªãããã¯ã°ã©ãŠã³ãã«ãªã£ãŠããå Žåã¯ã¿ã€ããŒãåæ¢ããã®ãé©åãªè§£æ±ºçã§ããããïŒ ãŸãã¯ã_foreground_ã®ã¢ããªã§é·æéå®è¡ãããã¿ã€ããŒã«ãåé¡ããããŸããïŒ
ãã®ã¡ãã»ãŒãžã®èåŸã«ããæå³ãç解ãããã®ã§ãããæè¿è£œåã«è¿œå ããæ©èœã®åŸã§ã¡ãã»ãŒãžãåãåãå§ããŸããã ãã®åé¡ã¯ãã¢ããªãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããéãã¿ã€ããŒãå®è¡ããç¶ãããšããäºå®ã«ã®ã¿é¢ä¿ããŠããŸããïŒ ã¢ããªã®ç¶æ ã€ãã³ãããµãã¹ã¯ã©ã€ãããã¢ããªãããã¯ã°ã©ãŠã³ãã«ãªã£ãŠããå Žåã¯ã¿ã€ããŒãåæ¢ããã®ãé©åãªè§£æ±ºçã§ããããïŒ ãŸãã¯ã_foreground_ã®ã¢ããªã§é·æéå®è¡ãããã¿ã€ããŒã«ãåé¡ããããŸããïŒ
ãããç¥ãããã§ãã
ããã«ãsetIntervalã¯ã©ããªããŸããïŒ ããããèŠåã¯åºãŸããããåãåé¡ããããŸããïŒ
ãã®ã¡ãã»ãŒãžã®èåŸã«ããæå³ãç解ãããã®ã§ãããæè¿è£œåã«è¿œå ããæ©èœã®åŸã§ã¡ãã»ãŒãžãåãåãå§ããŸããã ãã®åé¡ã¯ãã¢ããªãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããéãã¿ã€ããŒãå®è¡ããç¶ãããšããäºå®ã«ã®ã¿é¢ä¿ããŠããŸããïŒ ã¢ããªã®ç¶æ ã€ãã³ãããµãã¹ã¯ã©ã€ãããã¢ããªãããã¯ã°ã©ãŠã³ãã«ãªã£ãŠããå Žåã¯ã¿ã€ããŒãåæ¢ããã®ãé©åãªè§£æ±ºçã§ããããïŒ ãŸãã¯ã_foreground_ã®ã¢ããªã§é·æéå®è¡ãããã¿ã€ããŒã«ãåé¡ããããŸããïŒ
é»è²ã®ã¡ãã»ãŒãžã«ã¯ãã...ãããŠã¿ã€ããŒã¯ãã¢ããªããã©ã¢ã°ã©ãŠã³ãã«ãããšãã«ã®ã¿åŒã³åºãããšãã§ããŸãããšæžãããŠããŸãã
ã¿ã€ããŒã¢ãžã¥ãŒã«ã¯èµ·åãããŸãŸã§ãããã¢ããªãããã¯ã°ã©ãŠã³ãã«ãããšãã«ã¿ã€ããŒãåäœããŸãããïŒ ããã§ãåé¡ã¯ãã¢ããªãããã¯ã°ã©ãŠã³ãã«ãªã£ãŠãããšãã«ã¿ã€ããŒã¢ãžã¥ãŒã«ãèµ·åãããŸãŸã«ããããšã§ããïŒ ããã©ãŒãã³ã¹/ããããªãŒã®å¹æã¯ã©ããããã ããã...
@BerndWessels https://www.npmjs.com/package/react-native-firebaseãããèŠãããšããããŸããïŒ Firebaseããã€ãã£ãã¹ã¬ããã§å®è¡ã§ããããã«ãªããšèšããŸãã ãããã©ãã»ã©çå®ãã¯ããããŸããããäžèŠã®äŸ¡å€ããããããããŸããã ããªããããã䜿ã£ãŠãããããããŸãããç§ã«ã¯ããããŸããã
ãã®ã©ã€ãã©ãªã«åãæ¿ãããšãæ¢åã®ã³ãŒããå€æŽããå¿ èŠããããšæããŸããïŒ ã€ãŸããããã¯ããŸãããããšã§ã¯ãªãã§ããã...
ææ°ã®RN0.59ã®ããã·ã£ãŒã§åãåé¡ãçºçãã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;
ããã¯ããŸãæ©èœããŠããããã§ããããã¯æ£ç¢ºã«äœãããŸããïŒ
youuã«éåžžã«å€ãã®@cpmechãããããšã
ããã«ã¡ã¯ãã³ãŒãïŒããããïŒhttpsïŒ//github.com/firebase/firebase-js-sdk/issues/97#issuecomment-427512040ïŒã¯ã setTimeout
ïŒã°ããŒãã«ïŒé¢æ°ãã©ããããã ãã§ãé·æé䜿çšããŸãã
å€æŽããglobal.setTimeout
é¢æ°ã§ã¯ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ãã倧ããå Žåã id
ãããŒã«ã«ãããïŒ timerFix
ïŒã«ä¿åããŠããä¿åããŸãã runTask
ãåŒã³åºããŸããããã«ãããç¶ç¶æéãããå°ããªå€ã«åå²ãããŸãã runTask
ã¯ãïŒå
ã®_setTimeout
ã䜿çšããŠïŒã¿ã€ã ã¢ãŠããèšå®ãã waitingTime
ãå°ãããããŸã§ç¶ç¶çã«å®è¡ãããå°ããªãã£ã³ã¯ã䜿çšããŸãã 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ïŒã³ã¡ã³ãïŒ ïŒã¯ã
setTimeout
ïŒã°ããŒãã«ïŒé¢æ°ãã©ããããã ãã§ãé·æé䜿çšãããªãããã«ããŸããå€æŽãã
global.setTimeout
é¢æ°ã§ã¯ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ãã倧ããå Žåãid
ãããŒã«ã«ãããïŒtimerFix
ïŒã«ä¿åããŠããä¿åããŸããrunTask
ãåŒã³åºããŸããããã«ãããç¶ç¶æéãããå°ããªå€ã«åå²ãããŸããrunTask
ã¯ãïŒå ã®_setTimeout
ã䜿çšããŠïŒã¿ã€ã ã¢ãŠããèšå®ããwaitingTime
ãå°ãããããŸã§ç¶ç¶çã«å®è¡ãããå°ããªãã£ã³ã¯ã䜿çšããŸããwaitingTime
ãååã«å°ããå Žåãã¹ã ãŒãºã«å®è¡ããããã«React Nativeã®runAfterInteractions
ãåŒã³åºããŸããåæã«ãåã£ããããããŒã«ã«ãããããid
ãšã³ããªãåé€ããŸãããã®å Žåã_setTimeout
å床åŒã³åºãããšã¯ãããŸãããafterTime
ã¯_setTimeout
ã«å ¥åãããé·æéåŒã³åºãããªãããã«ããããšã«æ³šæããŠãã ããããã以å€ã®å Žåãå€æŽãã
global.setTimeout
é¢æ°ã§ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ããå°ããå Žåãã°ããŒãã«setTimeoutïŒ_setTimeout
ä¿åïŒãçŽæ¥åŒã³åºããŸããã°ããŒãã«
clearTimeout
ãã©ãããããããŒã«ã«ãããããid
ãåé€ããŠã¯ãªãŒã³ã¢ããããã»ã¹ãå®è¡ããŸããããã圹ã«ç«ãŠã°å¹žãïŒ
ã©ããããããšãããããŸãïŒ ãã£ãŒã ã®ããã«åããã
ããã«ã¡ã¯ãã³ãŒãïŒããããïŒ firebase / firebase-js-sdkïŒ97ïŒã³ã¡ã³ãïŒ ïŒã¯ã
setTimeout
ïŒã°ããŒãã«ïŒé¢æ°ãã©ããããã ãã§ãé·æé䜿çšãããªãããã«ããŸããå€æŽãã
global.setTimeout
é¢æ°ã§ã¯ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ãã倧ããå Žåãid
ãããŒã«ã«ãããïŒtimerFix
ïŒã«ä¿åããŠããä¿åããŸããrunTask
ãåŒã³åºããŸããããã«ãããç¶ç¶æéãããå°ããªå€ã«åå²ãããŸããrunTask
ã¯ãïŒå ã®_setTimeout
ã䜿çšããŠïŒã¿ã€ã ã¢ãŠããèšå®ããwaitingTime
ãå°ãããããŸã§ç¶ç¶çã«å®è¡ãããå°ããªãã£ã³ã¯ã䜿çšããŸããwaitingTime
ãååã«å°ããå Žåãã¹ã ãŒãºã«å®è¡ããããã«React Nativeã®runAfterInteractions
ãåŒã³åºããŸããåæã«ãåã£ããããããŒã«ã«ãããããid
ãšã³ããªãåé€ããŸãããã®å Žåã_setTimeout
å床åŒã³åºãããšã¯ãããŸãããafterTime
ã¯_setTimeout
ã«å ¥åãããé·æéåŒã³åºãããªãããã«ããããšã«æ³šæããŠãã ããããã以å€ã®å Žåãå€æŽãã
global.setTimeout
é¢æ°ã§ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ããå°ããå Žåãã°ããŒãã«setTimeoutïŒ_setTimeout
ä¿åïŒãçŽæ¥åŒã³åºããŸããã°ããŒãã«
clearTimeout
ãã©ãããããããŒã«ã«ãããããid
ãåé€ããŠã¯ãªãŒã³ã¢ããããã»ã¹ãå®è¡ããŸããããã圹ã«ç«ãŠã°å¹žãïŒ
ããã¯å®éã«åé¡ã«å¯ŸåŠããŸããããããšãåã«èŠåãåé€ããŸããïŒ
ããã«ã¡ã¯ãã³ãŒãïŒããããïŒ firebase / firebase-js-sdkïŒ97ïŒã³ã¡ã³ãïŒ ïŒã¯ã
setTimeout
ïŒã°ããŒãã«ïŒé¢æ°ãã©ããããã ãã§ãé·æé䜿çšãããªãããã«ããŸããå€æŽãã
global.setTimeout
é¢æ°ã§ã¯ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ãã倧ããå Žåãid
ãããŒã«ã«ãããïŒtimerFix
ïŒã«ä¿åããŠããä¿åããŸããrunTask
ãåŒã³åºããŸããããã«ãããç¶ç¶æéãããå°ããªå€ã«åå²ãããŸããrunTask
ã¯ãïŒå ã®_setTimeout
ã䜿çšããŠïŒã¿ã€ã ã¢ãŠããèšå®ããwaitingTime
ãå°ãããããŸã§ç¶ç¶çã«å®è¡ãããå°ããªãã£ã³ã¯ã䜿çšããŸããwaitingTime
ãååã«å°ããå Žåãã¹ã ãŒãºã«å®è¡ããããã«React Nativeã®runAfterInteractions
ãåŒã³åºããŸããåæã«ãåã£ããããããŒã«ã«ãããããid
ãšã³ããªãåé€ããŸãããã®å Žåã_setTimeout
å床åŒã³åºãããšã¯ãããŸãããafterTime
ã¯_setTimeout
ã«å ¥åãããé·æéåŒã³åºãããªãããã«ããããšã«æ³šæããŠãã ããããã以å€ã®å Žåãå€æŽãã
global.setTimeout
é¢æ°ã§ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ããå°ããå Žåãã°ããŒãã«setTimeoutïŒ_setTimeout
ä¿åïŒãçŽæ¥åŒã³åºããŸããã°ããŒãã«
clearTimeout
ãã©ãããããããŒã«ã«ãããããid
ãåé€ããŠã¯ãªãŒã³ã¢ããããã»ã¹ãå®è¡ããŸããããã圹ã«ç«ãŠã°å¹žãïŒ
ã©ããããããšãïŒ ã¢ããªã®å šäœçãªããã©ãŒãã³ã¹ã«ã¯åœ±é¿ããŸããããïŒ
ããã«ã¡ã¯ãã³ãŒãïŒããããïŒ firebase / firebase-js-sdkïŒ97ïŒã³ã¡ã³ãïŒ ïŒã¯ã
setTimeout
ïŒã°ããŒãã«ïŒé¢æ°ãã©ããããã ãã§ãé·æé䜿çšãããªãããã«ããŸãã
å€æŽããglobal.setTimeout
é¢æ°ã§ã¯ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ãã倧ããå Žåãid
ãããŒã«ã«ãããïŒtimerFix
ïŒã«ä¿åããŠããä¿åããŸããrunTask
ãåŒã³åºããŸããããã«ãããç¶ç¶æéãããå°ããªå€ã«åå²ãããŸããrunTask
ã¯ãïŒå ã®_setTimeout
ã䜿çšããŠïŒã¿ã€ã ã¢ãŠããèšå®ããwaitingTime
ãå°ãããããŸã§ç¶ç¶çã«å®è¡ãããå°ããªãã£ã³ã¯ã䜿çšããŸããwaitingTime
ãååã«å°ããå Žåãã¹ã ãŒãºã«å®è¡ããããã«React Nativeã®runAfterInteractions
ãåŒã³åºããŸããåæã«ãåã£ããããããŒã«ã«ãããããid
ãšã³ããªãåé€ããŸãããã®å Žåã_setTimeout
å床åŒã³åºãããšã¯ãããŸãããafterTime
ã¯_setTimeout
ã«å ¥åãããé·æéåŒã³åºãããªãããã«ããããšã«æ³šæããŠãã ããã
ãã以å€ã®å Žåãå€æŽããglobal.setTimeout
é¢æ°ã§ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ããå°ããå Žåãã°ããŒãã«setTimeoutïŒ_setTimeout
ä¿åïŒãçŽæ¥åŒã³åºããŸãã
ã°ããŒãã«clearTimeout
ãã©ãããããããŒã«ã«ãããããid
ãåé€ããŠã¯ãªãŒã³ã¢ããããã»ã¹ãå®è¡ããŸãã
ããã圹ã«ç«ãŠã°å¹žãïŒããã¯å®éã«åé¡ã«å¯ŸåŠããŸããããããšãåã«èŠåãåé€ããŸããïŒ
ããããåé¡ã«å¯ŸåŠããŠããŸããã ããã¯ã¡ããã©è¯ãåé¿çã§ãã
ããã«ã¡ã¯ãã³ãŒãïŒããããïŒ firebase / firebase-js-sdkïŒ97ïŒã³ã¡ã³ãïŒ ïŒã¯ã
setTimeout
ïŒã°ããŒãã«ïŒé¢æ°ãã©ããããã ãã§ãé·æé䜿çšãããªãããã«ããŸãã
å€æŽããglobal.setTimeout
é¢æ°ã§ã¯ãç¶ç¶æéããããå€MAX_TIMER_DURATION_MS
ãã倧ããå Žåãid
ãããŒã«ã«ãããïŒtimerFix
ïŒã«ä¿åããŠããä¿åããŸããrunTask
ãåŒã³åºããŸããããã«ãããç¶ç¶æéãããå°ããªå€ã«åå²ãããŸããrunTask
ã¯ãïŒå ã®_setTimeout
ã䜿çšããŠïŒã¿ã€ã ã¢ãŠããèšå®ããwaitingTime
ãå°ãããããŸã§ç¶ç¶çã«å®è¡ãããå°ããªãã£ã³ã¯ã䜿çšããŸãã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å€åïŒ @dulmandakh
ã¿ã€ããŒãæéåãã«ãªããŸã§ãåºå®æéã§ã¿ã€ããŒãåã¹ã±ãžã¥ãŒã«ã§ããŸãã
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幎ãçµã¡ãŸãã-ãã€ãã£ããŸãã¯firebaseããã®åé¡ãé©åã«ä¿®æ£ããŸãã :(
æ°æéã®é·ã調æ»ã®åŸãç§ãç¥ãããã®ã¯ãç§ãäœããã®çç±ã§åé¡ãåŒãèµ·ããããã©ããã ãã§ãã
ãã€ç»å Žããã®ãããããŸããã
ãã¡ã€ã€ãŒã¹ãã¢ã«é»è©±ãããšããã«ãããã¢ããããŸããïŒ
ã¢ããªã§ã¿ã€ããŒã䜿çšããŠããŸãã
@luismasgæªãç¿æ £ã§ãããããã³ãŒãã§setTimeoutã䜿çšããŠããŸãããããšã©ãŒã®åå ãããã£ãŠããŠåæ¢ã§ããŸãããããŒã¿ããŒã¹ãšã®ãªã¢ãŒãæ¥ç¶ã®ç¢ºç«ã«
æ£çŽãªãšããã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 AmplifyDatastoreã§ãããçºçããŠããŸãã é©åãªä¿®æ£ã®ä»£ããã«ãèŠåãç¡å¹ã«ããŸã
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ã䜿çšããŠããŸã...
圌ãã決å®çãªæ¹æ³ã§ããã解決ãããŸã§...
import {YellowBox} from "react-native";
import _ from "lodash";
YellowBox.ignoreWarningsïŒ["ã¿ã€ããŒã®èšå®"]ïŒ;
const _console = _.cloneïŒconsoleïŒ;
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ã¯ã©ãã§ããïŒ
å€ãFirebaseSDKã䜿çšããŠããå Žåã¯ãfirestore adminSDKã«ç§»è¡ããŠãã ããã
ã»ãšãã©ã®åé¡ã¯è§£æ±ºãããŸã
ããã§ã誰ããã®åé¡ã解決ããããšã¯ã§ããŸããã ïŒéçºè ã®æ¥; 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ãšã³ããã€ã³ããçŽæ¥äœ¿çšããããã«æ»ããŸããã authãšfirestoreã ããå¿ èŠã ã£ãã®ã§ãããã§åé¡ã¯ããªãç°¡åã«è§£æ±ºããŸããã ããã§ã¹ããããïŒ
ç§ã¯æ¬¡ã®ããã«AppïŒïŒå ã§ãããè¡ããŸããïŒ
import {YellowBox} from'react-native ';
ããã©ã«ãé¢æ°ã®ãšã¯ã¹ããŒãAppïŒïŒ{
YellowBox.ignoreWarningsïŒ['ã¿ã€ããŒã®èšå®']ïŒ;
..ã
..ã
..
}
èŠããŠãã
ç§ãããããšãšããã¯ç§ãšäžç·ã«åããŠããŸãããããã§ããããè¯ãç¿æ £ã§ãããã©ããã¯ããããŸãã
ãã¡ã€ã«ã«ç§»å
node_modulesreact-native \ Libraries \ Core \ TimersJSTimers.js
é¢æ°const MAX_TIMER_DURATION_MS = 60 * 1000
ãããæéã60 * 100000ã«å¢ããããšããã衚瀺ãããªããªããŸããã
ã¡ãã£ãšãããã
ãã®åé¡ã¯çŽ3幎åã®ãã®ã§ããããŸã ãã®èŠåããããŸã;ïŒ
@RWOverdijkãèšã£ãããã«ãèŠåãç¡èŠããããšã¯è§£æ±ºçã§ã¯ãããŸããã
ç§ãéãã解決çã¯ãã§ã«ãããŸããïŒ
ããããšã<3
ã¿ãªããããã®åé¡ãããã¯ããããšã«ããŸããã ãã®åé¡ãå€ãã®çããã«ãšã£ãŠèç«ãããããšã§ããããšãç§ã¯ç¥ã£ãŠããŸããç§ãã¡ããã®æ±ºå®ãäžããŠããçç±ãç解ããã®ãæäŒããããšæããŸãã
React Nativeã«ã¯ã setTimeout
ãããªJSã¿ã€ããŒã®ã«ã¹ã¿ã å®è£
ããããŸãã Androidã§ã¯ãJSã¿ã€ããŒããã€ãã£ãåŽã§è¿œè·¡ããããã€ãã£ãåŽããããã®ã¿ã€ããŒãããªã¬ãŒããã¿ã€ãã³ã°ã決å®ããŸãã ããã«ãããReact Nativeã¯ãã¿ã€ããŒãããªã¬ãŒãããã¿ã€ãã³ã°ãç¹ã«ã¿ã€ããŒãã¢ããªã®ã©ã€ããµã€ã¯ã«ãšã¬ã³ããªã³ã°ã«ã©ã®ããã«é¢é£ãããã«ã€ããŠããã¹ããŒãã«ãªããŸãã
ã³ãŒããèªãã§å°ããã¹ãããŠã¿ãç§ã®ç解ã¯æ¬¡ã®ãšããã§ãã
ããã¯äž»ã«æ£ç¢ºæ§ã®åé¡ã§ãããããã©ãŒãã³ã¹ã®åé¡ã§ã¯ãªããšæããŸãã åé¡ã¯ããŠãŒã¶ãŒãã¢ããªã®ããã¯ã°ã©ãŠã³ããèšå®ããŠããå Žåãé·ãã¿ã€ããŒã«é Œãããšãã§ããªãããšã§ãã
åŸã§ã¢ããªãåã³ãã©ã¢ã°ã©ãŠã³ãã«ãªã£ããšãã«ã¿ã€ããŒãã¢ã¯ãã£ãã«ããŠãããŸããªãå Žåã¯ãYellowBoxã®èŠåãç¡èŠããããšããå§ãããŸãã
äžæ¹ãã¿ã€ããŒãã»ãã·ã§ã³ã®åç¶æéäžã«åŒã³åºãããããšãäºæ³ããããã©ã¢ã°ã©ãŠã³ãã§å床ããªã¬ãŒãããã¹ãã§ã¯ãªãå Žåã¯ãã¿ã€ããŒããã©ã¢ã°ã©ãŠã³ãã§ç¡èŠãããããã«ããããã«äœããè¡ãå¿ èŠããããŸãã
ãããã®ãµãŒãããŒãã£ã©ã€ãã©ãªã®è©³çŽ°ã¯ããããŸããã ããã¯æçµçã«äžèšã®è³ªåã«åž°çããŸãã ãããã®ãµãŒãããŒãã£ã©ã€ãã©ãªã§ããã©ã¢ã°ã©ãŠã³ãã§è§£æ±ºãããã¿ã€ããŒã®åŠçã§åé¡ãçºçããå Žåã¯ããããä¿®æ£ããæ¹æ³ãèŠã€ããå¿ èŠããããŸãã äžèšã®ã³ã¡ã³ãã®äžã«ã¯ãããšãã°Firebaseã§ãããè¡ãæ¹æ³ãææ¡ããŠãããã®ããããŸãã ãã ããæçµçã«ã¯ãReactNativeã念é ã«çœ®ããŠç¹å¥ã«éçºãããã©ã€ãã©ãªã«äŸåããæ¹ãããå ŽåããããŸãã
äžæ¹ããµãŒãããŒãã£ã©ã€ãã©ãªã§ã¿ã€ããŒããã©ã¢ã°ã©ãŠã³ãã§è§£æ±ºãããåé¡ããªãå Žåã¯ããšã©ãŒãç¡èŠã§ããŸãã
setTimeout
ãAlarmManager
ééã§ããªãã®ã§ããïŒAlarmManager
ã¯ãããã¯ã°ã©ãŠã³ãã«ããå Žåã«ã¢ããªããŠã§ã€ã¯ã¢ããããŸãã setTimeout
ãããªã¿ã€ããŒãã¢ããªããŠã§ã€ã¯ã¢ããããå¿
èŠã¯ãªããšèããŠããŸãã ãããã®é·ãã¿ã€ããŒã®ã»ãšãã©ã¯ã¿ã€ã ã¢ãŠããªã©ã«èšå®ãããŠãããã¢ããªãéããŠããéã®ã¿é¢é£ããŸãã ããã¯ã°ã©ãŠã³ãã§ã¢ããªããŠã§ã€ã¯ã¢ããããã®ã¯ã³ã¹ããããããããéçºè
ãæ瀺çã«ãã®æå³ãæã£ãŠããå Žåã«ã®ã¿å®è¡ããå¿
èŠããããŸãã
åæã«ãå€ãã®äººããããããã®ãããªãã®ãå¿
èŠãšããŠããŸãã setTimeout
çµç±ããªãAPIãéçºããããšãã§ããŸãã ããããçŸåšã®ãªãŒã³ã³ã¢ã®åãçµã¿ã«ãããå®éã«ã¯ReactNativeã®APIãµãŒãã§ã¹ã®å¢å ãåé¿ããããšããŠããŸãã ããã¯ã react-native-background-timer
ãããªãµãŒãããŒãã£ã©ã€ãã©ãªã«ãã£ãŠæãé©åã«åŠçãããã¿ã¹ã¯ã§ãããšèããŠããŸãã
éçºè
ã«äœãèµ·ãã£ãŠããã®ããç¥ã£ãŠãããããã®ã§ãã 誰ããsetTimeout
ã®æ£ç¢ºãã«äŸåããã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå Žåãéçºè
ã¯ãã®æ£ç¢ºããä¿èšŒã§ããªãããšã«æ³šæããå¿
èŠããããšæããŸãã ãã®èŠåãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã§éèŠãã©ãããå€æããã®ã¯ãåã
ã®éçºè
ã«ä»»ããããšæããŸãã
æãåèã«ãªãã³ã¡ã³ã
@ skv-ãããã¬ã¹æèŠãå ¥ããŸãã :)
ç§ã®æèŠã§ã¯ãåé¡ã«å¯Ÿããæ 床ã¯ãªããªãå¿ èŠããããŸãã ç§ã¯ãããããé »ç¹ã«ãããã¢ããããã®ãèŠãŠããŸããããããŠããã¯äººã ã«èŠåãç¡èŠãããŠããŸãã ãããã¯èŠåã§ãã 圌ãã¯ããªãã«èŠåããŸãã ããããç¡èŠããªãã§ãäœããããŠãã ããã éæšå¥šã®éç¥ãå«ãããã¹ãŠã®èŠåãç¡èŠãããã¢ããªãèŠãããšããããŸãã ãã®åŸãã¢ããªãå£ããŠããªãã ãããšæããŸãŸã«ãªããŸãã
ãã®å Žåããããã®ã¿ã€ã ã¢ãŠããæ§æããŠççž®ããããããããåŠçããå¥ã®ã¢ãããŒããèšå®ã§ããŸãã ãã¶ããå³æžé€šã®ã¡ã³ãããçªããŠã解決çãèãåºãã®ãæäŒã£ãŠãããããã«é ŒãããšãããããŸãã
ç§ã®ã¢ããã€ã¹ã¯ãè³¢ã誰ããå®éã®è§£æ±ºçãæãä»ããŸã§ãã®ã¹ã¬ããããã©ãããšã§ããããããã°ããã®çãã§èªåèªèº«ãæè²ããããšãã§ããŸãã ãããŠãããããããã®éïŒåé¡ã解決ã§ããªã/ããããªãå ŽåïŒãèŠåãç¡èŠããŸãã
TL; DR;
ã¯ããäžæçã«èŠåãç¡èŠããããšãã§ããŸãã æã ãã§ãã¯ã€ã³ããŠãã¹ããŒã¿ã¹ãäœã§ãããããããŠå¿ èŠãªã¢ã¯ã·ã§ã³ããããã©ããã確èªããŠãã ããã