패키지를 추가하거나
native코드를 수정하는 등의
큰 변화를 주지않고
js, img, css 를 수정하는 배포에대해
빌드를 하지 않고도 배포할수 있게 해주는
code-push기능 적용 일기이다.
참고 링크 1 Weiji 웨이지 님의 블로그
참고 링크 2 Gale Lee 님의 블로그
참고링크 3 appcenter 공식 문서
본 작업은 , react-native 0.66 버전에서 진행되었습니다.
1. 설치
npm i -g appcenter-cli
2. 로그인
appcenter login
위 명령어를 입력하면
? Enable Temporary(Y/n)? 라는 질문이 나타난다.
원투데이 개발할게 아니므로 당연히 n
그러고나면 terminal에
?Access code from brwoser이라는 질문과함께
연동된 페이지가 나타나며
구글/깃헙/페북 등 로그인 수단을 선택할것이라고 뜬다.
나는 github을 선택했고, username을 설정하고나니
code가 떴다.
코드 복붙
그러면 로그인 완료
3. 로그인 확인
appcenter profile list
위 명령어로 로그인된 계정의
Username, Display Name, Email 등을 확인할 수 있다.
4. 서비스 등록하기 (대소문자 주의)
appcenter apps create -d appname-aos -o Android -p React-Native
appcenter apps create -d appname-ios -o iOS -p React-Native
이름은 자유지만 android/ios 구분해서 짓기
5. 등록된 서비스 조회
appcenter apps list
6. 홈페이지 접속해보기
7. react-native-code-push 설치하기
npm i --save react-native-code-push
8. 배포단계 설정하기
appcenter codepush deployment add -a username/appname-aos Staging
appcenter codepush deployment add -a username/appname-aos Production
appcenter codepush deployment add -a username/appname-ios Staging
appcenter codepush deployment add -a username/appname-ios Production
이렇게 배포단계에 대한 네이밍을 세팅해두면
appcenter codepush deployment list -a username/appname-aos
이런 방식으로 현재 진행중인 상태를 조회할수 있다고 한다.
9. 앱의 배포를 위해 key 조회하기
appcenter codepush deployment list -a username/appname-aos -k
appcenter codepush deployment list -a username/appname-ios -k
10. ios 설정
- 라이브러리를 설치했으니 pod도 설치해준다.
cd ios && pod install && cd ..
- xcode의 AppDelegate.m 수정
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
return [CodePush bundleURL];
#endif <-- 새로 변경된 파트
//#if DEBUG
// return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
//#else
// return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
//#endif <-- 원래 파트
}
- app에 AppCenter-Config.plist 추가
NewFile -> Property List -> Save as (AppCenter-Config.plist)
- Project > info > Configuration > +
위 이미지처럼 Staging항목을 추가해줍니다.
- Info.plist에 Key 추가하기
key: CodePushDeploymentKey / value: ${CODEPUSH_KEY}
를 추가해줍니다.
Project > Build Settings > + Add user defined setting을 클릭
MULTI_DEPLOYMENT_CONFIG 추가
release $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
staging $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
같은 방법으로
CODEPUSH_KEY 추가
appcenter codepush deployment list -a username/appname-ios -k
위 명령어로 조회된 키를
release, staging에 알맞게 입력
11. android 설정
- android/setting.gradle
// add code push
include ':app', ':react-native-code-push'
project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')
- key 추가하기
먼저, 아래 명령어로 키를 조회
appcenter codepush deployment list -a username/appname-aos -k
아래 내용 추가
// android/gradle.properties
CODEPUSH_DEPLOYMENT_KEY_DEBUG=
CODEPUSH_DEPLOYMENT_KEY_STAGING=????
CODEPUSH_DEPLOYMENT_KEY_PRODUCTION=????
- /android/app/build.gradle
// buildTypes
buildTypes {
debug {
...
resValue "string", "CodePushDeploymentKey", CODEPUSH_DEPLOYMENT_KEY_DEBUG
}
release {
...
resValue "string", "CodePushDeploymentKey", CODEPUSH_DEPLOYMENT_KEY_PRODUCTION
}
releaseStaging {
initWith release
resValue "string", "CodePushDeploymentKey", CODEPUSH_DEPLOYMENT_KEY_STAGING
matchingFallbacks = ['release']
}
}
// enableHermes 관련 코드가 있다면
if (enableHermes) {
...
releaseStagingImplementation files(hermesPath + "hermes-release.aar")
} else {
...
}
// 맨 아래에 추가
apply from: "../../node_modules/react-native/react.gradle" <-- 에러나면 주석처리
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
- MainApplication.java
import com.microsoft.codepush.react.CodePush; // <- add
new ReactNativeHost(this) {
...
//add
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
}
+++ 안드로이드에서 코드푸시가 되지않아 에러 추적을해본 결과
[CodePush] Exception com.microsoft.codepush.react.CodePushUnknownException: Error in getting binary resources modified time
위와 같은 에러가 발견됨
// android/app/build.gradle
defaultConfig {
...
resValue 'string', "CODE_PUSH_APK_BUILD_TIME", String.format("\"%d\"", System.currentTimeMillis())
}
설정할게 많다...
그치만 우리가 얻는 이득에 비하면 이건 아무것도아니다.
(하, 그래도 이거는 솔직히 할거 너무많다)
설정은 끝났다.
업데이트를 수신할건지에 대한 코드만 추가해주면된다.
12. 코드 추가하기
(여기서부터는 자유롭게 하면 될것같다)
// 필자는 App.tsx 에서 작업하였다.
import CodePush from 'react-native-code-push';
import { AppState } from 'react-native';
useEffect(() => {
const staging = AppState.addEventListener('change', (state) => {
if (state === 'active') codePushSync();
});
return () => {
staging.remove();
}
}, [])
const codePushSync = () => {
CodePush.sync({
updateDialog: {
title: '새로운 업데이트가 존재합니다.',
optionalUpdateMessage: '지금 업데이트 하시겠습니까?',
optionalIgnoreButtonLabel: '나중에',
optionalInstallButtonLabel: '업데이트'
},
installMode: CodePush.InstallMode.IMMEDIATE
})
}
export default CodePush({ checkFreQuency: CodePush.CheckFrequency.MANUAL })(App);
빌드파일을 지우고
re-빌드해서 배포테스트를 해보자.
'개발, 코딩 > App - React Native' 카테고리의 다른 글
RNFirebase messaging, vibration not working. (0) | 2021.12.14 |
---|---|
react-native-code-push 사용하기 (0) | 2021.12.13 |
react-native-modal, modal flickering on closing (0) | 2021.12.10 |
react-native, notification 아이콘이 왜 안나와? (0) | 2021.12.01 |
react-native, multi-slidier 추천 (0) | 2021.12.01 |