App Center 배포 – MAUI 및 Xamarin 앱 내 업데이트

중요

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

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

App Center 배포를 사용하면 App Center를 통해 배포할 때 사용자가 새 버전의 앱을 설치할 수 있습니다. 새 버전의 앱을 사용할 수 있는 경우 SDK는 사용자에게 업데이트 대화 상자를 표시하여 새 버전을 다운로드하거나 연기합니다. 업데이트하도록 선택하면 SDK가 애플리케이션을 업데이트하기 시작합니다.

경고

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

참고

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

앱에 앱 내 업데이트 추가

아직 애플리케이션에서 SDK를 설정하고 시작하지 않은 경우 시작 섹션을 따릅니다.

1. App Center 배포 모듈 추가

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

Mac용 Visual Studio

  • Mac용 Visual Studio를 엽니다.
  • 파일>열기를 클릭하고 솔루션을 선택합니다.
  • 솔루션 탐색기에서 패키지 섹션을 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 추가...를 선택합니다.
  • App Center를 검색하고 App Center 배포를 설치합니다.
  • 패키지 추가를 클릭합니다.

Visual Studio for Windows

  • Windows용 Visual Studio를 엽니다.
  • 파일>열기를 클릭하고 솔루션을 선택합니다.
  • 솔루션 탐색기에서 참조를 마우스 오른쪽 단추 클릭하고 NuGet 패키지 관리를 선택합니다.
  • App Center를 검색하고 Microsoft.AppCenter.Distribute를 설치합니다.

패키지 관리자 콘솔

  • Visual Studio에서 콘솔을 엽니다. 이렇게 하려면 도구>NuGet 패키지 관리자 패키지 관리자>콘솔을 선택합니다.
  • Mac용 Visual Studio 작업하는 경우 NuGet 패키지 관리 확장을 설치했는지 확인합니다. 이를 위해 Visual Studio>확장을 선택하고 , NuGet 을 검색하고, 필요한 경우 설치합니다.
  • 콘솔에서 다음 명령을 입력합니다.
Install-Package Microsoft.AppCenter.Distribute

참고

이식 가능한 프로젝트(예: Xamarin.Forms)에서 App Center SDK를 사용하는 경우 각 프로젝트에 이식 가능한 패키지, Android 및 iOS 패키지를 설치해야 합니다. 이렇게 하려면 각 하위 프로젝트를 열고 Mac용 Visual Studio 또는 Windows용 Visual Studio 섹션에 설명된 해당 단계를 따라야 합니다.

참고

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

참고

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

참고

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

2. App Center 배포 시작

시작 가이드에 설명된 대로 를 호출 AppCenter.Start(...) 하여 App Center SDK를 구성합니다.

iOS 애플리케이션의 경우 를 열고 AppDelegate.cs 를 호출LoadApplication하기 전에 다음 줄을 추가합니다.

Distribute.DontCheckForUpdatesInDebug();

런타임에 디버그 구성이 자동으로 검색되는 Android에서는 이 단계가 필요하지 않습니다.

Android에서 디버그 빌드에 대한 앱 내 업데이트를 사용하도록 설정하려면 프로젝트의 MainActivity.cs 파일, 메서드 및 이전LoadApplication에서 다음 메서드를 OnCreate 호출합니다.

Distribute.SetEnabledForDebuggableBuild(true);

참고

이 메서드는 디버그 빌드에만 영향을 줍니다. 릴리스 빌드에는 영향을 주지 않습니다.

2.3 [iOS 전용] 프로젝트의 Info.plist 수정

App Center SDK는 테스트용 로드를 방지하기 위해 애플리케이션으로 리디렉션되는 URL을 확인하므로 포털을 통해 배포된 업데이트가 올바르게 처리되려면 파일 섹션에서 Info.plist 를 지정 CFBundleURLSchemesCFBundleURLTypes 해야 합니다.

참고

Info.plist또는 정보 속성 목록 파일은 번들 실행 파일에 대한 필수 구성 정보를 포함하는 구조화된 텍스트 파일입니다. 자세한 내용은 Apple 개발자 설명서에서 확인할 수 있습니다.

  1. 또는 에 대한 URL typesCFBundleURLTypes 새 키를 Info.plist 파일에 추가합니다(Xcode가 Info.plist를 소스 코드로 표시하는 경우).
  2. 첫 번째 자식 항목의 키를 또는 CFBundleURLSchemesURL Schemes 변경합니다.
  3. URL 체계로 를 입력하고 를 앱의 앱 비밀로 바 ${APP_SECRET}appcenter-${APP_SECRET} 니다.

