Android 앱 링크

웹 사이트의 링크가 모바일 앱을 시작하고 모바일 앱에 콘텐츠를 표시하도록 웹 사이트와 모바일 앱을 연결하는 것이 바람직한 경우가 많습니다. 딥 링크라고도 하는 앱 연결은 모바일 디바이스가 URI에 응답하고 URI로 표현되는 모바일 앱에서 콘텐츠를 시작할 수 있도록 하는 기술입니다.

Android는 의도 시스템을 통해 앱 링크를 처리합니다. 모바일 브라우저에서 링크를 탭하면 브라우저에서 Android가 등록된 앱에 위임할 의도를 디스패치합니다. 이러한 링크는 사용자 지정 스키마(예: myappname://사용자 지정 체계)를 기반으로 하거나 HTTP 또는 HTTPS 스키마를 사용할 수 있습니다. 예를 들어 레시피 웹 사이트에서 링크를 클릭하면 해당 웹 사이트와 연결된 모바일 앱이 열리고 사용자에게 특정 레시피가 표시됩니다. 의도를 처리하기 위해 등록된 앱이 두 개 이상 있는 경우 Android는 사용자에게 의도를 처리할 앱을 선택하도록 요청하는 명확성 대화 상자를 표시합니다. 앱이 설치되지 않은 사용자는 웹 사이트의 콘텐츠로 이동합니다.

Android는 앱 링크를 세 가지 범주로 분류합니다.

  • 딥 링크 는 사용자를 앱의 특정 콘텐츠로 데려가는 모든 체계의 URI입니다. 딥 링크를 클릭하면 사용자에게 딥 링크를 처리할 앱을 선택하라는 명확한 대화 상자가 나타날 수 있습니다.
  • 웹 링크 는 HTTP 또는 HTTPS 체계를 사용하는 딥 링크입니다. Android 12 이상에서는 웹 링크가 항상 웹 브라우저에 콘텐츠를 표시합니다. 이전 버전의 Android에서 앱이 웹 링크를 처리할 수 있는 경우 사용자에게 웹 링크를 처리할 앱을 선택하도록 요청하는 명확성 대화 상자가 나타납니다.
  • API 23 이상에서 사용할 수 있는 Android 앱 링크는 HTTP 또는 HTTPS 체계를 사용하고 특성을 포함하는 autoVerify 웹 링크입니다. 이 특성을 사용하면 앱이 앱 링크의 기본 처리기가 될 수 있습니다. 따라서 앱 링크를 클릭하면 명확한 대화 상자를 표시하지 않고 앱이 열립니다.

.NET MAUI Android 앱은 세 가지 범주의 앱 링크를 모두 지원할 수 있습니다. 그러나 이 문서에서는 Android 앱 링크에 중점을 둡니다. 이렇게 하려면 할 일기본 소유권을 증명하고 앱과의 관계를 설명하는 do기본에서 디지털 자산 링크 파일 JSON 파일을 호스팅해야 합니다. 이를 통해 Android는 URI를 처리하려는 앱에 URI의 소유권이 있는지 확인할 수 있습니다기본 악의적인 앱이 앱 링크를 가로채는 것을 방지할 수 있습니다.

.NET MAUI Android 앱에서 Android 앱 링크를 처리하는 프로세스는 다음과 같습니다.

  1. do기본 소유권을 확인합니다. 자세한 내용은 do기본 소유권 확인을 참조하세요.
  2. 웹 사이트에서 디지털 자산 링크 파일을 만들고 호스트합니다. 자세한 내용은 디지털 자산 링크 파일 만들기 및 호스트를 참조 하세요.
  3. 웹 사이트 URI에 대한 앱에서 의도 필터를 구성합니다. 자세한 내용은 의도 필터 구성을 참조하세요.
  4. 들어오는 의도에서 데이터를 읽습니다. 자세한 내용은 들어오는 의도에서 데이터 읽기를 참조 하세요.

Important

Android 앱 링크를 사용하려면 다음을 수행합니다.

  • 앱 버전은 Google Play에서 라이브 상태여야 합니다.
  • 도우미 웹 사이트는 Google 개발자 콘솔에서 앱에 등록해야 합니다. 앱이 웹 사이트와 연결되면 웹 사이트와 앱 모두에서 작동하는 URI를 인덱싱할 수 있으며 검색 결과에서 제공될 수 있습니다. 자세한 내용은 support.google.com Google Search 의 앱 인덱싱을 참조하세요.

Android 앱 링크에 대한 자세한 내용은 Android 앱 링크 처리를 참조 하세요.

도메인 소유권 확인

Google Search 콘솔에서 앱 링크를 제공하는 기본 할 일의 소유권을 확인해야 합니다. 소유권 확인은 특정 웹 사이트를 소유하고 있음을 증명하는 것을 의미합니다. Google Search 콘솔은 여러 인증 방법을 지원합니다. 자세한 내용은 support.google.com 사이트 소유권 확인을 참조하세요.

Android 앱 링크를 사용하려면 앱을 URI의 기본 처리기로 설정하기 전에 Android에서 앱과 웹 사이트 간의 연결을 확인해야 합니다. 이 확인은 앱이 처음 설치될 때 발생합니다. 디지털 자산 링크 파일은 다음 위치에서 https://domain.name/.well-known/assetlinks.json기본 관련 웹에서 호스팅해야 하는 JSON 파일입니다.

디지털 자산 파일에는 Android에서 연결을 확인하는 데 필요한 메타데이터가 포함되어 있습니다. 파일에는 다음 키-값 쌍이 필요합니다.

  • namespace - Android 앱의 네임스페이스입니다.
  • package_name - Android 앱의 패키지 이름입니다.
  • sha256_cert_fingerprints - 파일에서 .keystore 가져온 서명된 앱의 SHA256 지문입니다. 키 저장소의 서명을 찾는 방법에 대한 자세한 내용은 키 저장소의 서명 찾기를 참조하세요.

다음 예제 assetlinks.json 파일은 Android 앱에 com.companyname.myrecipeapp 링크 열기 권한을 부여합니다.

[
   {
      "relation": [
         "delegate_permission/common.handle_all_urls"
      ],
      "target": {
         "namespace": "android_app",
         "package_name": "com.companyname.myrecipeapp",
         "sha256_cert_fingerprints": [
            "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
         ]
      }
   }
]

여러 SHA256 지문을 등록하여 앱의 다른 버전 또는 빌드를 지원할 수 있습니다. 다음 assetlinks.json 파일은 링크 열기 권한을 Android 앱과 com.companyname.mycookingapp 모두에 com.companyname.myrecipeapp 부여합니다.

[
   {
      "relation": [
         "delegate_permission/common.handle_all_urls"
      ],
      "target": {
         "namespace": "android_app",
         "package_name": "com.companyname.myrecipeapp",
         "sha256_cert_fingerprints": [
            "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
         ]
      }
   },
   {
      "relation": [
         "delegate_permission/common.handle_all_urls"
      ],
      "target": {
         "namespace": "android_app",
         "package_name": "com.companyname.mycookingapp",
         "sha256_cert_fingerprints": [
            "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
         ]
      }
   }
]

문 목록 생성기 및 테스터 도구를 사용하여 올바른 JSON을 생성하고 유효성을 검사합니다.

JSON 확인 파일을 게시할 https://domain.name/.well-known/assetlinks.json때 다음을 확인해야 합니다.

  • 파일은 content-type application/json과 함께 제공됩니다.
  • 앱에서 HTTPS를 스키마로 사용하는지 여부에 관계없이 HTTPS를 통해 파일에 액세스할 수 있어야 합니다.
  • 리디렉션 없이 파일에 액세스할 수 있어야 합니다.
  • 앱 링크에서 여러 작업을 지원하는 경우 기본 각각에 assetlinks.json 파일을 게시해야 합니다기본.

Google의 디지털 자산 링크 API를 사용하여 디지털 자산 파일의 형식이 올바르게 지정되고 호스트되어 있는지 확인할 수 있습니다.

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=
  https://<WEB SITE ADDRESS>:&relation=delegate_permission/common.handle_all_urls

자세한 내용은 developer.android.com 웹 사이트 연결 선언을 참조하세요.

의도 필터 구성

웹 사이트에서 Android 앱의 활동에 URI 또는 URI 집합을 매핑하는 의도 필터를 구성해야 합니다. .NET MAUI에서 이 작업은 활동에 추가하여 IntentFilterAttribute 수행할 수 있습니다. 의도 필터는 다음 정보를 선언해야 합니다.

  • ActionView - 정보 보기 요청에 응답하기 위해 의도 필터를 등록합니다.
  • Categories - 의도 필터는 둘 다 CategoryDefault 등록해야 하며 CategoryBrowsable 웹 URI를 올바르게 처리할 수 있어야 합니다.
  • DataScheme - 의도 필터는 사용자 지정 스키마 및/또는 HTTPS 및/또는 HTTPS를 선언해야 합니다.
  • DataHost- URI가 시작되는 기본.
  • DataPathPrefix - 웹 사이트의 리소스에 대한 선택적 경로입니다. 이 경로는 .로 시작해야 /합니다.
  • AutoVerify - 앱과 웹 사이트 간의 관계를 확인하도록 Android에 지시합니다. true 그렇지 않으면 Android에서 앱과 웹 사이트 간의 연결을 확인하지 않으므로 앱을 URI의 기본 처리기로 설정하지 않습니다.

다음 예제에서는 다음에서 https://www.recipe-app.com/recipes링크를 처리하는 데 사용하는 IntentFilterAttribute 방법을 보여줍니다.

using Android.App;
using Android.Content;
using Android.Content.PM;

namespace MyNamespace;

[Activity(
    Theme = "@style/Maui.SplashTheme",
    MainLauncher = true,
    ConfigurationChanges = ConfigChanges.ScreenSize |
        ConfigChanges.Orientation |
        ConfigChanges.UiMode |
        ConfigChanges.ScreenLayout |
        ConfigChanges.SmallestScreenSize |
        ConfigChanges.KeyboardHidden |
        ConfigChanges.Density)]
[IntentFilter(
    new string[] { Intent.ActionView },
    Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
    DataScheme = "https",
    DataHost = "recipe-app.com",
    DataPath = "/recipe",
    AutoVerify = true,)]    
public class MainActivity : MauiAppCompatActivity
{
}

참고 항목

의도 필터에서 여러 체계 및 호스트를 지정할 수 있습니다. 자세한 내용은 developer.android.com 앱 콘텐츠 에 대한 딥 링크 만들기를 참조하세요.

Android는 앱을 URI의 기본 처리기로 등록하기 전에 웹 사이트의 디지털 자산 파일에 대한 의도 필터에서 식별된 모든 호스트를 확인합니다. Android에서 앱을 기본 처리기로 설정하려면 먼저 모든 의도 필터가 확인 과정을 통과해야 합니다. 활동 콘텐츠에 대한 URI를 사용하여 의도 필터를 추가하면 Android는 런타임에 일치하는 URI가 있는 모든 의도를 앱에 라우팅할 수 있습니다.

다른 앱에서 활동을 시작할 수 있도록 활동을 내보낼 수 있는 것으로 표시해야 할 수도 있습니다. 기존ActivityAttribute에 추가하여 Exported = true 이 작업을 수행할 수 있습니다. 자세한 내용은 developer.android.com Activity 요소를 참조하세요.

웹 URI 의도가 호출되면 Android는 요청이 성공할 때까지 다음 작업을 시도합니다.

  1. URI를 처리하는 기본 설정 앱을 엽니다.
  2. URI를 처리할 수 있는 유일한 앱을 엽니다.
  3. 사용자가 URI를 처리할 앱을 선택할 수 있습니다.

의도 및 의도 필터 에 대한 자세한 내용은 developer.android.com 의도 및 의도 필터를 참조하세요.

들어오는 의도에서 데이터를 읽습니다.

Android가 의도 필터를 통해 활동을 시작하면 의도에서 제공하는 데이터를 사용하여 수행할 작업을 결정할 수 있습니다. 이 작업은 초기 수명 주기 대리자에서 수행되어야 하며, 이상적으로는 수행되어야 합니다 OnCreate. 대리자는 OnCreate 활동을 만들 때 호출됩니다. 수명 주기 대리자에 대한 자세한 내용은 플랫폼 수명 주기 이벤트를 참조 하세요.

호출되는 Android 수명 주기 대리자에게 응답하려면 클래스의 메서드에서 MauiAppBuilder 개체의 메서드를 CreateMauiapp 호출 ConfigureLifecycleEvents 합니다MauiProgram. 그런 다음 개체에서 ILifecycleBuilder 메서드를 AddAndroid 호출하고 필요한 대리자의 처리기를 등록하는 메서드를 지정 Action 합니다.

using Microsoft.Maui.LifecycleEvents;
using Microsoft.Extensions.Logging;

namespace MyNamespace;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            })
            .ConfigureLifecycleEvents(lifecycle =>
            {
#if ANDROID
                lifecycle.AddAndroid(android =>
                {
                    android.OnCreate((activity, bundle) =>
                    {
                        var action = activity.Intent?.Action;
                        var data = activity.Intent?.Data?.ToString();

                        if (action == Android.Content.Intent.ActionView && data is not null)
                        {
                            activity.Finish();
                            Task.Run(() => HandleAppLink(data));
                        }
                    });
                });
#endif
            });

