App Center 배포 – Unity 앱 내 업데이트

중요

Visual Studio App Center는 2025년 3월 31일에 사용 중지될 예정입니다. Visual Studio App Center가 완전히 사용 중지될 때까지 계속 사용할 수 있지만 마이그레이션을 고려할 수 있는 몇 가지 권장 대안이 있습니다.

지원 타임라인 및 대안에 대해 자세히 알아보세요.

App Center 배포를 사용하면 App Center를 통해 배포한 후 사용자/테스터가 새 버전의 앱을 설치할 수 있습니다. 사용하도록 설정하면 SDK는 최신 업데이트의 설치를 다운로드하거나 연기할 수 있는 업데이트 대화 상자를 사용자에게 제공합니다. 업데이트하도록 선택하면 SDK가 애플리케이션을 업데이트하기 시작합니다.

중요

Unity용 SDK 배포 는 UWP를 지원하지 않습니다. 이 페이지의 지침은 Android 및 iOS만 다룹니다.

경고

Google Play는 앱 내 업데이트 코드가 런타임에 사용되지 않더라도 악의적인 동작으로 간주합니다. Google Play에 앱을 제출하기 전에 이 섹션 의 지시대로 이 코드를 제거합니다. 앱 내 업데이트 코드를 제거하지 않으면 Google Play에서 앱이 비준수 및 제거됩니다.

참고

자동화된 UI 테스트를 실행하는 경우 앱 내 업데이트를 사용하도록 설정하면 App Center 백 엔드에 대해 인증을 시도하므로 자동화된 UI 테스트가 차단됩니다. UI 테스트에 대한 앱 내 업데이트를 사용하지 않도록 설정하는 것이 좋습니다.

앱에 앱 내 업데이트 추가

App Center 배포 모듈 추가

App Center SDK는 모듈식 접근 방식으로 설계되었습니다. 개발자는 관심 있는 서비스의 모듈만 통합하면 됩니다.

아직 애플리케이션에서 SDK를 설정하고 시작하지 않은 경우 Unity 시작 문서를 따릅니다. App Center 배포 패키지를 가져와야 합니다. 해당 이름은 형식 AppCenterDistribute-v{version}.unitypackage이어야 합니다.

참고

Android 10 이상에는 백그라운드에서의 시작 활동에 대한 제한이 있습니다. 백그라운드에서 활동 시작에 대한 제한 사항에 대한 문서를 참조하세요.

참고

Android 10(Go 버전)에서 실행되는 앱은 SYSTEM_ALERT_WINDOW 권한을 받을 수 없습니다. Go 디바이스의 SYSTEM_ALERT_WINDOW 대한 문서를 참조하세요.

참고

Android 11 ACTION_MANAGE_OVERLAY_PERMISSION 부터 의도는 항상 사용자가 앱에 대한 권한을 부여하거나 취소 SYSTEM_ALERT_WINDOW 할 수 있는 최상위 설정 화면으로 사용자를 가져옵니다. Android 11의 권한 업데이트에 대한 문서를 참조하세요.

Google Play 빌드에 대한 앱 내 업데이트 제거

Google Play는 앱 내 업데이트 코드가 런타임에 사용되지 않더라도 악의적인 동작으로 간주합니다. Google Play에 앱을 제출하기 전에 이 코드를 제거합니다. 앱 내 업데이트 코드를 제거하지 않으면 Google Play에서 앱이 비준수 및 제거됩니다. 앱에서 바로 업데이트 네이티브 코드를 제거하려면 AppCenterBehavior가 연결된 게임 개체의 배포 섹션 아래에서 배포 사용 확인란의 선택을 취소합니다.

프라이빗 메일 그룹 사용

기본적으로 배포는 공용 메일 그룹을 사용합니다. 프라이빗 메일 그룹을 사용하려면 프라이빗으로 변경 UpdateTrack 해야 합니다. 이렇게 하려면 AppCenterBehavior가 연결된 게임 개체의 배포 섹션 아래 업데이트 트랙 드롭다운에서 프라이빗을 선택합니다.

프라이빗 트랙을 사용하는 경우 브라우저 창이 열리고 사용자를 인증합니다. 모든 후속 업데이트 검사는 프라이빗 트랙에서 최신 릴리스를 가져옵니다.

사용자가 프라이빗 트랙에 있는 경우 인증이 성공하면 멤버인 프라이빗 메일 그룹에서 최신 릴리스를 받게 됩니다. 사용자가 공개 트랙에 있는 경우 모든 퍼블릭 배포 그룹에서 최신 릴리스를 받게 됩니다.