Info.plist를 올바르게 수정했는지 확인하려면 소스 코드로 엽니다. 대신 앱 비밀 ${APP_SECRET}에 다음 항목이 포함되어야 합니다.

<key>CFBundleURLTypes</key>
  <array>
      <dict>
          <key>CFBundleURLSchemes</key>
          <array>
              <string>appcenter-${APP_SECRET}</string>
          </array>
      </dict>
  </array>

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

Google Play는 앱 내 업데이트 코드가 런타임에 사용되지 않더라도 악의적인 동작으로 간주합니다. 앱 내 업데이트 코드를 제거하지 않으면 Google Play에서 앱이 비준수 및 제거됩니다. 더 쉽게 하기 위해 스텁된 API를 사용하여 App Center 배포 SDK 버전을 제공하므로 종속성 교환만 변경됩니다.

  1. Xamarin.Android 및 공유 프로젝트에 대해 라는 GooglePlay 새 빌드 구성을 추가합니다. 프로젝트 빌드 구성이 적절한 솔루션 구성에 올바르게 매핑되었는지 확인합니다. 자세한 내용은 Visual Studio 또는 Mac용 Visual Studio 지침을 참조하세요.

  2. 텍스트 편집기에서 Xamarin.Android 및 공유 프로젝트'를 .csproj 열고 배포 참조를 조건부 항목 그룹으로 이동합니다.

    <ItemGroup Condition=" '$(Configuration)' != 'GooglePlay' ">
        <PackageReference Include="Microsoft.AppCenter.Distribute" Version="3.3.0" />
    </ItemGroup>
    <ItemGroup Condition=" '$(Configuration)' == 'GooglePlay' ">
        <PackageReference Include="Microsoft.AppCenter.DistributePlay" Version="3.3.0" />
    </ItemGroup>
    

    참고

    이전 packages.config 형식을 사용하여 NuGet 참조를 관리하는 경우 PackageReference 형식으로 마이그레이션하고 마이그레이션 지침을 따릅니다.

  3. 변경 내용을 저장하고 NuGet 패키지를 복원합니다.

  4. IDE 맨 위에 있는 명령 모음에서 구성을 변경할 수 있습니다.

프라이빗 메일 그룹 사용

기본적으로 배포는 공용 메일 그룹을 사용합니다. 프라이빗 메일 그룹을 사용하려면 속성을 통해 UpdateTrack 명시적으로 설정해야 합니다.

Distribute.UpdateTrack = UpdateTrack.Private;

참고

기본값은 UpdateTrack.Public입니다. 이 속성은 메서드 호출 전에 AppCenter.Start 만 업데이트할 수 있습니다. 업데이트 트랙에 대한 변경 내용은 애플리케이션 프로세스가 다시 시작될 때 유지되지 않으므로 호출 전에 AppCenter.Start 속성이 항상 업데이트되지 않는 경우 기본적으로 공개됩니다.

이 호출 후에는 사용자를 인증하기 위한 브라우저 창이 열립니다. 모든 후속 업데이트 검사는 프라이빗 트랙에서 최신 릴리스를 가져옵니다. 업데이트 트랙은 앱이 시작되는 동안 SDK에 유지되지 않습니다.

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

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

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

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

새 릴리스에 대해 수동으로 검사 경우 업데이트에 대한 자동 검사 사용하지 않도록 설정할 수 있습니다. 이렇게 하려면 SDK가 시작되기 전에 다음 메서드를 호출합니다.

Distribute.DisableAutomaticCheckForUpdate();

참고

메서드를 호출하기 전에 이 메서드를 AppCenter.Start 호출해야 합니다.

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

수동으로 업데이트 확인

Distribute.CheckForUpdate();

참고

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

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

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

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

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

콜백을 구현 ReleaseAvailable 하여 기본 업데이트 대화 상자의 모양을 사용자 지정할 수 있습니다. 다음 예제와 같이 호출 AppCenter.Start 하기 전에 콜백을 등록해야 합니다.

// In this example OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;
AppCenter.Start(...);

다음은 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;

    // custom dialog
    var title = "Version " + versionName + " available!";
    Task answer;

    // On mandatory update, user can't postpone
    if (releaseDetails.MandatoryUpdate)
    {
        answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install");
    }
    else
    {
        answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install", "Maybe tomorrow...");
    }
    answer.ContinueWith((task) =>
    {
        // If mandatory or if answer was positive
        if (releaseDetails.MandatoryUpdate || (task as Task<bool>).Result)
        {
            // Notify SDK that user selected update
            Distribute.NotifyUpdateAction(UpdateAction.Update);
        }
        else
        {
            // Notify SDK that user selected postpone (for 1 day)
            // This method call is ignored by the SDK if the update is mandatory
            Distribute.NotifyUpdateAction(UpdateAction.Postpone);
        }
    });

    // Return true if you're using your own dialog, false otherwise
    return true;
}