#if DEBUG
        builder.Logging.AddDebug();
#endif

        return builder.Build();
    }

    static void HandleAppLink(string url)
    {
        if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out var uri))
            App.Current?.SendOnAppLinkRequestReceived(uri);
    }
}

속성은 Intent.Action 들어오는 의도와 연결된 작업을 검색하고 속성은 Intent.Data 들어오는 의도와 연결된 데이터를 검색합니다. 의도 동작이 설정된 경우 메서드를 ActionView사용하여 의도 데이터를 클래스 SendOnAppLinkRequestReceivedApp 전달할 수 있습니다.

Warning

앱 링크는 앱에 잠재적인 공격 벡터를 제공하므로 모든 URI 매개 변수의 유효성을 검사하고 잘못된 형식의 URI를 카드 합니다.

App 클래스에서 의도 데이터를 수신하고 처리하도록 메서드를 재정 OnAppLinkRequestReceived 의합니다.

namespace MyNamespace;

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        MainPage = new AppShell();
    }

    protected override async void OnAppLinkRequestReceived(Uri uri)
    {
        base.OnAppLinkRequestReceived(uri);

        // Show an alert to test that the app link was received.
        await Dispatcher.DispatchAsync(async () =>
        {
            await Windows[0].Page!.DisplayAlert("App link received", uri.ToString(), "OK");
        });

        Console.WriteLine("App link: " + uri.ToString());
    }
}

