{"id":2104,"date":"2020-06-11T17:19:37","date_gmt":"2020-06-11T08:19:37","guid":{"rendered":"http:\/\/blog.moramcnt.com\/?p=2104"},"modified":"2020-06-11T17:22:42","modified_gmt":"2020-06-11T08:22:42","slug":"react-native-%eb%b2%84%ec%a0%84%ec%97%85%ec%8b%9c-%eb%b0%9c%ec%83%9d%ed%95%98%eb%8a%94-%ed%8a%b8%eb%9f%ac%eb%b8%94%ec%8a%88%ed%8c%85","status":"publish","type":"post","link":"http:\/\/blog.moramcnt.com\/?p=2104","title":{"rendered":"react native \ubc84\uc804\uc5c5\uc2dc \ubc1c\uc0dd\ud558\ub294 \ud2b8\ub7ec\ube14\uc288\ud305"},"content":{"rendered":"<p>\uc2a4\ub9c8\ud2b8\ud3f0 SDK\uac00 \ucd5c\uc2e0\ubc84\uc804\uc73c\ub85c \uc5c5\uadf8\ub808\uc774\ub4dc\uc2dc npm \uc744 \ud1b5\ud574 \ubc1b\uc740 node_modules\ub4e4\uc774 \uc608\uc804\uc5d0 \uc791\uc131\ud558\uace0 \uc5c5\ub370\uc774\ud2b8\uac00 \uc548\ub418\uc5b4 \uc788\ub294 \uacbd\uc6b0 \uc544\ub798\ucc98\ub7fc \uc9c1\uc811<br \/>\n\uc218\uc815\ud574\uc57c \ud558\ub294\uacbd\uc6b0\uac00 \ubc1c\uc0dd\ud558\uc5ec \uac04\ub2e8\ud788 \uc815\ub9ac\ud574\ubd04.<\/p>\n<p><b>1. \ud0c0\uc774\uba38(react-native-background-timer)<\/b><br \/>\n1) \uc704\uce58 <\/p>\n<pre>\r\nnode_modules\\react-native-background-timer\\android\\src\\main\\java\\com\\ocetnik\\timer\\\r\n<\/pre>\n<p>2) \uc5d0\ub7ec\ub0b4\uc6a9<br \/>\n Error: Tag name should use a unique prefix followed by a colon &#8230;<br \/>\n3) \uc218\uc815\uc0ac\ud56d<\/p>\n<pre>\r\nthis.wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, \"rohit_bg_wakelock\");\r\n<\/pre>\n<p>\uc5d0\uc11c<\/p>\n<pre>\r\nthis.wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, \" ocetnik:rohit_bg_wakelock\");\r\n<\/pre>\n<p>\ub85c \uc218\uc815<\/p>\n<p><b>2. \ube44\ucf58(react-native-beacons-manager)<\/b><br \/>\n1) \uc704\uce58 <\/p>\n<pre>\r\nnode_modules\\react-native-beacons-manager\\android\\build.gradle\r\n<\/pre>\n<p>2) \uc5d0\ub7ec\ub0b4\uc6a9<br \/>\nError: Google Play requires that apps target API level 26 or higher. <\/p>\n<p>3) \uc218\uc815\uc0ac\ud56d<br \/>\n\ucef4\ud30c\uc77c\ubc84\uc804, \ud0c0\uac9f\ubc84\uc804 26(\ucd5c\uc18c\ubc84\uc804)\uc73c\ub85c \uc218\uc815<\/p>\n<pre>\r\ncompileSdkVersion 26\r\ntargetSdkVersion 26\r\n<\/pre>\n<pre>\r\ncompile 'com.facebook.react:react-native:0.12.+'\r\n<\/pre>\n<p>\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815<\/p>\n<pre>\r\ncompile \"com.facebook.react:react-native:+\"\r\n<\/pre>\n<p><b>3. \uc624\ub9ac\uc5d4\ud14c\uc774\uc158(react-native-orientation)<\/b><br \/>\n1) \uc704\uce58<\/p>\n<pre>\r\nnode_modules\\react-native-orientation\\android\\build.gradle:9: \r\n<\/pre>\n<p>2) \uc5d0\ub7ec\ub0b4\uc6a9<br \/>\nError: Google Play requires that apps target API level 26 or higher. <\/p>\n<p>3) \uc218\uc815\uc0ac\ud56d<\/p>\n<pre>\r\n   [ExpiredTargetSdkVersion]\r\n      targetSdkVersion 22\r\n<\/pre>\n<p>\ucee4\ud30c\uc77c\ubc84\uc804, \ud0c0\uac9f\ubc84\uc804 28(\ucd5c\uc18c\ubc84\uc804)\uc73c\ub85c \uc218\uc815<\/p>\n<pre>\r\ncompileSdkVersion 28\r\ntargetSdkVersion 28\r\n<\/pre>\n<p><b>4. \ud3f0 \uae68\uc6b0\ub294\uae30\ub2a5(react-native-wakeful)<\/b><br \/>\n1) \uc704\uce58<br \/>\nnode_modules\\react-native-wakeful\\android\\src\\main\\java\\com\\ironsmile\\RNWakeful\\RNWakefulModule.java:25:<\/p>\n<p>2) \uc5d0\ub7ec\ub0b4\uc6a9<br \/>\n Error: Tag name should use a unique prefix followed by a colon (found RNWakeful). For instance myapp:mywakelocktag. This will help with debugging [InvalidWakeLockTag]\n<p>3) \uc218\uc815\uc0ac\ud56d<\/p>\n<pre>\r\nthis.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, \"RNWakeful\");\r\n\u2026\r\nthis.wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL, \"RNWakefulWifi\");\r\n<\/pre>\n<p>\uc5d0\uc11c<\/p>\n<pre>\r\nthis.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, \"ironsmile:RNWakeful\");\r\n\u2026\r\nthis.wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL, \"ironsmile:RNWakefulWifi\");\r\n<\/pre>\n<p>\ub85c \uc218\uc815<\/p>\n<p><b>5. \ud3f0 \uae68\uc6b0\ub294\uae30\ub2a5(react-native-wakeful) Gradle\uc5d0\ub7ec<\/b><br \/>\n1) \uc704\uce58<br \/>\nnode_modules\\react-native-wakeful\\android\\build.gradle<\/p>\n<p>2) \uc5d0\ub7ec\ub0b4\uc6a9<br \/>\nError: Google Play requires that apps target API level 26 or higher.<\/p>\n<p>3) \uc218\uc815\uc0ac\ud56d<\/p>\n<pre>\r\n   [ExpiredTargetSdkVersion]\r\n      targetSdkVersion 23\r\n      ~~~~~~~~~~~~~~~~~~~\r\n<\/pre>\n<p>\ucee4\ud30c\uc77c\ubc84\uc804, \ud0c0\uac9f\ubc84\uc804 26\uc73c\ub85c \uc218\uc815<\/p>\n<pre>\r\ncompileSdkVersion 28\r\ntargetSdkVersion 28\r\n<\/pre>\n<pre>\r\ncompile 'com.facebook.react:react-native:0.12.+'\r\n<\/pre>\n<p>\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815<\/p>\n<pre>\r\ncompile \"com.facebook.react:react-native:+\"\r\n<\/pre>\n<p><b>6. \ud3f0 \uae68\uc6b0\ub294\uae30\ub2a5(react-native-wakeful) React Native Plugin \uc5d0\ub7ec<\/b><br \/>\n1) \uc704\uce58<br \/>\nnode_modules\\react-native-wakeful\\android\\src\\main\\java\\com\\ironsmile\\RNWakeful\\RNWakefulPackage.java<\/p>\n<p>2) \uc5d0\ub7ec\ub0b4\uc6a9<\/p>\n<p>3) \uc218\uc815\uc0ac\ud56d<\/p>\n<pre>\r\n@Override\r\npublic List<Class<? extends JavaScriptModule>> createJSModules() {\r\n    return Collections.emptyList();\r\n  }\r\n<\/pre>\n<p>\uc5d0\uc11c @Override \ub97c \uc8fc\uc11d\ucc98\ub9ac<\/p>\n<pre>\r\n\/\/ @Override\r\npublic List<Class<? extends JavaScriptModule>> createJSModules() {\r\n    return Collections.emptyList();\r\n  }\r\n<\/pre>\n<p><b>7. \uba54\ud2b8\ub85c \uad00\ub828(blacklist.js)<\/b><br \/>\n \uc774 \ud56d\ubaa9\uc740 react-native\ub97c \uba3c\uc800 \uc5c5\ub370\uc774\ud2b8 \ud558\uba74 \uc548\ub098\uc624\uc9c0\ub9cc, \uc5c5\ub370\uc774\ud2b8 \uc548\ud55c\uacbd\uc6b0 \uc544\ub798\ucc98\ub7fc \uc218\uc815\ud574\uc11c \ud574\uacb0<br \/>\n1) \uc704\uce58<br \/>\nnode_modules\\metro-config\\src\\defaults\\blacklist.js<\/p>\n<p>2) \uc218\uc815\uc0ac\ud56d<\/p>\n<pre>\r\nvar sharedBlacklist = [\r\n  \/node_modules[\/\\\\]react[\/\\\\]dist[\/\\\\].*\/,\r\n  \/website\\\/node_modules\\\/.*\/,\r\n  \/heapCapture\\\/bundle\\.js\/,\r\n  \/.*\\\/__tests__\\\/.*\/\r\n];\r\n<\/pre>\n<p>\uc5d0\uc11c<\/p>\n<pre>\r\nvar sharedBlacklist = [ \/node_modules[\\\/\\\\]react[\\\/\\\\]dist[\\\/\\\\].*\/, \/website\\\/node_modules\\\/.*\/, \/heapCapture\\\/bundle\\.js\/, \/.*\\\/__tests__\\\/.*\/ ];\r\n<\/pre>\n<p>\ub85c \uc218\uc815<\/p>\n<p><b>8. \ub514\ubc14\uc774\uc2a4\uc815\ubcf4<\/b><br \/>\nReact-native-device-info\ub294 \ucd5c\uc2e0\ubc84\uc804\uc774 \ub098\uc640 \uc788\uc5b4 \uc5c5\ub370\uc774\ud2b8 \ud558\uba74 \ub418\uc9c0\ub9cc \uc5c5\ub370\uc774\ud2b8\ub97c \uc548\ud560\uacbd\uc6b0 \uc544\ub798\ub97c \uc218\uc815<br \/>\n1) \uc704\uce58<br \/>\nnode_modules\\react-native-device-info\\android\\src\\main\\java\\com\\learnium\\RNDeviceInfo\\RNDeviceModule.java:270:   <\/p>\n<p>2) \uc5d0\ub7ec\ub0b4\uc6a9<br \/>\n  Error: Exception requires API level 21 (current min is 16): android.hardware.camera2.CameraAccessException, and having a surrounding\/preceding version check does not help since prior to API level 19, just loading the class will cause a crash. Consider marking the surrounding class with RequiresApi(19) to ensure that the class is never loaded except when on API 19 or higher. [NewApi]\n        } catch (CameraAccessException e) {<br \/>\n                 ~~~~~~~~~~~~~~~~~~~~~<\/p>\n<p>3) \uc218\uc815\uc0ac\ud56d<br \/>\n&#8220;react-native-device-info&#8221;: &#8220;^2.3.2&#8221; \ub97c \uc81c\uac70\ud558\uace0<\/p>\n<pre>\r\nnpm uninstall react-native-device-info\r\n<\/pre>\n<p>\ucd5c\uc2e0\ubc84\uc804 \uc124\uce58(5.5.4 \ubc84\uc804\uc73c\ub85c \uccb4\uc778\uc9c0)<\/p>\n<pre>\r\nnpm install react-native-device-info --save\r\n<\/pre>\n<p><b>9. build.Gradle \ud658\uacbd<\/b><br \/>\n1) \uc218\uc815\uc0ac\ud56d<br \/>\n\ucef4\ud30c\uc77c\uc624\ub958\ub85c \uc778\ud558\uc5ec \uc544\ub798\ucc98\ub7ec \uc218\uc815<\/p>\n<p>\ud50c\ub808\uc774\uc11c\ube44\uc2a4\uc640 Firebase\uc758 \ubc84\uc804\uc774 \ub3d9\uc77c\ud574\uc57c \ud558\ubbc0\ub85c \ub3d9\uc77c\ud558\uac8c \ub9de\ucda4<\/p>\n<pre>\r\nimplementation \"com.google.android.gms:play-services-location:17.0.0\"\r\nimplementation \"com.google.android.gms:play-services-base:16.1.0\"\r\nimplementation \"com.google.firebase:firebase-core:16.0.9\"\r\n<\/pre>\n<p>\uc744<\/p>\n<pre>\r\nimplementation \"com.google.android.gms:play-services-location:17.0.0\"\r\nimplementation \"com.google.android.gms:play-services-base:17.0.0\"\r\nimplementation \"com.google.firebase:firebase-core:17.0.0\"\r\n<\/pre>\n<p>\ub85c \uc218\uc815<\/p>\n<p><b>10. react-native \ucd5c\uc2e0\ubc84\uc804 \uc5c5\ub370\uc774\ud2b8<\/b><br \/>\n1) \uc5d0\ub7ec\ub0b4\uc6a9<br \/>\n\uc544\ub798 \uc5d0\ub7ec\ub85c \uc778\ud558\uc5ec \uc5c5\ub370\uc774\ud2b8 \ucc98\ub9ac<\/p>\n<pre>\r\nerror React Native CLI uses autolinking for native dependencies, but the following modules are linked manually:\r\n  - react-native-device-info (to unlink run: \"react-native unlink react-native-device-info\")\r\nThis is likely happening when upgrading React Native from below 0.60 to 0.60 or above. Going forward, \r\nyou can unlink this dependency via \"react-native unlink <dependency>\" and it will be included in your app automatically. \r\nIf a library isn't compatible with autolinking, disregard this message and notify the library maintainers.\r\n<\/pre>\n<p>2) \uc218\uc815\uc0ac\ud56d<br \/>\n&#8211; \uce90\uc2dc \ud074\ub9b0<\/p>\n<pre>\r\nnpm cache clean --force\r\n<\/pre>\n<p>&#8211; react-native \ubc84\uc804 0.60.4\uc744 \uc81c\uac70<\/p>\n<pre>\r\nnpm uninstall react-native\r\n<\/pre>\n<p>&#8211; \uc2e0\ubc84\uc804 \uc124\uce58(0.62.0)<\/p>\n<pre>\r\nnpm install react-native --save\r\n<\/pre>\n<p><b>11. async-storage \ucd5c\uc2e0\ubc84\uc804 \uc5c5\ub370\uc774\ud2b8<\/b><br \/>\n1) \uc5d0\ub7ec\ub0b4\uc6a9<br \/>\n \uba54\uc18c\ub4dc \uc0ac\uc6a9\ubc29\ubc95\ubcc0\uacbd\uc73c\ub85c \uc624\ub958<\/p>\n<p>2) \uc218\uc815\uc0ac\ud56d<br \/>\n\uc2e0\ubc84\uc804 \uc5c5\ub370\uc774\ud2b8<\/p>\n<p>&#8211; \uc81c\uac70<\/p>\n<pre>\r\nnpm uninstall @react-native-community\/async-storage\r\n<\/pre>\n<p>&#8211; \uc2e0\ubc84\uc804\uc124\uce58(1.8.1)<\/p>\n<pre>\r\nnpm install @react-native-community\/async-storage \u2013save\r\n<\/pre>\n<p><b>12. react-native \uc5c5\ub370\uc774\ud2b8\ud6c4 \uc571 \ud06c\ub798\uc26c \ub098\uc628\uacbd\uc6b0<\/b><br \/>\n1) \uc5d0\ub7ec\ub0b4\uc6a9<\/p>\n<pre>\r\n2020-04-01 15:06:38.177 12257-12285\/? E\/AndroidRuntime: FATAL EXCEPTION: create_react_context\r\n    Process: kr.co.transhub, PID: 12257\r\n    java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libfbjni.so caused by: Didn't find class \"com.facebook.jni.NativeRunnable\" on path: DexPathList[[zip file \"\/data\/app\/kr.co.transhub-VszmjqWt0xirxB8bmxGG2A==\/base.apk\"],nativeLibraryDirectories=[\/data\/app\/kr.co.transhub-VszmjqWt0xirxB8bmxGG2A==\/lib\/arm64, \/data\/app\/kr.co.transhub-VszmjqWt0xirxB8bmxGG2A==\/base.apk!\/lib\/arm64-v8a, \/system\/lib64]]\r\n        at com.facebook.soloader.SoLoader.a(Unknown Source:325)\r\n        at com.facebook.soloader.SoLoader.a(Unknown Source:104)\r\n        at com.facebook.soloader.SoLoader.a(Unknown Source:108)\r\n        at com.facebook.soloader.SoLoader.a(Unknown Source:1)\r\n        at com.facebook.soloader.j.a(Unknown Source:0)\r\n        at com.facebook.soloader.o.a.a(Unknown Source:10)\r\n        at com.facebook.jni.HybridData.<clinit>(Unknown Source:2)\r\n        at com.facebook.react.bridge.WritableNativeMap.initHybrid(Native Method)\r\n        at com.facebook.react.bridge.WritableNativeMap.<init>(Unknown Source:0)\r\n        at com.facebook.react.jscexecutor.a.create(Unknown Source:2)\r\n        at d.b.m.r$e.run(Unknown Source:58)\r\n        at java.lang.Thread.run(Thread.java:764)\r\n\r\n<\/pre>\n<p>2) \uc218\uc815\uc0ac\ud56d<br \/>\nproguard-rules.pro\ud30c\uc77c\uc758 \ud558\ub2e8\uc5d0 \uc544\ub798\ub97c \ucd94\uac00<\/p>\n<pre>\r\n-keep class com.facebook.jni.** { *; }\r\n<\/pre>\n<p>&#8211; \ucc38\uace0: https:\/\/stackoverflow.com\/questions\/60927048\/react-native-app-release-build-crashes-on-start-works-fine-in-debug-why<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc2a4\ub9c8\ud2b8\ud3f0 SDK\uac00 \ucd5c\uc2e0\ubc84\uc804\uc73c\ub85c \uc5c5\uadf8\ub808\uc774\ub4dc\uc2dc npm \uc744 \ud1b5\ud574 \ubc1b\uc740 node_modules\ub4e4\uc774 \uc608\uc804\uc5d0 \uc791\uc131\ud558\uace0 \uc5c5\ub370\uc774\ud2b8\uac00 \uc548\ub418\uc5b4 \uc788\ub294 \uacbd\uc6b0 \uc544\ub798\ucc98\ub7fc \uc9c1\uc811 \uc218\uc815\ud574\uc57c \ud558\ub294\uacbd\uc6b0\uac00 \ubc1c\uc0dd\ud558\uc5ec \uac04\ub2e8\ud788 \uc815\ub9ac\ud574\ubd04. 1. \ud0c0\uc774\uba38(react-native-background-timer) 1) \uc704\uce58 node_modules\\react-native-background-timer\\android\\src\\main\\java\\com\\ocetnik\\timer\\ 2) \uc5d0\ub7ec\ub0b4\uc6a9 Error: Tag name should use a unique prefix followed by a colon &#8230; 3) \uc218\uc815\uc0ac\ud56d this.wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, &#8220;rohit_bg_wakelock&#8221;); \uc5d0\uc11c this.wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, &#8221; ocetnik:rohit_bg_wakelock&#8221;); \ub85c [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[21],"tags":[265,259,264,263],"class_list":["post-2104","post","type-post","status-publish","format-standard","hentry","category-mobile","tag-node_modues-","tag-react-native","tag-264","tag-263"],"_links":{"self":[{"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=\/wp\/v2\/posts\/2104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2104"}],"version-history":[{"count":2,"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=\/wp\/v2\/posts\/2104\/revisions"}],"predecessor-version":[{"id":2106,"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=\/wp\/v2\/posts\/2104\/revisions\/2106"}],"wp:attachment":[{"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2104"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.moramcnt.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}