다음을 통해 공유


애플리케이션 인덱싱 및 딥 링크 설정

Xamarin.Forms 애플리케이션 인덱싱 및 딥 링크 설정은 사용자가 애플리케이션을 탐색할 때 애플리케이션 인덱싱에 대한 메타데이터를 게시하기 위한 API를 제공합니다. 그런 다음, 스포트라이트 검색, Google 검색 또는 웹 검색에서 인덱싱된 콘텐츠를 검색할 수 있습니다. 딥 링크가 포함된 검색 결과를 누르면 애플리케이션에서 처리할 수 있는 이벤트가 발생하고 일반적으로 딥 링크에서 참조되는 페이지로 이동하는 데 사용됩니다.

이 샘플 애플리케이션은 다음 스크린샷과 같이 데이터가 로컬 SQLite 데이터베이스에 저장되는 Todo 목록 애플리케이션을 보여줍니다.

TodoList 애플리케이션

사용자가 만든 각 TodoItem 인스턴스는 인덱싱됩니다. 그런 다음, 플랫폼별 검색을 사용하여 애플리케이션에서 인덱싱된 데이터를 찾을 수 있습니다. 사용자 애플리케이션에 대한 검색 결과 항목을 누르면 애플리케이션이 시작되고 TodoItemPage가 탐색되고, 딥 링크에서 참조되는 TodoItem이 표시됩니다.

SQLite 데이터베이스 사용에 대한 자세한 내용은 Xamarin.Forms 로컬 데이터베이스를 참조하세요.

참고 항목

Xamarin.Forms 애플리케이션 인덱싱 및 딥 링크 기능은 iOS 및 Android 플랫폼에서만 사용할 수 있으며 각각 최소 iOS 9 및 API 23이 필요합니다.

설정

다음 섹션에서는 iOS 및 Android 플랫폼에서 이 기능을 사용하기 위한 추가 설치 지침을 제공합니다.

iOS

iOS 플랫폼에서 iOS 플랫폼 프로젝트가 Entitlements.plist 파일을 번들 서명에 대한 사용자 지정 자격 파일로 설정했는지 확인합니다.

iOS 유니버설 링크를 사용하려면:

  1. 앱에서 지원할 모든 도메인을 포함하여 applinks 키와 함께 앱에 연결된 도메인 자격을 추가합니다.
  2. 웹 사이트에 Apple 앱 사이트 연결 파일을 추가합니다.
  3. applinks 키를 Apple 앱 사이트 연결 파일에 추가합니다.

자세한 내용은 developer.apple.com에서 앱 및 웹 사이트가 콘텐츠에 링크되도록 허용을 참조하세요.

Android

Android 플랫폼에서 애플리케이션 인덱싱 및 딥 링크 기능을 사용하기 위해 충족해야 하는 몇 가지 필수 구성 요소가 있습니다.

  1. 애플리케이션은 Google Play에 게시되어야 합니다.
  2. 동반 웹 사이트는 Google 개발자 콘솔의 애플리케이션에 등록되어야 합니다. 애플리케이션이 웹 사이트와 연결되면 웹 사이트와 애플리케이션 모두에서 작동하는 URL을 인덱싱할 수 있습니다. 이는 검색 결과에 제공될 수 있습니다. 자세한 내용은 Google 웹 사이트의 Google의 검색에서 앱 인덱싱을 참조하세요.
  3. 애플리케이션이 응답할 수 있는 URL 데이터 구성 스키마의 유형을 알려주는 MainActivity 클래스의 HTTP URL 의도를 애플리케이션이 지원해야 합니다. 자세한 내용은 의도 필터 구성을 참조하세요.

