선택사항인 Firebase 앱 배포 SDK를 사용하면 앱의 새 빌드를 설치할 수 있게 될 때 테스터에게 인앱 알림을 표시할 수 있습니다. 이 가이드에서는 앱 배포 SDK를 사용하여 테스터를 위한 새 빌드 알림을 만들고 맞춤설정하는 방법을 설명합니다.
시작하기 전에
아직 추가하지 않았다면 Android 프로젝트에 Firebase를 추가합니다.
1단계: App Distribution Tester API 사용 설정
Google Cloud Console에서 프로젝트를 선택합니다.
Firebase App Testers API에서 사용 설정을 클릭합니다.
2단계: 앱에 앱 배포 추가
앱 수준 모듈 Gradle 파일(일반적으로 app/build.gradle
)에서 앱 배포 Android SDK에 관한 종속 항목을 선언합니다.
자바
dependencies {
// ADD this line
implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta02'
}
Kotlin+KTX
dependencies {
// ADD this line
implementation 'com.google.firebase:firebase-appdistribution-ktx:16.0.0-beta02'
}
3단계: 인앱 알림 구성
앱 배포 SDK는 테스터를 위한 인앱 빌드 알림을 설정할 수 있도록 다음과 같은 방법을 제공합니다.
- 테스터에게 표시할 사전 빌드된 앱 업데이트 및 로그인 대화상자와 함께 제공되는 기본 알림 구성
- 자체 사용자 인터페이스를 맞춤설정할 수 있는 고급 알림 구성
앱 배포 SDK를 처음 사용하는 경우에는 기본 알림 구성을 사용하는 것이 좋습니다.
기본 구성
updateIfNewReleaseAvailable
을 사용하여 아직 알림을 사용 설정하지 않은 테스터에게 사전 빌드된 알림 사용 설정 대화상자를 표시한 다음 새 빌드를 사용할 수 있는지 확인합니다. 이 메서드를 호출하면 다음과 같은 순서가 적용됩니다.
테스터가 알림을 사용 설정했는지 확인합니다. 테스터가 아직 알림을 사용 설정하지 않은 경우 이 메서드가 테스터에게 Google 계정으로 앱 배포에 로그인하라는 메시지를 표시합니다.
테스터가 설치할 수 있는 최신 빌드를 확인합니다.
테스터에게 업데이트하라는 사전 빌드된 알림을 표시합니다.
새 빌드가 Android App Bundle(AAB)인 경우 테스터를 Google Play로 리디렉션하여 업데이트 프로세스를 완료합니다.
새 빌드가 Android 애플리케이션 패키지(APK)인 경우 SDK가 백그라운드에서 새 빌드를 다운로드하고 다운로드가 완료되면 테스터에게 설치하라는 메시지를 표시합니다. SDK가
NotificationManager
를 사용하여 다운로드 진행률 알림을 사용자에게 보냅니다. 또한updateIfNewReleaseAvailable
태스크에onProgressUpdate
핸들러를 연결하여 자체 진행률 표시기를 추가할 수도 있습니다.
언제든지 앱에서 updateIfNewReleaseAvailable()
을 호출할 수 있습니다. 예를 들어 MainActivity의 onResume()
메서드 중에 updateIfNewReleaseAvailable()
을 호출할 수 있습니다.
다음 예시에서는 테스터가 알림을 사용 설정했는지, 새 빌드에 액세스할 수 있는지 확인합니다. 이러한 조건이 충족되면 빌드를 설치할 수 있을 때 대화상자가 표시됩니다.
자바
public class MainActivity extends AppCompatActivity {
FirebaseAppDistribution firebaseAppDistribution =
FirebaseAppDistribution.getInstance();
@Override
public void onResume() {
super.onResume();
firebaseAppDistribution.updateIfNewReleaseAvailable()
.addOnProgressListener(updateProgress -> {
// (Optional) Implement custom progress updates in addition to
// automatic NotificationManager updates.
})
.addOnFailureListener(e -> {
if (e instanceof FirebaseAppDistributionException) {
// Handle exception.
}
});
}
}
Kotlin+KTX
class MainActivity : AppCompatActivity() {
var firebaseAppDistribution = FirebaseAppDistribution.getInstance()
override fun onResume() {
super.onResume()
firebaseAppDistribution.updateIfNewReleaseAvailable()
.addOnProgressListener { updateProgress ->
// (Optional) Implement custom progress updates in addition to
// automatic NotificationManager updates.
}
.addOnFailureListener { e ->
if (e is FirebaseAppDistributionException) {
// Handle exception.
}
}
}
}
고급 구성
고급 로그인 구성
signInTester
및 isTesterSignedIn
메서드를 사용하면 테스터의 로그인 환경을 더 유연하게 맞춤설정할 수 있으므로 테스터 환경을 앱의 디자인과 분위기에 보다 잘 맞게 만들 수 있습니다.
다음 예시에서는 테스터가 앱 배포 테스터 계정에 이미 로그인했는지 확인합니다. 이렇게 하면 아직 로그인하지 않은 테스터에게만 로그인 사용자 인터페이스(UI)를 표시할 수 있습니다. 테스터가 로그인한 후 updateIfNewReleaseAvailable
을 호출하여 테스터가 새로운 빌드에 액세스할 수 있는지 확인할 수 있습니다.
자바
if (!firebaseAppDistribution.isTesterSignedIn()) {
// Start your sign in UI here.
//
// When the tester chooses to proceed with the update,
// call signInTester():
//
// firebaseAppDistribution.signInTester().addOnSuccessListener( unused -> {
// // Handle successful sign in.
// }).addOnFailureListener(e -> {
// // Handle failed sign in.
// });
}
// Only check for updates if the tester is already signed in (do not prompt).
if (firebaseAppDistribution.isTesterSignedIn()) {
firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener( e -> {
// Handle failed update.
});
}
Kotlin+KTX
if (!firebaseAppDistribution.isTesterSignedIn) {
// Start your sign in UI here.
//
// When the tester chooses to proceed with the update,
// call signInTester():
//
// firebaseAppDistribution.signInTester().addOnSuccessListener {
// // Handle successful sign in.
// }.addOnFailureListener {
// // Handle failed sign in.
// });
}
// Only check for updates if the tester is already signed in (do not prompt).
if (firebaseAppDistribution.isTesterSignedIn) {
firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener {
// Handle failed update.
}
}
고급 업데이트 구성
checkForNewRelease
및 updateApp
메서드를 사용하면 테스터에게 업데이트하라는 메시지가 표시되는 시점을 더 유연하게 맞춤설정할 수 있습니다. 또한 사전 빌드된 업데이트 대화상자 및 다운로드 진행률 표시기를 맞춤설정하여 앱의 디자인과 분위기에 보다 잘 맞게 만들 수 있습니다.
updateApp
은 다운로드 진행률 표시를 제공하지 않습니다. 즉, 일종의 인앱 상태 표시인 NotificationManager
또는 다른 접근 방식을 사용하여 자체 진행률 표시를 구현해야 합니다.
다음 예시에서는 새 출시 버전을 사용할 수 있는지 확인한 다음 커스텀 UI를 표시합니다. checkForNewRelease
및 updateApp
을 호출하기 전에 고급 로그인 구성을 사용하여 테스터가 로그인했는지 확인하세요.
자바
firebaseAppDistribution.checkForNewRelease().addOnSuccessListener(release -> {
if (release != null) { // New release available.
// Start your update UI here.
//
// When the tester chooses to proceed with the update, call updateApp():
//
// firebaseAppDistribution.updateApp()
// .addOnProgressListener(updateState -> {
// // Use updateState to show update progress.
// });
}
}).addOnFailureListener(e -> {
// Handle failed check for new release.
});
Kotlin+KTX
firebaseAppDistribution.checkForNewRelease().addOnSuccessListener { release ->
if (release != null) { // New release available.
// Start your update UI here.
//
// When the tester chooses to proceed with the update, call updateApp():
//
// firebaseAppDistribution.updateApp()
// .addOnProgressListener { updateState ->
// // Use updateState to show update progress.
// }
}
}.addOnFailureListener {
// Handle failed check for new release.
}
4단계: 제출하기 전에 앱 배포를 출시 전 빌드로 격리
앱 배포 Android SDK는 프로덕션 앱에 포함하기 위한 것이 아닙니다. 해당 코드가 런타임 시 실행되지 않더라도 SDK에는 Google Play 정책을 위반하는 것으로 간주될 수 있는 자체 업데이트 기능이 포함되어 있습니다.
프로덕션 앱에 Android SDK 코드를 포함하지 않도록 하려면 출시 전 빌드 변형 소스 세트에 구현되었지만 프로덕션 소스 세트에는 포함되지 않은 클래스의 SDK를 사용하는 것이 좋습니다. 해당 클래스가 앱의 나머지 부분에 필요한 기능을 노출해야 합니다.
예를 들어 위의 고급 로그인 구성을 사용하는 경우 SDK를 사용하는 메서드로 출시 전 변경에서 클래스를 구현하여 테스터를 로그인 처리하고 앱을 업데이트합니다.
자바
// src/{pre-release variant}/java/com/example/AppDistributionWrapper.java
class AppDistributionWrapper {
FirebaseAppDistribution firebaseAppDistribution =
FirebaseAppDistribution.getInstance();
void signInAndUpdate() {
// Use the App Distribution SDK to sign in the tester and update the app.
}
}
Kotlin+KTX
// src/{pre-release variant}/java/com/example/AppDistributionWrapper.kt
class AppDistributionWrapper {
val firebaseAppDistribution = FirebaseAppDistribution.getInstance()
fun signInAndUpdate() {
// Use the App Distribution SDK to sign in the tester and update the app.
}
}
SDK를 사용하지 않는 프로덕션 변형 소스에서 동일한 클래스의 버전을 구현합니다.
자바
// src/{production variant}/java/com/example/AppDistributionWrapper.java
class AppDistributionWrapper {
void signInAndUpdate() {
// In production, do nothing.
}
}
Kotlin+KTX
// src/{production variant}/java/com/example/AppDistributionWrapper.kt
class AppDistributionWrapper {
fun signInAndUpdate() {
// In production, do nothing.
}
}
앱 코드에서 래퍼 메서드를 호출합니다(예: 기본 활동의 onResume()
).
자바
// src/main/java/com/example/MainActivity.java
public class MainActivity extends AppCompatActivity {
AppDistributionWrapper appDistributionWrapper =
new AppDistributionWrapper();
@Override
public void onResume() {
super.onResume();
appDistributionWrapper.signInAndUpdate();
}
}
Kotlin+KTX
// src/main/java/com/example/MainActivity.kt
class MainActivity : AppCompatActivity() {
var appDistributionWrapper = AppDistributionWrapper()
override fun onResume() {
super.onResume()
appDistributionWrapper.signInAndUpdate()
}
}
앱 수준 모듈 Gradle 파일(일반적으로 app/build.gradle
)에서 출시 전 빌드 변형만 포함하도록 앱 배포 Android SDK에 관한 종속 항목을 업데이트합니다.
자바
dependencies {
// UPDATE the dependency to include the "beta" variant only (example)
betaImplementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta02'
}
Kotlin+KTX
dependencies {
// UPDATE the dependency to include the "beta" variant only (example)
betaImplementation 'com.google.firebase:firebase-appdistribution-ktx:16.0.0-beta02'
}
5단계: 구현 빌드 및 테스트
마지막으로 Firebase Console을 사용하여 테스터에 빌드를 배포하는 방식으로 앱을 빌드하고 구현을 테스트합니다.
다음과 같은 일반적인 문제에 대한 도움말은 앱 배포 문제 해결 가이드를 참조하세요.
- 테스터가 인앱 알림을 받지 못함
- 테스터에게 Google에 로그인하라는 메시지가 두 번 이상 표시됨
- 테스터에게 로그인 루프가 발생함