자동 업데이트 확인 사용 안 함

기본적으로 SDK는 새 릴리스를 자동으로 확인합니다.

  • 애플리케이션이 시작될 때.
  • 애플리케이션이 백그라운드로 전환되면 다시 포그라운드로 이동합니다.
  • 이전에 사용하지 않도록 설정된 경우 배포 모듈을 사용하도록 설정하는 경우.

새 릴리스에 대해 수동으로 검사 경우 업데이트에 대한 자동 검사 사용하지 않도록 설정할 수 있습니다.

이렇게 하려면 AppCenterBehavior가 연결된 게임 개체의 배포 섹션에서 업데이트 자동 확인 확인란의 선택을 취소합니다.

그런 다음, 다음 섹션에 CheckForUpdate 설명된 API를 사용할 수 있습니다.

수동으로 업데이트 확인

Distribute.CheckForUpdate();

그러면 App Center에 요청을 보내고 사용 가능한 새 릴리스가 있는 경우 업데이트 대화 상자를 표시합니다.

참고

자동 업데이트를 사용하도록 설정한 경우에도 업데이트 호출에 대한 수동 검사 작동합니다. 다른 검사 이미 수행 중인 경우 업데이트에 대한 수동 검사 무시됩니다. 사용자가 업데이트를 연기한 경우(최신 버전이 필수 업데이트가 아닌 경우) 업데이트에 대한 수동 검사 처리되지 않습니다.

앱 내 업데이트 대화 상자 사용자 지정 또는 지역화

1. 텍스트 사용자 지정 또는 지역화

업데이트 대화 상자에 표시된 텍스트를 지역화하려는 경우 고유한 리소스 문자열을 제공할 수 있습니다. 이 iOS 리소스 파일에서 iOS용 문자열 파일과 이 Android 리소스 파일의 Android용 문자열 파일을 확인합니다. 동일한 문자열 이름/키를 사용하고 사용자 고유의 앱 리소스 파일의 대화 상자에 반영할 지역화된 값을 지정합니다.

2. 업데이트 대화 상자 사용자 지정

콜백을 구현 ReleaseAvailable 하여 기본 업데이트 대화 상자의 모양을 사용자 지정할 수 있습니다.

경고

릴리스 콜백 Awake 호출이 누락되는 것을 방지하기 위해 애플리케이션이 로드하는 첫 번째 장면에서 의 MonoBehaviour 메서드에 콜백을 등록해야 합니다.

// In this example, OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;

다음은 SDK 대화 상자를 사용자 지정 논리로 대체하는 콜백 구현입니다.

bool OnReleaseAvailable(ReleaseDetails releaseDetails)
{
    // Look at releaseDetails public properties to get version information, release notes text or release notes URL
    string versionName = releaseDetails.ShortVersion;
    string versionCodeOrBuildNumber = releaseDetails.Version;
    string releaseNotes = releaseDetails.ReleaseNotes;
    Uri releaseNotesUrl = releaseDetails.ReleaseNotesUrl;

    // (Do something with the values if you want)

    // On mandatory update, user can't postpone
    if (releaseDetails.MandatoryUpdate)
    {
        // Force user to update (you should probably show some custom UI here)
        Distribute.NotifyUpdateAction(UpdateAction.Update);
    }
    else
    {
        // Allow user to update or postpone (you should probably show some custom UI here)
        // "GetUserUpdateAction()" isn't part of the SDK; it just represents a way of getting user response.
        // This blocks the thread while awaiting the user's response! This example shouldn't be used literally
        UpdateAction updateAction = GetUserUpdateAction();
        Distribute.NotifyUpdateAction(updateAction);
    }
    // Return true if you're using your own UI to get user response, false otherwise
    return true;
}

Android에 대한 구현 정보:

예제와 같이 콜백이 를 반환true하는 경우 또는 Distribute.NotifyUpdateAction(UpdateAction.POSTPONE); 를 호출 Distribute.NotifyUpdateAction(UpdateAction.UPDATE); 해야 합니다.

를 호출 NotifyUpdateAction하지 않으면 모든 활동 변경에 대해 콜백이 반복됩니다.

사용자 작업이 SDK에 알림이 표시되기 전에 활동이 변경되면 동일한 릴리스로 콜백을 다시 호출할 수 있습니다.