이러한 필수 구성 요소가 충족되면 Android 플랫폼에서 Xamarin.Forms 애플리케이션 인덱싱 및 딥 링크를 사용하기 위해 다음 추가 설치가 필요합니다.

  1. Xamarin.Forms.AppLinks NuGet 패키지를 Android 애플리케이션 프로젝트에 설치합니다.
  2. MainActivity.cs 파일에 Xamarin.Forms.Platform.Android.AppLinks 네임스페이스를 사용하여 선언을 추가합니다.
  3. MainActivity.cs 파일에 Firebase 네임스페이스를 사용하여 선언을 추가합니다.
  4. 웹 브라우저에서 Firebase 콘솔을 통해 새 프로젝트를 만듭니다.
  5. Firebase 콘솔에서 Firebase를 Android 앱에 추가하고 필요한 데이터를 입력합니다.
  6. 결과 google-services.json 파일을 다운로드합니다.
  7. google-services.json 파일을 Android 프로젝트의 루트 디렉터리에 추가하고, 해당 빌드 작업GoogleServicesJson으로 설정합니다.
  8. MainActivity.OnCreate 재정의에서 Forms.Init(this, bundle) 아래에 다음 코드 줄을 추가합니다.
FirebaseApp.InitializeApp(this);
AndroidAppLinks.Init(this);

google-services.json이 프로젝트에 추가되고 (및 GoogleServicesJson* 빌드 작업이 설정) 빌드 프로세스에서 클라이언트 ID 및 API 키를 추출한 다음, 생성된 매니페스트 파일에 이러한 자격 증명을 추가합니다.

참고 항목

이 문서에서는 애플리케이션 링크와 딥 링크라는 용어를 같은 의미로 사용합니다. 그러나 Android에서는 이 두 용어가 다른 의미를 가집니다. Android에서 딥 링크는 사용자가 앱에서 특정 작업을 직접 입력할 수 있도록 하는 의도 필터입니다. 딥 링크를 클릭하면 사용자가 URL을 처리할 수 있는 여러 앱 중 하나를 선택할 수 있게 하는 사용 앱 선택 대화 상자를 열 수 있습니다. Android 앱 링크는 웹 사이트 URL을 기반으로 하는 딥 링크이며, 웹 사이트에 속하는 것으로 확인되었습니다. 애플리케이션이 설치되어 있는 경우 앱 링크를 클릭하면 사용 앱 선택 대화 상자 없이 열립니다.

자세한 내용은 Xamarin 블로그에서 Xamarin.Forms URL 탐색이 있는 딥 링크 콘텐츠를 참조하세요.

페이지 인덱싱

페이지를 인덱싱하고 Google 및 스포트라이트에 검색에 노출하는 프로세스는 다음과 같습니다.

  1. 사용자가 검색 결과에서 인덱싱된 콘텐츠를 선택할 때 페이지에 반환하는 딥 링크와 함께 페이지를 인덱싱하는 데 필요한 메타데이터가 포함된 AppLinkEntry를 만듭니다.
  2. 검색을 위해 인덱싱하려면 AppLinkEntry 인스턴스를 등록합니다.

다음 코드 예제는 AppLinkEntry 인스턴스를 만드는 방법을 보여줍니다.

AppLinkEntry GetAppLink(TodoItem item)
{
    var pageType = GetType().ToString();
    var pageLink = new AppLinkEntry
    {
        Title = item.Name,
        Description = item.Notes,
        AppLinkUri = new Uri($"http://{App.AppName}/{pageType}?id={item.ID}", UriKind.RelativeOrAbsolute),
        IsLinkActive = true,
        Thumbnail = ImageSource.FromFile("monkey.png")
    };

    pageLink.KeyValues.Add("contentType", "TodoItemPage");
    pageLink.KeyValues.Add("appName", App.AppName);
    pageLink.KeyValues.Add("companyName", "Xamarin");

    return pageLink;
}

AppLinkEntry 인스턴스에는 페이지를 인덱싱하고 딥 링크를 만드는 데 필요한 값이 있는 여러 속성이 포함되어 있습니다. Title, DescriptionThumbnail 속성이 검색 결과에 표시될 때 인덱싱된 콘텐츠를 식별하는 데 사용됩니다. IsLinkActive 속성이 true로 설정되어 인덱싱된 콘텐츠가 현재 보고 있음을 나타냅니다. AppLinkUri 속성은 현재 페이지로 반환하여 현재 TodoItem을 표시하는 데 필요한 정보를 포함하는 Uri입니다. 다음 예제에서는 샘플 애플리케이션에 대한 예제 Uri를 보여줍니다.

