์ด์ ๊ธ์ธ [RN Library ๐] codepush ๋์
ํ๊ธฐ - 1. app center ์
ํ
์ ์ด์ด์
codepush๋ฅผ ๋์
ํ๊ธฐ ์ํด ํ๋ก์ ํธ์ react-native-code-push SDK๋ฅผ ์ฌ์ด๋ณด์.
ํ๋ก์ ํธ์ react-native-code-push๋ฅผ ์ค์นํ๊ณ ios/android ๊ฐ๊ฐ setupํด์ค์ผ ํ๋ค.
๋ฒ์ ๋ง๋ค ์ค์น ๋ฐฉ๋ฒ์ด ์์ดํ๊ฒ ๋ค๋ฅด๋ค๊ณ ํ๋ ๊ผญ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ ์
ํ
ํ์๊ธธ..
npm install --save react-native-code-push
android/settings.gradle
ํ์ผ ๋์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.include ':app', ':react-native-code-push'
project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')
android/app/build.gradle
ํ์ผ์ codepush.gradle
๋ฅผ ์ถ๊ฐํ๋ค.// apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
๐ ๋น๋ํ ๋ ์ค๋ฅ ๋ฐ์
Cannot add task 'bundleDebugJsAndAssets' as a task with that name already exists.
๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์ฒซ๋ฒ์งธ ์ค์ ์ฃผ์ ์ฒ๋ฆฌํ๋ฉด ํด๊ฒฐ๋๋ค๋ ๊ธ์ ๋ฐ๊ฒฌํ๋ค.
MainApplication.java
๋ฅผ ๊ณต์๋ฌธ์ ๋ด์ฉ๋๋ก ์์ ํ๋ค....
// 1. codepush ํจํค์ง๋ฅผ importํ๋ค.
import com.microsoft.codepush.react.CodePush;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
...
// 2. getJSBundleFile ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ๋ค.
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
};
}
strings.xml
์ ์ถ๊ฐํ๋ค. staging, production ๋๊ฐ์ง key ์ค์ ์ฌ์ฉํ ํ๊ฒฝ์ key๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.// ๋ฐฐํฌํค ์์๋ด๊ธฐ
appcenter codepush deployment list -a <ownerName>/<appname> -k
// strings.xml
<resources>
<string name="app_name">AppName</string>
<string moduleConfig="true" name="CodePushDeploymentKey">Staging deploymentkey</string>
</resources>
android/app/build.gradle
์ ๋ ํ๊ฒฝ์ ๋ฐฐํฌํค๋ฅผ ์ถ๊ฐํด์ค์ผ ํ๋ค. android {
...
buildTypes {
debug {
...
resValue "string", "CodePushDeploymentKey", '""'
...
}
releaseStaging {
...
resValue "string", "CodePushDeploymentKey", '"<INSERT_STAGING_KEY>"'
// Note: It is a good idea to provide matchingFallbacks for the new buildType you create to prevent build issues
// Add the following line if not already there
matchingFallbacks = ['release']
...
}
release {
...
resValue "string", "CodePushDeploymentKey", '"<INSERT_PRODUCTION_KEY>"'
...
}
}
...
}
cd ios && pod install && cd ..
AppDelegate.m
ํ์ผ ์๋จ์ #import <CodePush/CodePush.h>
๋ฅผ ์ถ๊ฐํ๋ค.// before
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
// after
return [CodePush bundleURL];
Info.plist
ํ์ผ์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.// ๋ฐฐํฌํค ์์๋ด๊ธฐ
appcenter codepush deployment list -a <ownerName>/<appname> -k
// Info.plist
<key>CodePushDeploymentKey</key>
<string>Staging deploymentkey</string>
์ต์์ ์ปดํฌ๋ํธ์ ์๋์ ๊ฐ์ ์์
์ ํด์ผ ํ๋ค. ๊ด๋ จ ์ต์
๋ ์ค์ ํด์ค ์ ์๋๋ฐ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์. '์ฑ์ด ์์ํ ๋ ์
๋ฐ์ดํธ๋ฅผ ํ ๊ฒ์ด๋' ๋ฑ์ ์ต์
์ด ์๋ค.
codepush api ํ์ธํ๊ธฐ
import React from 'react';
import codePush from 'react-native-code-push'; // here!
const App = () => (
<SomeComponent />
)
// here! ๊ฐ์ข
codepush ๊ด๋ จ ์ต์
์ ์ค์ ํ๊ณ
const codePushOptions = {
checkFrequency: codePush.CheckFrequency.ON_APP_START,
installMode: codePush.InstallMode.IMMEDIATE,
}
// here! ์ต์์ ์ปดํฌ๋ํธ๋ฅผ codepush ๋ํผ๋ก ๊ฐ์ธ์ export ์ํค๊ณ , ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์ฑ์ ๋ฑ๋ก์ํต๋๋ค.
export default codepush(codePushOptions)(App)
ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์์ ํ๋ค.
// ๋ฆด๋ฆฌ์ฆ ํ๊ธฐ
appcenter codepush release-react -a <ownerName>/<appname> -d Staging
or
appcenter codepush release-react -a <ownerName>/<appname> -d Production
// codepush์ ์ด๋ฆ ๋ถ์ด๊ธฐ
appcenter codepush release-react -a <ownerName>/<appname> -m --description "Modified the header color"
// ๋ฐฐํฌ ํ์ธํ๊ธฐ
appcenter codepush deployment list -a <ownerName>/<appName>
Production์ผ๋ก ๋ฐฐํฌํ ๊ฒฝ์ฐ ์ค ๋ฐฐํฌ ์ฑ์ ์ ์ฉ๋๋ค.(?) ๋ฌด์จ ๋ป์ด์ง?
staging๊ณผ production์ ์ฐจ์ด๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ๋ค. ๊ฒฝํ์ ํด๋ด์ผ๊ฒ ๋ค.
์ผ๋จ ์ ๋ถ production key๋ฅผ ์ฌ์ฉํ๊ณ production์ผ๋ก ๋ฆด๋ฆฌ์ฆ ํด๋ณธ์.
์ด๋ ๊ฒ ๋ฐฐํฌ๊ฐ ์ฑ๊ณตํ๋๋ฐ ์ค ๋ฐฐํฌ ์ฑ์ ์ ์ฉ๋์ง ์๋๋ค๋ฉด ๋ฐฐํฌ๋ ํ์ผ์ appcenter key ์ staging key์ ํ์ฌ ์ ์ฉํ๊ณ ์๋ ํ์ผ์ appcenter key ์ staging key๊ฐ ์ผ์นํ๋์ง ํ์ธํด ๋ด์ผ ํ๋ค.
2021.08.02 ์ถ๊ฐ
staging, production์ ๋ง๊ทธ๋๋ก dev, prod ํ๊ฒฝ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ค์ ์ ์ ์๊ฒ ๋ณด์ฌ์ง๋ ์ฑ์ ๊ฐ๋ฐํ๋ ๋ถ๋ค์ด๋ผ๋ฉด ๋ ํ๊ฒฝ์ ๋ชจ๋ ์ฌ์ฉํ๋๊ฒ ์ข์๋ฏํด์ multi-deployment์ ์ธํ ํด์ ์ฌ์ฉํ์๊ธธ ๊ถ์ฅ ๋ํ๋ค.