Индексирование приложения и создание прямых ссылок
Функции индексирования приложения и создания прямых ссылок Xamarin.Forms предоставляют API для публикации метаданных для индексирования приложения при навигации пользователей по приложениям. Затем индексированное содержимое становится доступным для поиска в поиске Spotlight, Google или поиске в Интернете. При касании результата поиска, который содержит прямую ссылку, будет активировано событие, обрабатываемое приложением. Оно, как правило, используется для перехода на страницу, на которую ссылается прямая ссылка.
В этом примере представлено приложение списка задач, где данные сохраняются в локальной базе данных SQLite, как показано на следующих снимках экрана:
Каждый экземпляр TodoItem
, созданный пользователем, индексируется. Механизм поиска, определяемый платформой, может использоваться для поиска индексированных данных из приложения. Когда пользователь выбирает элемент в результатах поиска для приложения, приложение запускается, осуществляется переход к TodoItemPage
и отображается элемент TodoItem
, на который ссылается прямая ссылка.
Дополнительные сведения об использовании базы данных SQLite см. в разделе, посвященном локальным базам данных Xamarin.Forms.
Примечание.
Функции индексирования приложения и создания прямых ссылок Xamarin.Forms доступны только на платформах iOS и Android и требуют как минимум версии iOS 9 и API 23 соответственно.
Настройка
Следующие разделы содержат дополнительные инструкции по настройке для использования этой функции в платформах iOS и Android.
iOS
Для платформы iOS убедитесь, что проект платформы iOS указывает файл Entitlements.plist как пользовательский файл прав для подписания пакета.
Использование универсальных ссылок iOS
- С помощью ключа
applinks
добавьте в приложение право "Связанные домены", включающее все домены, которые будут поддерживаться вашим приложением. - Добавьте файл связывания с сайтом приложения Apple на свой веб-сайт.
- Добавьте ключ
applinks
в файл связывания с сайтом приложения Apple.
Дополнительные сведения см. в статье о разрешении ссылок на содержимое от приложений и веб-сайтов на сайте developer.apple.com.
Android
Для платформы Android существует ряд необходимых условий, которые должны быть выполнены для использования индексирования приложения и создания прямых ссылок.
- Версия вашего приложения должна быть актуальна в Google Play.
- Дополнительный веб-сайт должен быть зарегистрирован для приложения в консоли разработчика Google. После связывания приложения с веб-сайтом можно выполнить индексирование URL-адресов для веб-сайта и приложения, которые затем могут обрабатываться в результатах поиска. Дополнительные сведения см. в разделе, посвященном индексированию приложений для поиска Google, на веб-сайте Google.
- Приложение должно поддерживать намерения URL-адреса HTTP в классе
MainActivity
, который уведомляет компонент индексирования приложения о типах схем данных URL-адресов, на которые может отвечать приложение. Дополнительные сведения см. в разделе Настройка фильтра намерений.
После выполнения этих условий необходимо выполнить следующую дополнительную настройку для использования индексирования приложения и создания прямых ссылок Xamarin.Forms в платформе Android:
- Установите пакет NuGet Xamarin.Forms.AppLinks в проект приложения Android.
- В файле MainActivity.cs добавьте объявление для использования пространства имен
Xamarin.Forms.Platform.Android.AppLinks
. - В файле MainActivity.cs добавьте объявление для использования пространства имен
Firebase
. - В веб-браузере создайте новый проект с помощью консоли Firebase.
- В консоли Firebase добавьте Firebase в приложение Android и введите необходимые данные.
- Скачайте итоговый файл google-services.json.
- Добавьте файл google-services.json в корневой каталог проекта Android и задайте для параметра Действие при сборке значение GoogleServicesJson.
- В переопределении
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 выглядит следующим образом:
- Создайте
AppLinkEntry
, содержащий метаданные, необходимые для индексирования страницы, а также прямую ссылку для возврата на страницу при выборе пользователем индексированного содержимого в результатах поиска. - Зарегистрируйте экземпляр
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:
Отмена регистрации индексированного содержимого
Метод 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 см. в этой статье.