http://deeplinking/DeepLinking.TodoItemPage?id=2

Uri에는 deeplinking 앱을 시작하고, DeepLinking.TodoItemPage로 이동하여 ID가 2인 TodoItem을 표시하는 데 필요한 모든 정보가 들어 있습니다.

인덱싱할 콘텐츠 등록

AppLinkEntry 인스턴스가 생성되면 인덱싱이 검색 결과에 나타나도록 등록해야 합니다. 이 작업은 다음 코드 예제와 같이 RegisterLink 메서드를 사용하여 수행할 수 있습니다.

Application.Current.AppLinks.RegisterLink (appLink);

이렇게 하면 AppLinkEntry 인스턴스가 애플리케이션의 AppLinks 컬렉션에 추가됩니다.

참고 항목

RegisterLink 메서드를 사용하여 페이지에 대해 인덱싱된 콘텐츠를 업데이트할 수도 있습니다.

AppLinkEntry 인스턴스가 인덱싱을 위해 등록되면 검색 결과에 나타날 수 있습니다. 다음 스크린샷은 iOS 플랫폼의 검색 결과에 나타나는 인덱싱된 콘텐츠를 보여줍니다.

iOS의 검색 결과에서 인덱싱된 콘텐츠

인덱싱된 콘텐츠 등록 취소

DeregisterLink 메서드는 다음 코드 예제에 설명된 대로 검색 결과에서 인덱싱된 콘텐츠를 제거하는 데 사용됩니다.

Application.Current.AppLinks.DeregisterLink (appLink);

이렇게 하면 애플리케이션의 AppLinks 컬렉션에서 AppLinkEntry 인스턴스가 제거됩니다.

참고 항목

Android에서는 검색 결과에서 인덱싱된 콘텐츠를 제거할 수 없습니다.

인덱싱된 콘텐츠가 검색 결과에 나타나고 사용자가 선택한 경우 애플리케이션의 App 클래스는 인덱싱된 콘텐츠에 포함된 Uri를 처리하라는 요청을 받습니다. 이 요청은 다음 코드 예제에 설명된 대로 OnAppLinkRequestReceived 재정의에서 처리할 수 있습니다.

public class App : Application
{
    ...
    protected override async void OnAppLinkRequestReceived(Uri uri)
    {
        string appDomain = "http://" + App.AppName.ToLowerInvariant() + "/";
        if (!uri.ToString().ToLowerInvariant().StartsWith(appDomain, StringComparison.Ordinal))
            return;

        string pageUrl = uri.ToString().Replace(appDomain, string.Empty).Trim();
        var parts = pageUrl.Split('?');
        string page = parts[0];
        string pageParameter = parts[1].Replace("id=", string.Empty);

        var formsPage = Activator.CreateInstance(Type.GetType(page));
        var todoItemPage = formsPage as TodoItemPage;
        if (todoItemPage != null)
        {
            var todoItem = await App.Database.GetItemAsync(int.Parse(pageParameter));
            todoItemPage.BindingContext = todoItem;
            await MainPage.Navigation.PushAsync(formsPage as Page);
        }
        base.OnAppLinkRequestReceived(uri);
    }
}

OnAppLinkRequestReceived 메서드는 Uri를 탐색할 페이지로 구문 분석하고 매개 변수를 페이지에 전달하기 전에 수신된 Uri가 애플리케이션용인지를 확인합니다. 탐색할 페이지의 인스턴스가 생성되고 페이지 매개 변수로 표시되는 TodoItem이 검색됩니다. 탐색할 페이지의 BindingContextTodoItem으로 설정됩니다. 이렇게 하면 TodoItemPagePushAsync 메서드로 표시될 때 딥 링크에 ID가 포함된 TodoItem가 표시됩니다.

검색 인덱싱에 사용할 수 있는 콘텐츠 만들기

