Индексирование приложения и создание прямых ссылок

Download Sample Скачайте пример

Функции индексирования приложения и создания прямых ссылок Xamarin.Forms предоставляют API для публикации метаданных для индексирования приложения при навигации пользователей по приложениям. Затем индексированное содержимое становится доступным для поиска в поиске Spotlight, Google или поиске в Интернете. При касании результата поиска, который содержит прямую ссылку, будет активировано событие, обрабатываемое приложением. Оно, как правило, используется для перехода на страницу, на которую ссылается прямая ссылка.

В этом примере представлено приложение списка задач, где данные сохраняются в локальной базе данных SQLite, как показано на следующих снимках экрана:

TodoList Application

Каждый экземпляр 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-адреса HTTP в классе MainActivity, который уведомляет компонент индексирования приложения о типах схем данных URL-адресов, на которые может отвечать приложение. Дополнительные сведения см. в разделе Настройка фильтра намерений.

После выполнения этих условий необходимо выполнить следующую дополнительную настройку для использования индексирования приложения и создания прямых ссылок Xamarin.Forms в платформе Android:

  1. Установите пакет NuGet Xamarin.Forms.AppLinks в проект приложения 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\*) процесс сборки извлекает ключ API и идентификатор клиента, а затем добавляет эти учетные данные в созданный файл манифеста.

Примечание.

В этой статье термины "ссылки на приложения" и "прямые ссылки" часто взаимозаменяемы. Но в Android значения этих терминов разные. В Android прямая ссылка — это фильтр намерений, который позволяет пользователям непосредственно переходить к определенному действию в приложении. Щелкнув прямую ссылку, можно открыть диалоговое окно для устранения неоднозначности. В таком окне пользователь может выбрать одно из нескольких приложений, которые могут работать с этим URL-адресом. Ссылка на приложение Android — это прямая ссылка на основе URL-адреса, проверенного на предмет на принадлежности вашему веб-сайту. Если щелкнуть ссылку на приложение, откроется ваше приложение (при условии, что оно установлено). Диалоговое окно для устранения неоднозначности отображаться не будет.

Дополнительные сведения см. в статье, посвященной созданию прямых ссылок на содержимое с помощью навигации по URL-адресам Xamarin.Forms, в блоге Xamarin.

Индексации страницы

Процесс индексации страницы и предоставления ее системам поиска Google и Spotlight выглядит следующим образом:

  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, Description и Thumbnail используются для идентификации индексированного содержимого, когда оно отображается в результатах поиска. Свойству IsLinkActive присваивается значение true, указывающее, что индексированное содержимое сейчас просматривается. Свойство AppLinkUri является Uri, содержащим сведения, необходимые для возврата к текущей странице и отображения текущего элемента TodoItem. В следующем примере показан пример Uri для примера приложения:

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

Этот Uri содержит все сведения, необходимые для запуска приложения deeplinking, перехода к DeepLinking.TodoItemPage и отображения элемента TodoItem с ID, равным 2.

Регистрация содержимого для индексирования

После создания экземпляра AppLinkEntry для отображения в результатах поиска его необходимо зарегистрировать для индексирования. Это осуществляется с помощью метода RegisterLink, как показано в следующем примере кода:

Application.Current.AppLinks.RegisterLink (appLink);

При этом экземпляр AppLinkEntry добавляется в коллекцию AppLinks приложения.

Примечание.

Метод RegisterLink может также использоваться для обновления содержимого, которое индексируется для страницы.

После регистрации экземпляра AppLinkEntry для индексирования он может отображаться в результатах поиска. На следующем снимке экрана показано индексированное содержимое, отображаемое в результатах поиска на платформе iOS:

Indexed Content in Search Results on iOS

Отмена регистрации индексированного содержимого

Метод DeregisterLink используется для удаления индексированного содержимого из результатов поиска, как показано в следующем примере кода:

Application.Current.AppLinks.DeregisterLink (appLink);

При этом экземпляр AppLinkEntry удаляется из коллекции AppLinks приложения.

Примечание.

В 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, представленный параметром страницы. Затем для BindingContext страницы, на которую будет выполнен переход, задается значение TodoItem. Это гарантирует, что при отображении TodoItemPage методом PushAsync он будет отображать TodoItem, ID которого содержится в прямой ссылке.

Предоставление доступа к содержимому для индексирования поиска

При каждом отображении страницы, представленной прямой ссылкой, для свойства AppLinkEntry.IsLinkActive может задаваться значение true. В iOS и Android это делает экземпляр AppLinkEntry доступным для индексирования поиска, и только в iOS экземпляр AppLinkEntry также становится доступным для функции Handoff. Дополнительные сведения о функции Handoff см. в этой статье.

В следующем примере кода демонстрируется задание для свойства AppLinkEntry.IsLinkActive значения true в переопределении Page.OnAppearing:

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

Аналогичным образом, при каждом переходе со страницы, представленной прямой ссылкой, для свойства AppLinkEntry.IsLinkActive может задаваться значение false. В iOS и Android это прекращает объявление экземпляра AppLinkEntry для индексирования поиска, и только в iOS — объявление экземпляра AppLinkEntry для функции Handoff. Это поведение может осуществляться переопределением Page.OnDisappearing, как показано в следующем примере кода:

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

Предоставление данных в функцию Handoff

В iOS относящиеся к приложению данные могут сохраняться при индексировании страницы. Это достигается путем добавления данных в коллекцию KeyValues, являющуюся Dictionary<string, string> для хранения пар "ключ-значение", которые используются функцией Handoff. Функция Handoff позволяет пользователю начать действие на одном из своих устройств и продолжить его на других устройствах (это зависит от учетной записи iCloud). Ниже приведен пример кода для сохранения пар "ключ-значение", определяемых приложением:

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

Значения, хранящиеся в коллекции KeyValues, будут сохраняться в метаданных для индексированной страницы и восстанавливаться, когда пользователь коснется результата поиска, содержащего прямую ссылку (или при использовании функции Handoff для просмотра содержимого на другом устройстве, где пользователь выполнил вход).

Кроме того, можно указать значения для следующих ключей:

  • contentType — тип string, задающий идентификатор универсального типа для индексированного содержимого. Рекомендуемым соглашением для этого значения является имя типа страницы, содержащей индексированное содержимое.
  • associatedWebPage — тип string, представляющий веб-страницу для посещения, если индексированное содержимое также можно просмотреть в Интернете или если приложение поддерживает прямые ссылки Safari.
  • shouldAddToPublicIndex — тип string со значением true или false, который определяет, следует ли добавлять индексированное содержимое в индекс общедоступного облака Apple, которое затем будет представлено пользователям, еще не установившим приложение на своем устройстве iOS. Учтите, что задание содержимого для общедоступного индексирования не означает, что оно будет автоматически добавляться в индекс общедоступного облака Apple. Дополнительные сведения см. в статье, посвященной общедоступному индексированию поиска. Обратите внимание, что для этого ключа следует задать значение false при добавлении персональных данных в коллекцию KeyValues.

Примечание.

Коллекция KeyValues не используется для платформы Android.

Дополнительные сведения о функции Handoff см. в этой статье.