Android OS 4.0 (API Level 14) 이하 버전을 지원하는것과, WebP 지원여부에 따라 모듈을 추가하면 됩니다.
dependencies {
// If your app supports Android versions before Ice Cream Sandwich (API level 14)
implementation 'com.facebook.fresco:animated-base-support:1.3.0'
// For animated GIF support
implementation 'com.facebook.fresco:animated-gif:2.5.0'
// For WebP support, including animated WebP
implementation 'com.facebook.fresco:animated-webp:2.5.0'
implementation 'com.facebook.fresco:webpsupport:2.5.0'
// For WebP support, without animations
implementation 'com.facebook.fresco:webpsupport:2.5.0'
}
'Duplicate "Release" Configuration' 을 선택하여 Staging(원하는)이름으로 변경해줍니다.
Staging 을 추가하였으니 Build Settings 탭으로 이동합니다.
'+' 버튼을 클릭하고 Add User-Defined Setting 을 선택합니다.
MULTI_DEPLOYMENT_CONFIG 항목을 생성하고 Release에는 '$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)', Staging에는 '$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)' 값을 넣어줍니다.
다시 '+' 버튼을 클릭하고 Add User-Defined Setting 을 선택합니다.
이번에는 CODEPUSH_KEY 항목을 추가하고 Release에는 Production DeploymentKey를, Staging에는 Staging DeploymentKey 값을 넣어줍니다.
마지막으로 info.plist파일을 열고 기존에 작성했던 CodePushDeploymentKey 항목의 값을 '$(CODEPUSH_KEY)' 로 변경하여 줍니다.
기존에 CodePush 설정이 되어있지 않았다면 해당 항목은 없으니 새로 추가하면 됩니다.
이제 Scheme 설정에서 원하는 모드로 빌드를 진행할 수 있습니다.
기본 debug 모드에서는 배포키가 없으며, 배포시 release, staging모드로 각 모드에 맞는 배포키로 빌드할 수 있습니다.
Release, Staging 말고도 원하는대로 커스텀이 가능하며, 용도에 맞는 모드로 배포해보세요.
Production 이나 Staging 하나로 배포 키가 고정되어 있다면 매번 앱을 다시 빌드해야할겁니다.
AppCenter에서는 Staging으로 테스터에게 배포하고 문제가 없다면 Production으로 배포하는걸 권장하고 있죠.
이번 글에서 위의 상황에 맞게 배포할 수 있도록 다중 배포 키를 등록하도록 하겠습니다.
* React Native 0.60 이상을 기준으로 작성하였습니다. *
# Android 설정
app 수준의 build.gradle 파일을 열어줍니다.
android { buildTypes {} } 위치를 찾아 빌드 유형에 대한 항목을 정의합니다.
resValue에 각 항목에 맞는 배포 키를 넣어줍니다.
Staging은 명명규칙때문에 releaseStaging으로 작성해줍니다.
그냥 staging으로 작성한다면 Bundle 생성시 buildTypes에서 보여지지 않습니다.
android {
...
buildTypes {
debug {
...
// Note: CodePush updates shouldn't be tested in Debug mode as they're overriden by the RN packager. However, because CodePush checks for updates in all modes, we must supply a key.
resValue "string", "CodePushDeploymentKey", '""'
...
}
releaseStaging {
...
resValue "string", "CodePushDeploymentKey", '"<INSERT_STAGING_KEY>"'
// Note: It's 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>"'
...
}
}
...
}
# Android 에서 hermes를 사용하고 있다면 staging빌드시 충돌로 앱이 종료됩니다 #
include ':app', ':react-native-code-push'
project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')
...
// 1. Import the plugin class.
import com.microsoft.codepush.react.CodePush;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
...
// 2. Override the getJSBundleFile method to let
// the CodePush runtime determine where to get the JS
// bundle location from on each app start
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
};
}