위의 예제에서 재정의는 OnAppLinkRequestReceived 앱 링크 URI를 표시합니다. 실제로 앱 링크는 프롬프트, 로그인 또는 기타 중단 없이 URI가 나타내는 콘텐츠로 사용자를 직접 가져와야 합니다. 따라서 재정의 OnAppLinkRequestReceived 는 URI가 나타내는 콘텐츠에 대한 탐색을 호출할 위치입니다.

디지털 자산 파일이 올바르게 호스트되는 경우 활동 관리자 도구am와 함께 Android 디버그 브리지adb를 사용하여 앱 링크가 올바르게 작동하는지 확인하기 위해 URI 열기를 시뮬레이션할 수 있습니다. 예를 들어 다음 명령은 URI와 연결된 대상 앱 활동을 보려고 시도합니다.

adb shell am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d YOUR_URI_HERE

이 명령은 Android가 모바일 앱으로 이동해야 하는 의도를 디스패치합니다. 이 의도는 URI에 등록된 활동을 시작하고 표시해야 합니다.

참고 항목

에뮬레이터 또는 디바이스에 대해 실행할 adb 수 있습니다.

또한 디바이스에 설치된 앱에 대한 기존 링크 처리 정책을 표시할 수 있습니다.

adb shell dumpsys package domain-preferred-apps

이 명령은 다음 정보를 표시합니다.

  • 패키지 - 앱의 패키지 이름입니다.
  • Do기본 - 웹 링크가 앱에서 처리되는 공백으로 구분된 do기본s입니다.
  • 상태 - 앱에 대한 현재 링크 처리 상태. 값 always 은 앱이 시스템 확인을 설정 AutoVerify 하여 통과했음을 true 의미합니다. 그 다음에는 기본 설정의 레코드를 나타내는 16진수입니다.

명령에 대한 자세한 내용은 Android 디버그 브리지를 adb 참조 하세요.

또한 Play 콘솔을 통해 Android 앱 링크를 관리하고 확인할 수 있습니다. 자세한 내용은 developer.android.com Android 앱 링크 관리 및 확인을 참조하세요.

문제 해결 조언은 developer.android.com 일반적인 구현 오류 수정을 참조하세요.