이 동작은 다음 시나리오를 다루는 데 필요합니다.

  • 애플리케이션이 백그라운드로 전송된 다음(예: 누르기) 다른 작업에서 다시 시작됩니다.
  • 애플리케이션을 벗어나지 않고도(예: 일부 알림을 클릭하는 경우) 활동이 다른 작업으로 처리됩니다.
  • 위의 시나리오와 유사합니다.

이 경우 대화 상자를 호스트하는 활동이 사용자 상호 작용 없이 대체될 수 있습니다. 따라서 SDK는 사용자 지정 대화 상자를 복원할 수 있도록 수신기를 다시 호출합니다.

3. 업데이트가 없으면 코드 실행

SDK가 업데이트를 확인하고 현재 사용된 NoReleaseAvailable 업데이트보다 최신 업데이트를 찾지 못하는 경우 콜백이 호출됩니다. 이렇게 하면 이러한 시나리오에서 사용자 지정 코드를 실행할 수 있습니다. 다음 예제와 같이 호출 AppCenter.Start 하기 전에 콜백을 등록해야 합니다.

// In this example OnNoReleaseAvailable is a method name in same class
Distribute.NoReleaseAvailable = OnNoReleaseAvailable;
AppCenter.Start(...);
void OnNoReleaseAvailable()
{
    AppCenterLog.Info(LogTag, "No release available callback invoked.");
}

## Enable or disable App Center Distribute at runtime

You can enable and disable App Center Distribute at runtime. If you disable it, the SDK won't provide any in-app update functionality but you can still use the Distribute service in the App Center portal.

To disable the Distribute service, use the following code:

```csharp
Distribute.SetEnabledAsync(false);

App Center 배포를 다시 사용하도록 설정하려면 동일한 API를 사용하지만 매개 변수로 전달 true 합니다.

Distribute.SetEnabledAsync(true);

이 API는 비동기이며 App Center 비동기 API 가이드에서 자세히 확인할 수 있습니다.

다른 API 호출(예: IsEnabledAsync)을 일관되게 만들기 위해 이 호출을 기다릴 필요가 없습니다.

상태는 애플리케이션이 시작되는 동안 디바이스의 스토리지에 유지됩니다.

App Center 배포가 사용하도록 설정되어 있는지 확인

App Center 배포가 사용되는지 검사 수도 있습니다.

Distribute.IsEnabledAsync();

이 API는 비동기이며 App Center 비동기 API 가이드에서 자세히 확인할 수 있습니다.

디버그 빌드에 대한 앱 내 업데이트 사용

기본적으로 앱 내 업데이트는 릴리스 빌드에 대해서만 사용하도록 설정됩니다.

Android 및 iOS에서 디버그 빌드에 대한 앱 내 업데이트를 사용하도록 설정하려면 AppCenterBehavior가 연결된 게임 개체의 배포 섹션 아래에 있는 디버그에서 배포 사용 확인란을 검사.

App Center 동작

Unity에서 디버깅 가능한 빌드는 개발 빌드 옵션이 선택된 빌드입니다.

업데이트를 위해 앱이 닫히기 직전에 클린 수행

참고

이 콜백은 iOS에서만 작동합니다.

다음 예제와 같이 콜백을 등록합니다.

// In this example, OnWillExitApp is a method name in same class
Distribute.WillExitApp = OnWillExitApp;
void OnWillExitApp()
{
    // Perform clean up here
}

이를 OnWillExitApp() 통해 배포가 닫히려고 할 때 가 호출됩니다.

앱 내 업데이트 작동 방식

참고

앱 내 업데이트가 작동하려면 링크에서 앱 빌드를 다운로드해야 합니다. IDE에서 설치하거나 수동으로 설치하면 작동하지 않습니다.

앱 내 업데이트 기능은 다음과 같이 작동합니다.

  1. 이 기능은 App Center 배포 서비스를 사용하여 배포되는 릴리스 빌드(기본적으로)에서만 작동합니다. iOS 단계별 액세스 기능이 켜져 있으면 작동하지 않습니다.
  2. SDK를 통합한 후 앱의 릴리스 버전을 빌드하고 App Center에 업로드합니다. 메일 그룹의 사용자는 이메일을 통해 새 릴리스에 대한 알림을 받습니다.
  3. 각 사용자가 전자 메일에서 링크를 열면 애플리케이션이 디바이스에 설치됩니다. 전자 메일 링크를 사용하여 설치하는 것이 중요합니다. 사이드 로드는 지원하지 않습니다. 링크에서 애플리케이션을 다운로드하면 SDK는 쿠키에서 중요한 정보를 저장하여 나중에 업데이트를 위해 검사 저장합니다. 그렇지 않으면 SDK에 해당 키 정보가 없습니다.
  4. 애플리케이션이 트랙을 프라이빗으로 설정하면 브라우저가 열리고 사용자를 인증하고 앱 내 업데이트를 사용하도록 설정합니다. 공용 트랙으로 다시 전환하고 나중에 다시 프라이빗으로 다시 전환하는 경우에도 인증 정보가 유효한 상태로 유지되는 한 브라우저가 다시 열리지 않습니다. 브라우저 인증에 성공하면 사용자가 자동으로 애플리케이션으로 다시 리디렉션됩니다. 트랙이 공용(기본값)이면 다음 단계가 직접 수행됩니다.
  5. 앱의 새 릴리스는 다음과 같은 경우 사용자에게 애플리케이션을 업데이트하도록 요청하는 앱 내 업데이트 대화 상자를 보여줍니다.
    • iOS:
      • 또는 의 CFBundleShortVersionString 더 높은 값
      • 의 값은 CFBundleShortVersionString 같지만 값은 입니다 CFBundleVersion.
      • 버전은 동일하지만 빌드 고유 식별자는 다릅니다.
    • Android:
      • 또는 의 versionCode 더 높은 값
      • 의 값이 versionCode 같지만 의 다른 값입니다 versionName.

동일한 .apk/.ipa를 두 번 업로드하면 이진 파일이 동일하므로 대화 상자가 표시되지 않습니다. iOS에서 동일한 버전 속성을 사용하여 새 빌드를 업로드하면 업데이트 대화 상자가 표시됩니다. 그 이유는 다른 이진이기 때문입니다. Android에서 이진 파일은 두 버전 속성이 동일한 경우 동일하게 간주됩니다.

앱 내 업데이트를 테스트할 어떻게 할까요? 있나요?

앱 내 업데이트를 테스트하려면 App Center SDK의 배포 모듈을 사용하는 릴리스 빌드를 App Center 포털에 업로드하여 매번 버전 번호를 늘려야 합니다.

  1. 아직 앱이 없는 경우 App Center 포털에서 앱을 만듭니다.
  2. 새 메일 그룹을 만들고 이름을 지정합니다.
  3. 자신(또는 앱 내 업데이트 기능 테스트에 포함하려는 모든 사용자)을 추가합니다. 이 단계에서는 이 앱에서 아직 사용되지 않은 새 전자 메일 주소 또는 버리기 전자 메일 주소를 사용합니다. 이렇게 하면 실제 테스터의 환경에 가까운 경험을 할 수 있습니다.
  4. 아래에 설명된 대로 App Center 배포 를 포함하고 설치 논리를 포함하는 앱의 새 빌드를 만듭니다. 그룹이 프라이빗인 경우 속성 사용을 UpdateTrack시작하기 전에 프라이빗 앱 내 업데이트 트랙을 설정하는 것을 잊지 마세요.
  5. 포털에서 새 릴리스 배포 단추를 클릭하고 앱 빌드를 업로드합니다.
  6. 업로드가 완료되면 다음을 클릭하고 이전에 해당 앱 배포의 대상으로 만든 배포 그룹을 선택합니다.
  7. 배포를 검토하고 앱 내 테스트 그룹에 빌드를 배포합니다.
  8. 해당 그룹의 사람 앱의 테스터로 초대를 받습니다. 초대를 수락하면 모바일 디바이스에서 App Center 포털에서 앱을 다운로드할 수 있습니다. 앱 내 업데이트가 설치되면 앱 내 업데이트를 테스트할 준비가 된 것입니다.
  9. 앱의 버전(CFBundleShortVersionString 또는 CFBundleVersion iOS의 versionCode 경우 Android의 경우)을 부딪치세요.
  10. 앱의 릴리스 버전을 빌드하고 이전 단계에서 수행한 것처럼 새 빌드를 업로드합니다. 이전에 만든 메일 그룹에 배포합니다. 다음에 앱이 시작될 때 메일 그룹의 구성원에게 새 버전을 입력하라는 메시지가 표시됩니다.

메일 그룹 등에 대한 자세한 내용은 App Center 배포를 활용하는 방법에 대한 정보를 살펴보십시오. App Center 배포를 사용하여 코드를 추가하지 않고도 새 버전의 앱을 배포할 수 있지만 앱 코드에 App Center 배포를 추가하면 테스터와 사용자가 앱에서 바로 업데이트 환경을 얻을 때 더 원활한 환경이 제공됩니다.