iOS ์ฑ ์์์ ๋ฌด์์๋ก์ด ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค (ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋).
์
์
์ด์์ฒด์ : macOS Sierra 10.12.6
๋
ธ๋ : 6.10.2
ํธ์ค : 1.0.2
npm : 5.4.2
ํ์๊พผ : 4.7.0
Xcode : Xcode 9.0 ๋น๋ ๋ฒ์ 9A235
์๋๋ก์ด๋ ์คํ๋์ค : 2.1 AI-143.2915827
ํจํค์ง : (์ํจ => ์ค์น๋จ)
๋ฐ์ : ^ 16.0.0 => 16.0.0
๋ฐ์ ๋ค์ดํฐ๋ธ : ^ 0.49.3 => 0.49.3
๊ฒฝ๊ณ ์์
ํด๋น ์์
https://github.com/antoinerousseau/react-native-custom-components
https://github.com/rebeccahughes/react-native-device-info
https://github.com/evollu/react-native-fcm
https://github.com/gwmccull/react-native-polyfill
https://github.com/getsentry/react-native-sentry
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค!
iOS ์ฉ ๋ ธ๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ด๊ฒ๋ ๋ด
๋๋ค. # 11196๊ณผ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ค์๋ก๋ํ๋ ค๊ณ ํ ๋ ์ฑ์ด ์ถฉ๋ํ๋ ์์ธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ์คํจํ๋ค
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This method must not be called before the JS thread is created'
๋๋ ๋ํ iOS 11์์ ๋๋๋ก์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ด๊ฒ์ ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค. ์ด ๊ฒฝ์ฐ Stacktrace๋ ์ ํ ๋์์ด๋์ง ์์ต๋๋ค.
+1
+1
+1
์ถ๊ฐ๋ฅผ ์ค์งํ์ญ์์ค.์ด ๊ฒฝ์ฐ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ง ์๋ ์ด๋ฉ์ผ ์๋ฆผ์ด ์์ฑ๋ฉ๋๋ค. ๋์ "๋ฐ์ ์ถ๊ฐ"๊ธฐ๋ฅ์ ์ฌ์ฉํ์ญ์์ค.
๊ฐ์ ๋ฌธ์ . ๋ด๊ฐ ์ฌ์ฉํ๋ ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@antoinerousseau ๋ชฉ๋ก๊ณผ์ ๊ต์ฐจ์ ์ ๊ณ ๋ คํ ๋์ด ๋ฒ๊ทธ์ ๊ฐ๋ฅํ ์์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฐฉ๊ธ react-native-device-info๋ฅผ ์ถ๊ฐํ๊ณ rn 0.49์์ 0.50์ผ๋ก ์ด๋ํ์ต๋๋ค. ์ด์ ์ด ๋ฒ๊ทธ๋ฅผ ์ฐพ์์ต๋๋ค. ๊ทธ๊ฒ ๋ฌธ์ ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ด๊ฐ ์ด๊ฑธ ๋ฐ์์ ๋์ผ.
๊ฐ์ ๋ฌธ์ ...
๊ทธ๋์ ๋ด ์๋ชป์ด ์๋ ์์ด?
๊ฐ์ ๋ฌธ์ ... ์ด๋ค ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
๊ฐ์ ๋ฌธ์ . ์ ๋ชฉ๋ก์์ ์ฌ์ฉํ๋ ์ ์ผํ ํจํค์ง๋ react-native-sentry
์
๋๋ค.
์ค๋ ์ฌ๊ธฐ์์ ๊ฐ์ ๋ฌธ์ ๋ก ์๋ก์ด ์ฑ์ ์์ํ๊ณ ๋ด๊ฐ ์ถ๊ฐ ํ ํจํค์ง ๋ง
"native-base": "^ 2.3.3",
"๋ฐ์": "16.0.0",
"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.50.3",
"react-native-fcm": "^ 10.0.3"
์๋
ํ์ธ์.
+1
"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.49.3",
๋ฌด์์๋ก ์ฒ์๋ก๋ ํ ๋ ์ฑ์ด ๋ค์ด๋์์ต๋๋ค.
์๋ฌด๋ ๊ทธ๊ฒ์ ํด๊ฒฐ ํ์ต๋๊น ??
@dantman ๋๋ react-native-device-info๋ฅผ ์ค์น ํ ์งํ์ ๋ฌธ์ ๋ฅผ๋ณด๊ธฐ ์์ ํ์ผ๋ฏ๋ก ์ ์ด๋ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ํด๋น ํน์ ํจํค์ง์ ๊ด๋ จ์ด ์๋ค๊ณ ์์ฌํฉ๋๋ค.
๋ด๊ฐ ๊ฝค ์ค๋ ์ ์ ์๋ฌด๋ฐ ๋ฌธ์ ์์ด ์ค์น ํ react-native-keychain์ ์ฌ์ฉํ๊ณ ์๋ ์ ์ผํ ๋ค๋ฅธ ํจํค์ง์ด๋ฏ๋ก ์ข์ ์ ํ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
rebeccahughes / react-native-device-info # 260์ RNDeviceInfo
๋ฅผ ์ฐธ์กฐํ๋ ๋ฉ์์ง๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐ๋ฉด์ด ๋ฒ๊ทธ๋ RCTDevLoadingView
ํฉ๋๋ค. ๋ฐ๋ผ์์ด ๊ฒฝ๊ณ ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ์ง์ ์ด ๋ ์ด์์์ ์ ์์ต๋๋ค.
๋ค์ ์ค์ ์ค๋จ ์ ์ ๋ฃ๋ ๊ฒฝ์ฐ :
RCTLogWarn(@"RCTBridge required dispatch_sync to load %@. This may lead to deadlocks", _moduleClass);
RCTDevLoadingView
๋ก๋๋ฅผ ๋ด๋นํ๋ ๋ชจ๋ / ์คํ์ ํ์ธํ ์ ์์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ RCTCxxBridge.mm
์์ ์๊ฒฉ ๋ฒ๋ค์๋ก๋ํ๊ณ ๋ค์ด๋ก๋ ์งํ๋ฅ ์๋ณด๊ณ ํ๋ RCTDevLoadingView
.
... onProgress:^(RCTLoadingProgress *progressData) {
#if RCT_DEV && __has_include("RCTDevLoadingView.h")
RCTDevLoadingView *loadingView = [weakSelf moduleForClass:[RCTDevLoadingView class]];
[loadingView updateProgress:progressData];
#endif
}];
์ฌ๊ธฐ์์ RCTCxxBridge๋ moduleForClass
๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์์ง ์ฌ์ฉํ ์์๋ ๊ฒฝ์ฐ ๋ชจ๋์ ์ธ์คํด์ค๋ฅผ๋ก๋ํฉ๋๋ค. onProgress
๋ธ๋ก์ ์ฌ์ฉ ๋ ๋๊ธฐ์ด๋ก ์ธํด RCTDevLoadingView
๋ ๋น ๋ฉ์ธ ๋๊ธฐ์ด์๋ก๋๋๋ ๋ฐ๋ฉด RCTDevLoadingView
์๋ ๋ฉ์ธ ๋๊ธฐ์ด ์ค์ ์ด ํ์ํฉ๋๋ค.
๋ค์์ ์ฌ์ฉํ์ฌ RCTBridgeDelegate
์์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ์ฌ RCTDevLoadingView
๋ฅผ ๋๊ด์ ์ผ๋ก๋ก๋ํ์ฌ ๊ฒฝ๊ณ ๋ฅผ ํด๊ฒฐํ ์์์์ต๋๋ค.
- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge;
AppDelegate.m
์
๋ฐ์ดํธํ์ฌ ๊ฒฝ๊ณ ๋ฅผ ํด๊ฒฐํ ์์์์ต๋๋ค.
#if RCT_DEV
#import <React/RCTDevLoadingView.h>
#endif
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:jsCodeLocation
moduleProvider:nil
launchOptions:launchOptions];
#if RCT_DEV
[bridge moduleForClass:[RCTDevLoadingView class]];
#endif
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"Test"
initialProperties:nil];
...
}
๋ฐ์ ๋ค์ดํฐ๋ธ : 0.50.4
๊ฐ์ ๋ฌธ์ ...
๋ฐ์ ๋ค์ดํฐ๋ธ : 0.51.0
๊ฐ์ ๋ฌธ์ ...
"๋ฐ์": "16.2.0",
"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.52.0",
๊ฐ์ ๋ฌธ์ ...
"๋ฐ์": "16.2.0",
"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.51.0",
"react-native-device-info": "0.13.0"
์ฌ๊ธฐ์ ๋ด ํด๊ฒฐ์ฑ ์ react-native-device-info๋ฅผ pod ํ์ผ์์ ์ฎ๊ธฐ๊ณ ํ๋ก์ ํธ์์ ์๋์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ ๊ฐ์์ต๋๋ค. ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ CxxBridge๋ฅผ pod ํ์ผ์ React์ ํ์ ์ฌ์์ผ๋ก ํฌํจํ๋ ๊ฒ์ด ๋ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง Folly (๊ทธ๋ฆฌ๊ณ ๋ถ์คํธ)๊ฐ ํ์ํ๋ฉฐ ์ ์ฒด ์ค์ ์ด ๋ฒ๊ฑฐ๋กญ๊ณ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฝ๋๋ค. ๋น ๋ฅธ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ํจํค์ง๋ฅผ ํฌ๋์์ ์ ๊ฑฐํ๋ฉด๋ฉ๋๋ค.
์ค์น๋ "react-native-device-info"์์ :
0.54.2์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
"react": "16.3.0-alpha.2",
"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.54.2",
"react-native-action-button": "^ 2.8.4",
"react-native-admob": "^ 2.0.0-beta.4",
"react-native-animatable": "^ 1.2.4",
"react-native-awesome-alerts": "^ 1.0.7",
"๋ฐ์ ๋ค์ดํฐ๋ธ ์์": "^ 0.19.0",
"react-native-fbsdk": "^ 0.7.0",
"๋ฐ์ ๋ค์ดํฐ๋ธ ์ ํ ๊ทธ๋๋์ธํธ": "^ 2.4.0",
"react-native-parallax-scroll-view": "^ 0.21.0",
"๋ฐ์ ๋ค์ดํฐ๋ธ ํฌํ ๊ทธ๋ฆฌ๋": "0.0.2",
"react-native-responsive-dimensions": "^ 1.0.2",
"react-native-snap-carousel": "^ 3.6.0",
"๋ฐ์ ๋ค์ดํฐ๋ธ ๋ฒกํฐ ์์ด์ฝ": "^ 4.5.0",
"react-navigation": "^ 1.5.7"
"react-native-action-button": "^ 2.8.4", shadowStyle={{shadowOpacity: 0.9}}
์ถ๊ฐํ๋ฉด ๊ฒฝ๊ณ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค ..
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ฐ์ ๋ฌธ์ .
RN 0.54.4
์๋ฌด๋ ํด๊ฒฐ์ฑ ์ ์ป์์ต๋๊น?
์๋ก / ์๋ก ๋ง๋ ํ๋ก์ ํธ์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
"๋ฐ์": "16.3.1",
"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.54.4"
๊ฐ์
+1
@antoinerousseau ์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
@devburmistro์์ ์ ๊ณตํ๋ ์๋ฃจ์ ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ๋ด ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ํฌํจ์ผ๋ก ์ธํด ์๋ฎฌ๋ ์ดํฐ์์ ์คํํ ๋์ด ์ด์ค ์ ์ค๋ฅ ๊ฐ ์์์ ๋ฌด์์๋ก ๋ํ๋๋ ์ผ์ข ์ ๊ฒฝ์ ์กฐ๊ฑด
๋ด ์ค์ :
react-native-cli: 2.0.1
react-native: 0.53.0
๋ด ์ ์ฅ์๋ฅผ ์ฒ์๋ถํฐ ์ค์ ํ๊ณ ์์ํ js ์ฝ๋๋ฅผ ๋ค์ ์ฝ์ ํ ์งํ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ด์ ์ ์ฅ์์์ด ์ ์ ์ฅ์์ ์ ์ฌ์ ์ธ ์ฐจ์ด์ ์ ์ด์ Cocoapods๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค.
Cocoapods๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ฌ๋์ด ์์ต๋๊น?
๋ด๊ฐ ์ถ๊ฐ ํ ์งํ์ ์ผ์ด๋ ์ผ
๋ฐ์ ๋ค์ดํฐ๋ธ ๋ธ๋ฌ
๋ด๋ถ์ ์ค์ฒฉ ๋ ๊ณต์ ํ์ฅ๋ณด๊ธฐ์
๋ฐ์ ๋ค์ดํฐ๋ธ ๋ชจ๋ฌ ๋ฐ์ค
@Babazon ์ด ๋ฐ์ํ๋ฉด ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
์ฃ์กํฉ๋๋ค. ๊ณต์ ํ์ฅ๋ณด๊ธฐ์์ ๋๋ฒ๊ทธ / ์ฝ์ ๋ก๊ทธ๋ฅผ ํ ์ ์์๊ณ ๋ฉ์ธ ์ฑ๋ง์์์ต๋๋ค.
+1
๊ฒ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋ฌธ์ ๊ฐ ์ด์ ๋ฒ์ ์ React Native๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ต์ ๋ฆด๋ฆฌ์ค v0.55 ์์ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์์ต๋๊น?
๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
React Native 0.55์์ ์ฌ์ ํ ๋ฐ์ํ๋ @ react-native-bot ๋ฌธ์
@ react-native-bot cocoapods๋ฅผ ์ฌ์ฉํ์ฌ React Native๋ฅผ ๊ด๋ฆฌํ๋ฉด ๋ฌธ์ ๊ฐ ๋ํ๋ฉ๋๋ค.
๋ฒ์ 0.50.4 ๋ฐ 0.55.4๋ฅผ ์๋ํฉ๋๋ค.
React Native 0.55.3์ react-native-svg๋ฅผ ์ค์นํ๋๋ฐ์ด ๋ฌธ์ ๊ฐ ๋ํ๋ฌ์ต๋๋ค.
๋ค์์์ ์ฌ์ ํ ๋ฐ์ํ๋ ๋ฌธ์ :
๋ฐ์ ๋ค์ดํฐ๋ธ CLI : 2.0.1
๋ฐ์ ๋ค์ดํฐ๋ธ : 0.55.4
์ฝ๋๊ฐ ์ถ๊ฐ๋์ง ์๊ณ ์๋ก ์์ฑ ๋ ํ๋ก์ ํธ์ ๋๊ฐ์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ์ง๋ง Firebase ์ข
์์ฑ ๋ง ์ฝ์
๋์์ต๋๋ค.
๋๋ ์ฌ์ฉํ๊ณ ์๋ค : ๋ฐ์ : 16.3.1
๋ฐ์ ๋ค์ดํฐ๋ธ : 0.55.4
๊ฐ์ฌํฉ๋๋ค
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ง๋ง Xcode์์ ๋น๋๋ฅผ ๋ค์ ์คํํ ๋ ์ด์ ํฐ๋ฏธ๋ ์ฐฝ์ด ์คํ ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํฐ๋ฏธ๋๊ณผ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ข ๋ฃํ๊ณ ๋น๋๋ฅผ ๋ค์ ์คํํ๋ฉด์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
๋ํ react-native-device-info๊ฐ ์ค์น๋์ด ์์ง๋ง ๋ ธ๋์ ๋ฉ์์ง๊ฐ ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค. 'RCTBridge๊ฐ RCCManagerModule์๋ก๋ํ๋ ค๋ฉด dispatch_sync๊ฐ ํ์ํ์ต๋๋ค ...'
์ ์์๋ฅผ ๋ฐํํ๊ฑฐ๋ style
prop์ ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์์ ์ ๋ฌํ๊ธฐ ์ํด ๋ฐฐ์ด์ map
๋์ด ๊ฒฝ๊ณ ๊ฐ ํ์๋์ง๋ง ์ด์ ๊ฒฝ๊ณ ๊ฐ ์์ธกํ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
OS11์์๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฒกํฐ ์์ด์ฝ ์ฌ์ฉ์ ๋ํด ์ธ๊ธ ํ ๋ช ์ฌ๋์ด ์์ต๋๋ค.
๋๋ ๋ํ ๋์๊ฒ ๋์ผํ ๋ฌธ์ ๊ฐ ์์๊ณ react-native-device-info ์ฐ๊ฒฐ์ ํด์ ํ๊ณ ์ ๊ฑฐํ์ผ๋ฉฐ ์ด์ ๊ฒฝ๊ณ ๊ฐ ๋ํ๋์ง ์์ต๋๋ค.
react-native-vector-icons๋ฅผ ์ถ๊ฐ ํ ํ์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์ ๊ฑฐํ๊ณ ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ก์ต๋๋ค.
์ฐธ๊ณ ๋ก,์ด ๊ฒฝ๊ณ ๋ ์๊ฒฉ ๋๋ฒ๊ฑฐ๋ฅผ ์ผ๊ณ ๋ค์๋ก๋ ํ ํ ์ค๋ ๋ํ๋ฌ์ต๋๋ค. ์๊ฒฉ์ ๋๊ณ ๋ค์๋ก๋ํ์ผ๋ฉฐ ๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค. ์๊ฒฉ์ ๋ค์ ์ผ๊ณ ๋ค์๋ก๋ํ์ผ๋ฉฐ ๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก,์ด ๊ฒฝ๊ณ ๋ ์๊ฒฉ ๋๋ฒ๊ฑฐ๋ฅผ ์ผ๊ณ ๋ค์๋ก๋ ํ ํ ์ค๋ ๋ํ๋ฌ์ต๋๋ค. ์๊ฒฉ์ ๋๊ณ ๋ค์๋ก๋ํ์ผ๋ฉฐ ๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค. ์๊ฒฉ์ ๋ค์ ์ผ๊ณ ๋ค์๋ก๋ํ์ผ๋ฉฐ ๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค.
~ @mokriya ์ฃผ์์ ์ฝ์ ํ ๋๋ฒ๊ฑฐ๋ฅผ ๋ค์๋ก๋ํ๊ณ ๊ฒฝ๊ณ ํ์๋ฅผ ์ค์งํ์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ๋๋ฒ๊ฑฐ ํญ์ด ์ด๋ฆฐ ์ํ์์ Android์ IOS ์๋ฎฌ๋ ์ดํฐ / ์๋ฎฌ๋ ์ดํฐ ์ฌ์ด๋ฅผ ์ด๋ํ๋ฉด์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ~
์๋์์
iOS 12, RN 0.57.0 ๋์ผํ ๋ฌธ์ .
ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ?
์๋๋ฉด ๋ฌด์?
import { YellowBox } from 'react-native';
YellowBox.ignoreWarnings(['RCTBridge']);
์, react-native-video๋ฅผ ์ถ๊ฐ ํ ํ์๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๊ฒ ๋ฌด์จ ๋ป์ธ๊ฐ์? ๋์์ ์ฌ์์ ๋ฐฉํดํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ ์ด๋ฌํ ๋ชจ๋ ํ์ฌ ๊ตฌ์ฑ ์์๊ฐ ์ค๋ฅ๋ฅผ ์ผ์ผํค๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ค์ดํฐ๋ธ ๋ชจ๋์ ๊ฐ๋ฐํ ๋ ๋๋ฝ ๋ ๊ฒ์ด ์์ต๋๊น?
react-native-device-info
์์ด iOS 12.1, RN 0.57.4์์ ๋์ผํ ๋ฌธ์ ๋ฐ์
๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค
"lodash": "^4.17.10",
"react": "16.4.1",
"react-native": "0.56.0",
"react-native-check-box": "^2.1.0",
"react-native-collapsible": "^1.2.1",
"react-native-elements": "^0.19.1",
"react-native-google-analytics-bridge": "^5.8.0",
"react-native-google-places-autocomplete": "^1.3.9",
"react-native-map-clustering": "^1.3.0",
"react-native-maps": "^0.21.0",
"react-native-masked-text": "^1.7.2",
"react-native-modal-picker": "0.0.16",
"react-native-onesignal": "^3.2.8",
"react-native-simple-radio-button": "^2.7.2",
"react-native-svg": "^8.0.0",
"react-native-ui-kitten": "^3.0.1",
"react-native-vector-icons": "^5.0.0",
"react-navigation": "^2.11.2",
"rn-sliding-up-panel": "^1.2.1",
"victory-native": "^30.5.0"
IOS์์ "RCTDevLoadingView๋ฅผ๋ก๋ํ๋ ค๋ฉด RCTBridge๊ฐ dispatch_snyc๊ฐ ํ์ํฉ๋๋ค. ์ด๋ก ์ธํด ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค."
Xcode์์ Project -> Clean
ํ ๋ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค์ ์คํํด์ผํฉ๋๋ค.
์ด ์๊ฒฌ ์ด ํด๊ฒฐ ์ฑ ์์ ํ์ธํ์ต๋๋ค. @mattijsf ๊ฐ์ฌํฉ๋๋ค!
RCTBridgeDelegate
์ฐพ์ extraModulesForBridge
๋ฉ์๋๋ฅผ ์ฌ์ ์ํฉ๋๋ค.
<strong i="11">@interface</strong> MyBridgeDelegate : NSObject <RCTBridgeDelegate>
<strong i="12">@end</strong>
<strong i="13">@implementation</strong> MyBridgeDelegate
- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge
{
return @[
#if RCT_DEV
[bridge moduleForClass:[RCTDevLoadingView class]],
#endif
];
}
<strong i="14">@end</strong>
class MyBridgeDelegate: NSObject, RCTBridgeDelegate {
func extraModules(for bridge: RCTBridge!) -> [RCTBridgeModule]! {
var modules: [Any]! = []
if RCT_DEV == 1 {
modules.append(bridge.module(for: RCTDevLoadingView.self))
}
return modules as? [RCTBridgeModule]
}
}
iOS12, RN 0.57.8์์ ์ฌํ
๋ด ์์กด, ๊ฐ์ ๋ฌธ์
@aleclarson ๊ทธ ์ฝ๋๋ ์ ํํ ๋ฌด์์ํฉ๋๊น?
@ccorcos ๋จผ์ RCTDevLoadingView
๋ก๋ํ๋ฏ๋ก RN์์๋ก๋ ํ ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ ํ์๊ฐ ์์ต๋๋ค. ์ด ์ฃผ์ ์ด ๋ ์ฌ์ด ํด๊ฒฐ์ฑ
์ด ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์ฌ์ ํ ์ผ์ด๋๊ณ ์๋์ง ํ์คํ์ง ์์ง๋ง RN 0.57.8 + iOS 11.3 (์ ์ด๋)์์ ์ฌ์ ํ ๋ฐ์ํฉ๋๋ค.
@devburmistro๊ฐ ์์ ์ฃผ์ ์์ ๋ณ๊ฒฝ ํ ๋ด์ฉ์ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ์ง๋ฉด
RN 0.58.3
iOS 11.4, 12.1
๊ต์ฐฉ ์ํ๋ก ์ด์ด์ง๋๋ค. ์ฌ์ฉ์ ์ง์ ๋ชจ๋ฌ์ ๋ซ์ ๋ ๋ฐ์ํฉ๋๋ค.
๋๋ ์ด์ 0.57.8์์ ์ด๊ฒ์ ๊ฐ์ง๊ณ ์์ง ์์์ต๋๋ค.
์ฌ๊ธฐ์๋ RN 0.58.3์ผ๋ก ์ ๊ทธ๋ ์ด๋ ํ ํ ๊ฐ์ ธ์ต๋๋ค.
๋ด ์ ํํ ์ค๋ฅ๋ Unable find module for DevLoadingView
, ์์ ์๋ฃจ์
์ ๋๋ฅผ ์ํด ์์ ํ์ง ์์ต๋๋ค.
์ค์ ๋ก RN 0.58.3์ ์ถ๊ฐ ๋์ด ์ปค๋ฐ๊ณผ ๊ด๋ จ๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://github.com/facebook/react-native/commit/d7a0c44590bcf3fb9d055aeae3391d5bcd7e21be#diff -a2a67635fffd7b690d14dc17ae563a71
๋๋ 0.58.3 ์ค๋ RN๋ก ์ ๊ทธ๋ ์ด๋ ํ ํ @oferRounds์ ๊ฐ์ "DevLoadingView์ ๋ํ ๋ชจ๋์ ์ฐพ์ ์ ์์ต๋๋ค"๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์๋ค.
์๋ฎฌ๋ ์ดํฐ์์ ์ฑ์ด ์ฒ์ ์ด๋ฆด ๋ ํธ๋ฆฌ๊ฑฐ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ดํ์ ๋ค์๋ก๋ (cmd-R)ํด๋ ์ค๋ฅ๊ฐ ํ์๋์ง ์์ต๋๋ค.
ํธ์ง :์ด ํน์ ์ค๋ฅ์ ๋ํด ๋ณ๋์ ๋ฌธ์ ์ ์ถ : # 23235
0.58.3์ ์ฌ์ฉํ๋ iOS์์๋ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๊ด์ฐฐ :
_ ํธ์ง :์ด ํด๊ฒฐ ๋ฐฉ๋ฒ ์ด ์ฌ์ ํ ์คํ ๊ฐ๋ฅํ ์๋ฃจ์ ์์ ํ์ธํ ์ ์์ต๋๋ค ._
AppDelegate.m
์ ๋ฐ์ดํธํ์ฌ ๊ฒฝ๊ณ ๋ฅผ ํด๊ฒฐํ ์์์์ต๋๋ค.#if RCT_DEV #import <React/RCTDevLoadingView.h> #endif ... - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:jsCodeLocation moduleProvider:nil launchOptions:launchOptions]; #if RCT_DEV [bridge moduleForClass:[RCTDevLoadingView class]]; #endif RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"Test" initialProperties:nil]; ... }
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
react-native-navigation์ ์ฌ์ฉํ๋ ๋์ ์ฌ์ฉ์ ์ง์ RCTBridgeDelegate๋ฅผ ๋ฑ๋ก ํ ์์๋ ์ฌ๋์ด ์์ต๋๊น? bridgeManagerDelegate
๋งค๊ฐ ๋ณ์๋ฅผ ํตํด ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ ๋ฌํ ์ ์์ง๋ง ์์๋ ๊ฒ ๊ฐ์ต๋๋ค ( extraModulesForBridge
์ ๊ณต๋ RCTBridge๋ ํญ์ nil
).
RN 0.58.6 ๋ฐ iOS 12์ react-native-device-info
์ ์ถ๊ฐ ํ ์งํ์ ์ด๊ฒ์ ๋ฐ๊ธฐ ์์ํ์ต๋๋ค.
์ข์์, ์ด ๋๊ธ์ด ์ ๋ฅผ ์ํด ์์ ํ ๊ฒ ๊ฐ์ต๋๋ค.
React Native 0.59.1
react-native-device-info๋ฅผ ์ค์น ํ ์งํ์์ด ๊ฒฝ๊ณ ๊ฐ ํ์๋๊ธฐ ์์ํฉ๋๋ค. ์ค์ ์๋ฃจ์ ์ด ์์ต๋๊น?
๋๋ ์ด๊ฒ๋ ๋ฌด์์๋ก๋ณด๊ณ ์์ผ๋ฉฐ, RN 0.57.8์์ 0.59.5๋ก ์ ๊ทธ๋ ์ด๋ ํ ๋ ๋ชจ๋ ๊ฒ์ด ๋ค์ ์๋ํ๋๋กํ๋ ๋ฐ ํ์ํ ๊ฒ (๊ตฌ์ฑ) ์ธ์๋ ์ฑ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ lib๊ฐ CodePush์ด๊ณ 2 ๊ฐ์ yellowbox ๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค.
RCTBridge required dispatch_sync to load CodePush. This may lead to deadlocks
๊ณผ
Required dispatch_sync to load constants for CodePush. This may lead to deadlocks
์ด ๋ฌธ์ ๋ ๊ธธ๋ค. ๊ทผ๋ณธ ์์ธ์ ํ์ ํ๋ ๊ฒ์ด ์ฌ์ ํ ์์๊ป๋ผ๋ผ๊ณ ์๊ฐํฉ๋๊น? ๋์์ ๋๋ฆด ์์๋ ๋ค๋ฅธ ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ์ธ์.
๋ด package.json :
{
"name": "wonderswipe",
"version": "0.0.1",
"private": true,
"eslintConfig": {
"parserOptions": {
"ecmaVersion": 7,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
},
"env": {
"browser": false,
"node": true
},
"plugins": [
"react",
"react-native",
"react-hooks"
],
"rules": {
"comma-dangle": [
2,
"always-multiline"
],
"semi": [
2,
"never"
],
"react-native/no-unused-styles": 2,
"react-native/split-platform-components": 2,
"react-hooks/rules-of-hooks": "error"
}
},
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"postinstall": "patch-package"
},
"dependencies": {
"@postlight/mercury-parser": "^2.0.0",
"@react-native-community/async-storage": "^1.3.3",
"@react-native-community/viewpager": "^1.1.6",
"babel-plugin-idx": "^2.4.0",
"buffer": "^5.2.1",
"he": "^1.1.0",
"idx": "^2.5.5",
"lodash": "^4.17.2",
"moment": "^2.19.0",
"moment-timezone": "^0.5.10",
"node-summary": "../node-summary",
"react": "16.8.3",
"react-native": "^0.59.4",
"react-native-actionsheet": "^2.4.2",
"react-native-blur": "^3.2.0",
"react-native-cached-image": "../react-native-cached-image",
"react-native-cheerio": "^1.0.0-rc.4",
"react-native-code-push": "^5.3",
"react-native-custom-tabs": "^0.1.7",
"react-native-easy-toast": "^1.0.9",
"react-native-firebase": "^5.3.1",
"react-native-fit-image": "^1.4.8",
"react-native-flanimatedimage": "^0.4.0",
"react-native-highlight-words": "^1.0.1",
"react-native-keep-awake": "^4.0.0",
"react-native-linear-gradient": "^2.0.0",
"react-native-modal-dropdown": "^0.6.2",
"react-native-modalbox": "^1.6.0",
"react-native-orientation": "^3.1.3",
"react-native-parallax-scroll-view": "../react-native-parallax-scroll-view",
"react-native-rate": "^1.0.8",
"react-native-safari-view": "^2.0.0",
"react-native-sentry": "^0.42.0",
"react-native-sha256": "^1.1.1",
"react-native-status-bar-size": "^0.3.2",
"react-native-swiper": "^1.5.14",
"react-native-tooltip": "^5.2.0",
"react-native-tts": "^3.0.0",
"react-native-vector-icons": "^6.4.2",
"react-native-webview": "^5.7.0",
"react-native-webview-bridge": "^0.40.1",
"react-redux": "^7.0.1",
"redux": "^4.0.0",
"redux-thunk": "^2.1.0"
},
"devDependencies": {
"babel-eslint": "^10.0.1",
"eslint": "^5.15.1",
"eslint-plugin-react": "^7.12.4",
"eslint-plugin-react-hooks": "^1.0.1",
"eslint-plugin-react-native": "^3.6.0",
"patch-package": "^6.1.2",
"postinstall-postinstall": "^2.0.0",
"redux-logger": "^3.0.6"
},
"resolutions": {
"babel-core": "7.0.0-bridge.0"
}
}
@grossingdev ์ฃผ์ ์ผ๋ก์ด ์ค๋ฅ๋ฅผ ์์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ react-native๋ฅผ 0.59.8 ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ ํ. ์ด ์ค๋ฅ๊ฐ ๋ค์ ๋ฐ์ํ์ต๋๋ค
react-native 0.59.3์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
#if RCT_DEV
[bridge moduleForClass:[RCTDevLoadingView class]];
#endif
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"YourAppName"
initialProperties:nil];
ios ์ฑ์์ react-native-maps
Google์ง๋๋ฅผ ํตํฉํ๋ ๋์ AppDelegate.m ํ์ผ์ ์
๋ฐ์ดํธ ํ ํ ๋์ผํ ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค.
"react-native": "0.59.5"
๋๋ฅผ ์ํด-์ด๊ฒ์ ์๋ํ์ต๋๋ค ---
"๋ฐ์": "16.8.3",
"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.59.9",
AppDelegate.m ํ์ผ
#if RCT_DEV
#import <React/RCTDevLoadingView.h>
#endif
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
// RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
// moduleName:@"mobileapp"
// initialProperties:nil];
NSURL *theurl ;
#if DEBUG
theurl = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
theurl = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:theurl
moduleProvider:nil
launchOptions:launchOptions];
#if RCT_DEV
[bridge moduleForClass:[RCTDevLoadingView class]];
#endif
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"mobileapp"
initialProperties:nil];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
return YES;
}
@ amitkumar3968 ์ฃผ์ ํ์์ ์ฝ๋๋ก ์ง์
๋น์ทํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ด package.json :
{
"name": "auth",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "react-native start",
"test": "jest",
"lint": "eslint ."
},
"dependencies": {
"firebase": "^6.3.1",
"react": "16.8.6",
"react-native": "0.60.0"
},
"devDependencies": {
"@babel/core": "7.5.0",
"@babel/runtime": "7.5.0",
"@react-native-community/eslint-config": "0.0.3",
"babel-jest": "24.8.0",
"eslint": "6.0.1",
"jest": "24.8.0",
"metro-react-native-babel-preset": "0.54.1",
"react-test-renderer": "16.8.6"
},
"jest": {
"preset": "react-native"
}
}
Reload๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง์ด ๋ฌธ์ ๊ฐ ๋ฌด์์๋ก ๋ฐ์ํ๋ฉด ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ๋ฌธ์ ๋ ๋๋ฒ๊ฑฐ๋ฅผ ๋นํ์ฑํ ํ ๋๋ง ๋ฐ์ํฉ๋๋ค. Perf Monitor๋ฅผ ์ด์์ ๋ RAM์ด ๋นํ์ฑํ ๋ ํ ยฑ 100MB์์ ยฑ 300MB๋ก ์ด๋ํ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
๋๋ฒ๊ฑฐ ์ฌ์ฉ :
๋๋ฒ๊ฑฐ์์ด :
์ ์ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฒฝ๊ณ ํ์ ๋ง ์ค์งํ๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ์ฐ์๋ ์๋ํ์ง ์์ง๋ง ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ๊ฐ ๋ฆด๋ฆฌ์ค ๋ชจ๋์์ ์ฑ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ง ๊ถ๊ธํฉ๋๋ค.
์์ ์ธ๊ธ ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ React Native 0.59.10
์์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
diff --git a/ios/Foo/AppDelegate.m b/ios/Foo/AppDelegate.m
index e446e79..2c28719 100644
--- a/ios/Foo/AppDelegate.m
+++ b/ios/Foo/AppDelegate.m
@@ -18,6 +18,11 @@
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
+// https://github.com/facebook/react-native/issues/16376#issuecomment-350523177
+#if RCT_DEV && __has_include(<React/RCTDevLoadingView.h>)
+#import <React/RCTDevLoadingView.h>
+#endif
+
<strong i="7">@implementation</strong> AppDelegate
@@ -39,6 +44,13 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
+
+ // https://github.com/facebook/react-native/issues/16376#issuecomment-350523177
+ #if RCT_DEV && __has_include(<React/RCTDevLoadingView.h>)
+ [bridge moduleForClass:[RCTDevLoadingView class]];
+ #endif
+
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"Foo" initialProperties:nil];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
์ฌ๊ธฐ์ ์ ์ผํ ์ฐจ์ด์ ์๋ก๋ ํ ๋ ๋๊ฐ์ ๋
ผ๋ฆฌ ( RCT_DEV && __has_include(<React/RCTDevLoadingView.h>)
๋ถ๋ถ)๋ฅผ ์ผ์น ์์ผฐ๋ค๋ ๊ฒ์
๋๋ค ...
react-native-firebase
2 ๊ฐ๋ฅผ ๋ฐ์์ต๋๋ค. ๋๋ฌผ๊ฒ ๋ฐ์ํ์ง๋ง :
react-native 0.61.2๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ๋ง๋ ํ
์คํธ ํ๋ก์ ํธ์ Images.xcassets/AppIcon.appiconset
๋๋ ํฐ๋ฆฌ์ ์ฑ ์์ด์ฝ์ ์ถ๊ฐํ์ฌ์ด ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์์์์ต๋๋ค. ์ด ๋ฌธ์ ์ ์ฝ๋ ์ค์ ์ถ๊ฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
๋ฐ์ ๋ค์ดํฐ๋ธ 0.59.10
๊ฐ์ ๋ฌธ์ .
์ฌ๊ธฐ์ ๊ฐ์ ๋ฌธ์ !! ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ฌ๋์ด ์์ต๋๊น?
AppDelegate.m
์ ๋ฐ์ดํธํ์ฌ ๊ฒฝ๊ณ ๋ฅผ ํด๊ฒฐํ ์์์์ต๋๋ค.#if RCT_DEV #import <React/RCTDevLoadingView.h> #endif ... - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:jsCodeLocation moduleProvider:nil launchOptions:launchOptions]; #if RCT_DEV [bridge moduleForClass:[RCTDevLoadingView class]]; #endif RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"Test" initialProperties:nil]; ... }
์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒฝ๊ณ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ๋๋จํ ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ ๋ฌธ์ ์ด์ง๋ง componentDidUpdate ์ฝ๋ ๋ธ๋ก์ ์ญ์ ํ๋ฉด์ด ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ง๋๋ค. ํ์ง๋งํ์ง๋ง componentDidUpdate๊ฐ ํ์ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ : ๊ตฌ์ฑ ์์๋ฅผ ์ค์นํ๋ ค๋ฉด Xcode๋ฅผ ์ฝ๋ ๋ค.
macOS ์ํํธ์จ์ด๋ฅผ ์ ๋ฐ์ดํธ ํ ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํด Xcode๋ฅผ ์ด์ด์ผํฉ๋๋ค.
AppDelegate.m
์ ๋ฐ์ดํธํ์ฌ ๊ฒฝ๊ณ ๋ฅผ ํด๊ฒฐํ ์์์์ต๋๋ค.#if RCT_DEV #import <React/RCTDevLoadingView.h> #endif ... - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:jsCodeLocation moduleProvider:nil launchOptions:launchOptions]; #if RCT_DEV [bridge moduleForClass:[RCTDevLoadingView class]]; #endif RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"Test" initialProperties:nil]; ... }
@grossingdev jsCodeLocation์ ๋ฌด์์ ๋๊น? URL์ด์ด์ผํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ฌด์์ ๊ฐ๋ฆฌ์ผ ์ผํฉ๋๊น?
react-native-firebase
2 ๊ฐ๋ฅผ ๋ฐ์์ต๋๋ค. ๋๋ฌผ๊ฒ ๋ฐ์ํ์ง๋ง :
Firebase๋ก ์ธํด์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ๊ณต์ ํ์๊ฒ ์ต๋๊น? ์๋ ํ์ธ์.
@ abdi4 ๋ฐฉ๊ธ
@zloka ์๋ ์ด๊ฒ์ ๋ฌด์์๋ก ๋ฐ์ํ๊ณ ๊ทธ๊ฒ์ ๋ค์ ๋ง๋ค ์ ์์ต๋๋ค.
์ด ๊ฒฝ๊ณ ๋ ๋ค๋ฅธ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์
import { YellowBox } from 'react-native';
YellowBox.ignoreWarnings([
'RCTBridge'
]);
์ด ๋ฌธ์ ๋ ๋น ๊ฒฐ์ ์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค. ๋ด๊ฐ ํ ๋๋ง๋ค ๋ด๊ฐ ๊ฐ์ง ์ ์ผํ ํด๊ฒฐ์ฑ ์ ๋ด ์ฅ์น์์ ์ฑ์ ์ญ์ ํ๊ณ ๋ค์ ์คํํ๋ ๊ฒ์ ๋๋ค.
์ ์ํ ์๋ฃจ์ :
let bridge = RCTBridge (bundleURL : jsCodeLocation, moduleProvider : nil, launchOptions : nil)
#if RCT_DEV
bridge? .module (for : RCTDevLoadingView.self)
#endif
let rootView = RCTRootView (bridge : bridge !, moduleName : "AppMain", initialProperties : nil)
์๋ ํ์ธ์. ์ต๊ทผ์ด ๋ฌธ์ ์ ๋ํ ํ๋์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋์์ต๋๊น? ์๋๋ฉด ์ฌ์ ํ ์ปค๋ฎค๋ํฐ์์ฃผ์๊ฐ ํ์ํฉ๋๊น? ์ด ๋ฌธ์ ๋ ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์ข ๊ฒฐ ๋ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ "ํ ๋ก "์ผ๋ก ๋ถ๋ฅํ๊ฑฐ๋ "๋ฐฑ ๋ก๊ทธ"์ ์ถ๊ฐ ํ ์๋ ์์ต๋๋ค. ์ด์ด ๋๊ฒ ์ต๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์. ์ต๊ทผ์ด ๋ฌธ์ ์ ๋ํ ํ๋์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋์์ต๋๊น? ์๋๋ฉด ์ฌ์ ํ ์ปค๋ฎค๋ํฐ์์ฃผ์๊ฐ ํ์ํฉ๋๊น? ์ด ๋ฌธ์ ๋ ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ์ข ๊ฒฐ ๋ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ "ํ ๋ก "์ผ๋ก ๋ถ๋ฅํ๊ฑฐ๋ "๋ฐฑ ๋ก๊ทธ"์ ์ถ๊ฐ ํ ์๋ ์์ต๋๋ค. ์ด์ด ๋๊ฒ ์ต๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ฌ๊ธฐ์ ๋น์ ์ ํ๋์ด ์์ต๋๋ค. ๊ฒฝ๊ณ ๋ ์๋ก์ด ์ฑ์์ ๊ณ์ํด์ ๋ํ๋ฉ๋๋ค.
@sospedra ์ธ๋ถ ์ข ์์ฑ์์ด React Native ํ ํ๋ฆฟ์ผ๋ก ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ ์ ์ฅ์๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๊น?
ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ถํด์ผํฉ๋๋ค.
0.63.2
์ ๋ํ ๋์ผํ ๋ฌธ์ ์์ธ์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฐ๋ ์ฑ์ ๋ชจ๋ ์ํธ ์์ฉ์ด ๋ ์ด์ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ ๋ฌด์์๋ก ๋ฐ์ํฉ๋๋ค.
๋์ผํ ๊ฒฝ๊ณ ๋ Metro (์๋) ์ฌ๋ก๋์ react-native-macos์์๋ง ์ ๊ณต๋๋ฉฐ ์ฝ๋ ๋ณ๊ฒฝ ์
๋ฐ์ดํธ์๋ ๋ฐ์ํ์ง ์์ผ๋ฉฐ iOS, Android ๋๋ Windows์์๋ ์ ๊ณต๋์ง ์์ต๋๋ค.
NB : RN 0.62.2์ ๋๋ฅผ ์ํด
Catalyst ์ฑ์์ ๋์ผํ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ต๋๋ค.
์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋ซ๊ณ ์งํ์ฒ ์ ์ฃฝ์์ต๋๋ค. XCode build and run
๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ก์ต๋๋ค!
๋ฉํธ๋ก ๋ฒ ๋ค๋ฌ๋ฅผ ๋ซ๊ณ ์๋ฎฌ๋ ์ดํฐ์์ ์ฑ์ ์ ๊ฑฐํ๋ฉด ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ก์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๋ถ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ฝํฌ ํจํค์ง๋ฅผ ์ถ๊ฐ ํ ํ ๊ฒฝ๊ณ ๊ฐ ํ์๋์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
+1
์ถ๊ฐ๋ฅผ ์ค์งํ์ญ์์ค.์ด ๊ฒฝ์ฐ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ง ์๋ ์ด๋ฉ์ผ ์๋ฆผ์ด ์์ฑ๋ฉ๋๋ค. ๋์ "๋ฐ์ ์ถ๊ฐ"๊ธฐ๋ฅ์ ์ฌ์ฉํ์ญ์์ค.