딥 링크로 나타나는 페이지가 표시될 때마다 AppLinkEntry.IsLinkActive 속성을 true로 설정할 수 있습니다. 이로 인해 iOS 및 Android에서는 AppLinkEntry 인스턴스가 검색 인덱싱에 사용 가능하며 iOS에서만 AppLinkEntry 인스턴스를 핸드오프에 사용할 수 있게 됩니다. 핸드오프에 대한 자세한 내용은 핸드오프 소개를 참조하세요.

다음 코드 예제는 Page.OnAppearing 재정의에서 AppLinkEntry.IsLinkActive 속성을 true로 설정하는 방법을 보여줍니다.

protected override void OnAppearing()
{
    appLink = GetAppLink(BindingContext as TodoItem);
    if (appLink != null)
    {
        appLink.IsLinkActive = true;
    }
}

마찬가지로 딥 링크로 표시된 페이지를 탐색할 때 AppLinkEntry.IsLinkActive 속성을 false로 설정할 수 있습니다. 이렇게 하면 iOS 및 Android에서 검색 인덱싱용으로 알려진 AppLinkEntry 인스턴스가 중지되고 iOS에서만 핸드오프용으로 알려진 AppLinkEntry 인스턴스도 중지됩니다. 이 작업은 다음 코드 예제에 설명된 대로 Page.OnDisappearing 재정의에서 수행할 수 있습니다.

protected override void OnDisappearing()
{
    if (appLink != null)
    {
        appLink.IsLinkActive = false;
    }
}

핸드오프에 데이터 제공

iOS에서는 페이지를 인덱싱할 때 애플리케이션별 데이터를 저장할 수 있습니다. 이는 핸드오프에 사용되는 키-값 쌍을 저장하기 위한 Dictionary<string, string>KeyValues 컬렉션에 데이터를 추가하여 수행됩니다. 핸드오프는 사용자가 해당 디바이스 중 하나에서 작업을 시작하고 해당 디바이스의 다른 작업(사용자의 iCloud 계정으로 식별됨)을 계속하기 위한 방법입니다. 다음 코드는 애플리케이션별 키-값 쌍을 저장하는 예를 보여줍니다.

var pageLink = new AppLinkEntry
{
    ...
};
pageLink.KeyValues.Add("appName", App.AppName);
pageLink.KeyValues.Add("companyName", "Xamarin");

KeyValues 컬렉션에 저장된 값은 인덱싱된 페이지의 메타데이터에 저장되고, 사용자가 딥 링크를 포함하는 검색 결과(또는 다른 로그인 디바이스의 콘텐츠를 보는 데 핸드오프를 사용하는 경우)를 누르면 복원됩니다.

또한 다음 키에 대한 값을 지정할 수 있습니다.

  • contentType – 인덱싱된 콘텐츠의 균일한 유형 식별자를 지정하는 string입니다. 이 값에 대해 사용하도록 권장되는 규칙은 인덱싱된 콘텐츠를 포함하는 페이지의 형식 이름입니다.
  • associatedWebPage – 인덱싱된 콘텐츠도 웹에서 볼 수 있거나 애플리케이션이 Safari의 딥 링크를 지원하는 경우 방문할 웹 페이지를 나타내는 string입니다.
  • shouldAddToPublicIndex - true 또는 false 중 하나인 string은 인덱싱된 콘텐츠를 Apple의 퍼블릭 클라우드 인덱스에 추가할지 여부를 제어하며, 해당 iOS 디바이스에 애플리케이션을 설치하지 않은 사용자에게 제공할 수 있습니다. 그러나 콘텐츠가 공개 인덱스에 대해 설정되어 있어도 Apple의 퍼블릭 클라우드 인덱스에 자동으로 추가되지는 않습니다. 자세한 내용은 공용 검색 인덱싱을 참조하세요. 개인 데이터를 KeyValues 컬렉션에 추가할 때 이 키를 false로 설정해야 합니다.

참고 항목

KeyValues 컬렉션은 Android 플랫폼에서 사용되지 않습니다.

핸드오프에 대한 자세한 내용은 핸드오프 소개를 참조하세요.