1. AppCenter Cli 글로벌 설정으로 설치
$ npm install -g appcenter-cli
yarn으로는 설치가 안된다고 함
2. AppCenter 로그인
$ appcenter login
명령어 실행 직후 appcenter 홈페이지가 열림
로그인 하게되면 키값을 복사할수 있는데 복사해서 다시 터미널로 돌아가서 입력하면 로그인이 완료됩니다.
3. AppCenter에 앱 등록하기
appcenter apps create -d {앱 이름} -o {os} -p {플랫폼 타입}
같은 프로젝트라도 OS별로 등록해야함
1) appcenter apps create -d myapp_android -o Android -p React-Native
2) appcenter apps create -d myapp_ios -o iOS -p React-Native
<주의> OS 와 플랫폼은 대문자 소문자 구별되니 예시와 같이 입력되어야 함
4. 등록된 앱의 Staging, Production 키 등록하기
테스트할때는 Staging, 배포할때는 Production을 사용한다고 보면 됨
appcenter codepush deployment add -a {user name}/{앱 이름} {Staging or Production}
user name 은 3번에서 앱생성할때 Owner name에 해당되는 부분
Owner Name 이 minsu 였다면
1) appcenter codepush deployment add -a minsu/myapp_android Staging
2) appcenter codepush deployment add -a minsu/myapp_android Production
3) appcenter codepush deployment add -a minsu/myapp_ios Staging
4) appcenter codepush deployment add -a minsu/myapp_ios Production
위 4개 명령어를 모두 실행해야 하고 실행했을때 키 값을 반환해주니 기록해놓으시면 됩니다.
만약 키 값을 잊어버렸다면 아래 명령어를 입력해서 키를 다시 찾으시면 됩니다.
appcenter codepush deployment list -a {user name}/{앱 이름} -k
5. 프로젝트에 패키지 설치
저는 npm을 사용하니
npm install react-native-code-push
// ios 설정
cd ios && pod install && cd ..
6. iOS 설정
1) VSCODE로 ios 폴더 app 폴더 안에 info.plist 에 값 추가하기
<key>CodePushDeploymentKey</key>
<string>${CODEPUSH_KEY}</string>
2) Xcode 실행 AppDelegate.mm에 import 추가하기
#import <CodePush/CodePush.h>
3) AppDelegate.mm 에서 값 수정하기
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
---> return [CodePush bundleURL]; // 이걸로 수정
4) 1에서 추가했던 CODEPUSH_KEY 전역변수 등록하기 (중요)
- Xcode에서 > Project > info > Configurations에 들어가 아래 + 버튼 클릭하여
'Duplicate Release Configuration'을 선택추가하고 이름을 Staging으로 수정
- Project > Build Settings 좌상단 + 버튼 클릭 > 'Add User-Defined Setting 클릭
- 새로 추가된 항목의 이름을 MULTI_DEPLOYMENT_CONFIG로 해주고, Release와 Staging 각 항목에 다음과 같은 값을 추가
- + 버튼 > 새롭게 하나 더 추가해서 CODEPUSH_KEY로 이름 수정하고 아까 키값을 입력해줍니다.
Release > Production deployment key
Staging > Staging deployment key
7. 안드로이드 설정
안드로이드 스튜디오에서 gradle.properties 파일을 선택합니다.
(SDK 싱크 문제 때문에 vscode가 아닌 스튜디오에서 작업)
- gradle.properties 파일 하단에 코드추가
CODEPUSH_DEPLOYMENT_KEY_DEBUG=
CODEPUSH_DEPLOYMENT_KEY_STAGING={staging deployment key}
CODEPUSH_DEPLOYMENT_KEY_PRODUCTION={production deployment key}
- setting.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')
- app/src/main/java/MainApplication.java 에 import 및 코드 추가
...
import com.microsoft.codepush.react.CodePush; // 여기 추가
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost =
new ReactNativeHost(this) {
...
// 여기 추가
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
};
...
}
- app/build.gradle에 하단에 코드 추가
apply from: "../../node_modules/react-native-code-push/android/codepush.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']
}
}
같은 파일 defaultConfig 내부에 다음 코드 추가
android {
...
defaultConfig {
...
resValue 'string', "CODE_PUSH_APK_BUILD_TIME", String.format("\"%d\"", System.currentTimeMillis())
}
...
}
8. 프로젝트 설정
app.js에서 설정
import React from 'react';
import CodePush from 'react-native-code-push';
const App = ({}) => {
return (
...
);
}
const codePushOptions = {
checkFrequency: CodePush.CheckFrequency.ON_APP_START,
updateDialog: {
title: '...',
optionalUpdateMessage: '...',
optionalInstallButtonLabel: '업데이트',
optionalIgnoreButtonLabel: '아니요.'
},
installMode: CodePush.InstallMode.IMMEDIATE
}
export default CodePush(codePushOptions)(App);
옵션 항목
CodePush.CheckFrequency.ON_APP_START: 앱을 첫 실행할 때마다
CodePush.CheckFrequency.ON_APP_RESUME: 앱을 잠시 나갔다가 다시 들어올 때 마다
(ex. 홈버튼을 눌렀다가 다시 앱 실행하는 경우)
CodePush.CheckFrequency.MANUAL: 수동지정(앱 코드에서 호출될 때마다)
installMode : 업데이트 실행할 시기를 선언
옵션 항목
CodePush.InstallMode.IMMEDIATE: 즉시 업데이트하고 다시 실행
CodePush.InstallMode.ON_NEXT_RESTART: 업데이트를 설치하려 하지만 강제로 앱을 재실행하진 않음. 앱이 자연스럽게 재실행되면 자동으로 업데이트를 실행한다.(자동 업데이트를 걸 때 좋음)
CodePush.InstallMode.ON_NEXT_RESUME: 업데이트를 실행하지만 앱 종료 후 사용자가 앱을 재실행할 때까지 앱이 자동으로 재실행되지 않는다.
updateDialog : 업데이트 팝업 뛰우는 설정
옵션 항목
title: "dialog 제목"
optionalUpdateMessage: "dialog에 띄울 메세지"
optionalInstallButtonLabel: "업데이트 실행버튼 라벨 => ex) '예'버튼"
optionalIgnoreButtonLabel: "업데이트 미실행버튼 라벨 => ex) '아니오'버튼"
설정을 안하려면 updateDialog : false 로 하면 됩니다.
9. 배포하기
appcenter codepush release-react -a {user name}/{앱 이름} -d {Production or Staging}
참고사이트
https://learn.microsoft.com/ko-kr/appcenter/distribution/codepush/cli
App Center CLI를 사용하여 CodePush 업데이트 릴리스 - Visual Studio App Center
CodePush 업데이트를 릴리스하기 위해 App Center CLI를 사용하고 설정하는 방법
learn.microsoft.com
여기서 배포 관련 명령어 살펴보면 됩니다.
10. 팁
디버그 모드에서는 확인이 어렵다보니 저같은 경우는
안드로이드는 apk 파일 추출 해서 설치해보고 코드 푸시한 다음 적용되는 지 확인하였습니다.
일일이 배포 명령어를 치기가 어렵다 보니 script화 시켜서 명령어 간소화 시키는 것을 추천합니다.
npm run codepush:android
이런식으로 배포가 가능
타겟을 설정하는 것이 좋은데
> 1.0.1 버전만 코드푸시되게 설정한 부분
'1.0.1' 대신에 1.0으로 했을 경우
appcenter codepush release-react -a {user name}/{앱 이름} -d Production --sourcemap-output --output-dir ./build -m -t 1.0
1.0.X 해당하는 모든 버전이 코드푸시가 되어집니다.
타겟 버전을 정하는 것도 위 참고 사이트에서 확인 가능합니다.
'React-native' 카테고리의 다른 글
[ React Native ] AppState foreground, background 상태 알기 (0) | 2023.02.09 |
---|---|
[ React Native ] 앱 이름 바꾸기 (0) | 2023.01.30 |
[ React Native ] 업데이트 팝업 만들기, 버전관리 (1) | 2023.01.27 |
[ React Native ] 재사용 가능 팝업 ( reusable popup ) 모달 만들기 (0) | 2023.01.26 |
[ React Native ] [ iOS ] 소리가 나지 않는 문제 react-native-sound-player :: Sending "FinishedLoading" with no listeners registered. 경고 해결 (0) | 2023.01.19 |