Xamarin.Android에 대한 구현 정보:

예제와 같이 를 호출하거나 Distribute.NotifyUpdateAction(UpdateAction.POSTPONE); 콜백이 를 반환true하는 경우 를 호출 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.");
}

런타임에 App Center 배포 사용 또는 사용 안 함

런타임에 App Center 배포를 사용하도록 설정하고 사용하지 않도록 설정할 수 있습니다. 사용하지 않도록 설정하면 SDK는 앱 내 업데이트 기능을 제공하지 않지만 App Center 포털에서 서비스 배포를 계속 사용할 수 있습니다.

Distribute.SetEnabledAsync(false);

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

Distribute.SetEnabledAsync(true);

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

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

참고

이 메서드는 시작된 후에 Distribute 만 사용해야 합니다.

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

App Center 배포를 사용하는지 여부를 검사 수도 있습니다.

bool enabled = await Distribute.IsEnabledAsync();

참고

이 메서드는 시작된 후에 Distribute 만 사용해야 하며, 시작 전에 항상 반환 false 됩니다.

앱이 업데이트를 위해 닫히기 직전에 클린 수행(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. 애플리케이션이 트랙을 프라이빗으로 설정하면 브라우저가 열리고 사용자를 인증하고 앱 내 업데이트를 사용하도록 설정합니다. 인증 정보가 공개 트랙으로 다시 전환하고 나중에 다시 프라이빗으로 전환할 때에도 유효한 상태로 유지되는 한 브라우저는 다시 열리지 않습니다. 브라우저 인증에 성공하면 사용자가 자동으로 애플리케이션으로 다시 리디렉션됩니다. 트랙이 공용(기본값)이면 다음 단계가 직접 수행됩니다.

    • iOS 9 및 10에서는 SFSafariViewController instance 앱 내에서 열리고 사용자를 인증합니다. 인증이 성공하면 자동으로 닫힙니다.
    • iOS 11에서 사용자 환경은 iOS 10과 비슷하지만 iOS 11은 사용자에게 로그인 정보에 액세스할 수 있는 권한을 요청합니다. 시스템 수준 대화 상자이며 사용자 지정할 수 없습니다. 사용자가 대화 상자를 취소하는 경우 테스트 중인 버전을 계속 사용할 수 있지만 앱 내 업데이트는 받지 않습니다. 다음에 앱을 시작할 때 로그인 정보에 다시 액세스하라는 메시지가 표시됩니다.
  5. 앱의 새 릴리스에는 다음과 같은 경우 사용자에게 애플리케이션을 업데이트하도록 요청하는 앱 내 업데이트 대화 상자가 표시됩니다.

    • iOS:

      • 또는 값이 CFBundleShortVersionString 더 높습니다.
      • 의 값은 CFBundleShortVersionString 같지만 값은 입니다 CFBundleVersion.
      • 버전은 동일하지만 빌드 고유 식별자는 다릅니다.
    • Android:

      • 또는 값이 versionCode 더 높습니다.
      • 의 값은 versionCode 같지만 의 값은 versionName다릅니다.

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

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

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

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

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

App Center 서비스에 애플리케이션 대리자의 메서드 자동 전달 사용 안 함

App Center는 스위즐링을 사용하여 애플리케이션 대리자의 메서드를 App Center 서비스에 자동으로 전달하여 SDK 통합을 개선합니다. 다른 타사 라이브러리 또는 애플리케이션 대리자 자체와 충돌할 가능성이 있습니다. 이 경우 아래 단계에 따라 모든 App Center 서비스에 대해 App Center 애플리케이션 대리자 전달을 사용하지 않도록 설정할 수 있습니다.

  1. 프로젝트의 Info.plist 파일을 엽니다.
  2. 키를 추가하고 AppCenterAppDelegateForwarderEnabled 값을 0로 설정합니다. 이렇게 하면 모든 App Center 서비스에 대한 애플리케이션 대리자 전달이 비활성화됩니다.
  3. 파일에 콜백을 추가 OpenUrl 합니다 AppDelegate.cs .
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
    Distribute.OpenUrl(url);
    return true;
}