упреждающие предложения watchOS в Xamarin
В этой статье показано, как использовать упреждающие предложения в приложении watchOS 3 для управления взаимодействием, позволяя системе заранее предоставлять полезные сведения пользователю автоматически.
Новые возможности для просмотраOS 3, упреждающие предложения представляют новости для пользователей, чтобы взаимодействовать с приложением Xamarin.iOS, заранее предоставляя полезные сведения автоматически пользователю в соответствующее время.
О упреждающих предложениях
Новое для просмотраOS 3 содержит MapItem
свойство, NSUserActivity
которое позволяет приложению предоставлять сведения о расположении, которые можно использовать в других контекстах. Например, если приложение отображало отзывы о отелях и предоставляет MapItem
расположение, если пользователь перешел в приложение Карты, то расположение отеля, которое они просто просматривали, будет доступно.
Приложение предоставляет эту функцию системе с помощью коллекции таких технологий, как NSUserActivity
MapKit, Медиаплеер и UIKit. Кроме того, предоставляя поддержку упреждающего предложения для приложения, она получает более глубокую интеграцию Siri бесплатно.
Предложения на основе расположения
Новый для просмотраOS 3 NSUserActivity
класс включает MapItem
свойство, которое позволяет разработчику предоставлять сведения о расположении, которые можно использовать в других контекстах. Например, если приложение отображает отзывы о ресторанах, разработчик может задать MapItem
для свойства расположение ресторана, которое пользователь просматривает в приложении. Если пользователь переключается на приложение Карты, расположение ресторана будет автоматически доступно.
Если приложение поддерживает поиск приложений, оно может использовать новые компоненты CSSearchableItemAttributesSet
адреса класса, чтобы указать расположения, которые пользователь может посетить. Задав MapItem
свойство, другие свойства автоматически заполняются.
В дополнение к настройке Latitude
свойств Longitude
компонента адреса рекомендуется указать NamedLocation
и PhoneNumbers
свойства приложения, поэтому Siri может инициировать вызов к расположению.
Контекстные напоминания Siri
Позволяет пользователю использовать Siri, чтобы быстро сделать напоминание, чтобы просмотреть содержимое, которое они в настоящее время просматривают в приложении на более позднюю дату. Например, если они просматривали обзор ресторана в приложении, они могли вызвать Siri и сказать : "Напомнить мне об этом, когда я получаю домой". Siri создаст напоминание со ссылкой на проверку в приложении.
Реализация упреждающих предложений
Добавление поддержки упреждающих предложений в приложение Xamarin.iOS обычно так же просто, как реализация нескольких API или расширение нескольких API, которые приложение может уже реализовать.
Упреждающие предложения работают с приложениями тремя основными способами:
NSUserActivity
— Помогает системе понять, с какими сведениями в настоящее время работает пользователь на экране.- Предложения по расположению. Если приложение предлагает или использует сведения о расположении, эти расширения API предлагают новые способы предоставления общего доступа к этой информации в приложениях.
И поддерживается в приложении, реализуя следующее:
- Контекстные напоминания Siri . В iOS 10 был расширен,
NSUserActivity
чтобы Siri быстро сделать напоминание о просмотре содержимого, которое они в настоящее время просматриваются в приложении на более позднюю дату. - Предложения по расположению — iOS 10 улучшены
NSUserActivity
для отслеживания расположений, просматриваемых внутри приложения, и повышение их уровня во многих местах в системе. - Контекстные запросы -
NSUserActivity
Siri предоставляют контекст информации, представленной внутри приложения Siri, чтобы пользователь смог получить направления или поставить вызов Siri из приложения.
Все эти функции имеют одну общую вещь, они используются NSUserActivity
в одной или другой форме для предоставления их функциональных возможностей.
NSUserActivity
Как упоминалось выше, система помогает понять, NSUserActivity
с какой информацией пользователь работает на экране. NSUserActivity
— это механизм кэширования состояния в легком весе для отслеживания действия пользователя при переходе по приложению. Например, посмотрите на приложение ресторана:
С помощью следующих взаимодействий:
- Так как пользователь работает с приложением,
NSUserActivity
создается для повторного создания состояния приложения позже. - Если пользователь ищет ресторан, выполняется тот же шаблон создания действий.
- И снова, когда пользователь просматривает результат. В этом последнем случае пользователь просматривает расположение и в iOS 10 система более осведомлена о некоторых понятиях (таких как расположение или взаимодействие с коммуникацией).
Взгляните на последний экран:
Здесь приложение создает и NSUserActivity
заполняется информацией для повторного создания состояния позже. Приложение также включало некоторые метаданные, такие как имя и адрес расположения. При создании этого действия приложение позволяет iOS знать, что оно представляет текущее состояние пользователя.
Затем приложение решает, будет ли действие рекламироваться через воздух для Handoff, сохранено в качестве временного значения для предложений расположения или добавлено в индекс "Центр внимания на устройстве" для отображения в результатах поиска.
Дополнительные сведения о поиске Handoffи В центре внимания см. в руководстве по api-интерфейсам "Ввод" и iOS 9 New Search API.
Создание действия
Перед созданием действия необходимо создать идентификатор типа действия для его идентификации. Идентификатор типа действия — это короткая строка, добавленная в NSUserActivityTypes
массив файла приложения Info.plist
, используемого для уникального определения заданного типа действия пользователя. В массиве будет одна запись для каждого действия, которое приложение поддерживает и предоставляет поиску приложений. Дополнительные сведения см. в справочнике по идентификаторам типов действий.
Ознакомьтесь с примером действия:
// Create App Activity
var activity = new NSUserActivity ("com.xamarin.platform");
// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));
// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;
// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;
// Inform system of Activity
activity.BecomeCurrent();
Новое действие создается с помощью идентификатора типа действия. Далее создаются некоторые метаданные, определяющие действие, чтобы это состояние можно было восстановить позже. Затем действие получает понятное название и присоединяется к сведениям пользователя. Наконец, некоторые возможности включены и действие отправляется в систему.
Приведенный выше код можно дополнительно расширить, чтобы включить метаданные, которые предоставляют контекст для действия, выполнив следующие изменения:
...
// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" };
activity.ContentAttributeSet = attributes;
// Inform system of Activity
activity.BecomeCurrent();
Если у разработчика есть веб-сайт, способный отображать те же сведения, что и приложение, приложение может включать URL-адрес и содержимое можно отображать на других устройствах, на которых не установлено приложение (через handoff):
// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");
Восстановление действия
Чтобы ответить пользователю на результат поиска (NSUserActivity
) для приложения, измените файл AppDelegate.cs и переопределите ContinueUserActivity
метод. Например:
public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
// Take action based on the activity type
switch (userActivity.ActivityType) {
case "com.xamarin.platform":
// Restore the state of the app here...
break;
}
return true;
}
Убедитесь, что это тот же идентификатор типа действия (com.xamarin.platform
), что и действие, созданное выше. Приложение использует сведения, хранящиеся в NSUserActivity
файле, для восстановления состояния обратно в место, в которое пользователь ушел.
Преимущества создания действия
Благодаря минимальному объему кода, представленному выше, приложение теперь может воспользоваться тремя новыми функциями iOS 10:
- Handoff
- Поиск в центре внимания
- Контекстные напоминания Siri
В следующем разделе описано включение двух других новых функций iOS 10:
- Предложения по расположению
- Контекстные запросы Siri
Предложения на основе расположения
Пример приведенного выше приложения поиска в ресторане. Если он реализовал NSUserActivity
и правильно заполнял все метаданные и атрибуты, пользователь сможет выполнить следующие действия:
- Найдите ресторан в приложении, на которое они хотели бы встретиться с другом.
- Если пользователь переключается на приложение Карты, адрес ресторана автоматически предлагается в качестве назначения.
- Это даже работает для сторонних приложений (которые поддерживают
NSUserActivity
), поэтому пользователь может переключиться на приложение для обмена поездками и адрес ресторана автоматически предлагается в качестве места назначения. - Он также предоставляет контекст для Siri, поэтому пользователь может вызвать Siri в приложении ресторана и попросить "Получить направления..." и Siri предоставит указания в ресторане, который пользователь просматривает.
Все перечисленные выше функциональные возможности имеют одну общую вещь, они все указывают, откуда изначально поступает предложение. В приведенном выше примере это вымышленное приложение проверки ресторана.
WatchOS 3 был улучшен, чтобы включить эту функцию для приложения с помощью нескольких небольших изменений и дополнений к существующим платформам:
NSUserActivity
содержит дополнительные поля для записи сведений о расположении, которые отображаются внутри приложения.- В MapKit и CoreSpotlight было добавлено несколько дополнений для отслеживания расположения.
- Функция поддержки расположения добавлена в Siri, Карты, Многозадачность и другие приложения в системе.
Чтобы реализовать предложения на основе расположения, начните с того же кода действия, представленного выше:
// Create App Activity
var activity = new NSUserActivity ("com.xamarin.platform");
// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));
// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;
// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;
// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" };
activity.ContentAttributeSet = attributes;
// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");
// Inform system of Activity
activity.BecomeCurrent();
Если приложение использует MapKit, это так же просто, как добавление текущей карты MKMapItem
в действие:
// Save MKMapItem location
activity.MapItem = myMapItem;
Если приложение не использует MapKit, оно может применить поиск приложений и указать следующие новые атрибуты для расположения:
// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
...
attributes.NamedLocation = "Apple Inc.";
attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";
attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;
attributes.PhoneNumbers = new string[]{"(800) 275-2273"};
attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;
Подробно рассмотрим приведенный выше код. Во-первых, имя расположения необходимо в каждом экземпляре:
attributes.NamedLocation = "Apple Inc.";
Затем текстовое описание, необходимое для экземпляров на основе текста (например, клавиатуры QuickType):
attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";
Широта и долгота являются необязательными, но убедитесь, что пользователь направляется в точное расположение, в которое приложение хочет отправить их:
attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;
Задав номера телефонов, приложение может получить доступ к Siri, чтобы пользователь смог вызвать Siri из приложения, сказав следующее:
attributes.PhoneNumbers = new string[]{"(800) 275-2273"};
Наконец, приложение может указать, подходит ли экземпляр для навигации и телефонных звонков:
attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;
Рекомендации по действиям
Apple предлагает следующие рекомендации при работе с действиями:
- Используется
NeedsSave
для отложенных обновлений полезных данных. - Убедитесь, что для текущей активности имеется надежная ссылка.
- Перенос только небольших полезных данных, которые содержат достаточно сведений для восстановления состояния.
- Убедитесь, что идентификаторы типов действия являются уникальными и описательными с помощью обратной нотации DNS, чтобы указать их.
Использование предложений по расположению
В следующем разделе описано использование предложения о расположении, которые были получены из других частей системы (например, приложения Карты) или других сторонних приложений.
Предложения по маршрутизации приложений и расположений
В этом разделе вы узнаете, как использовать предложения расположения непосредственно из приложения маршрутизации. Чтобы приложение маршрутизации добавило эту функцию, разработчик будет использовать существующую MKDirectionsRequest
платформу следующим образом:
- Чтобы повысить уровень приложения в многозадачности.
- Регистрация приложения в качестве приложения маршрутизации.
- Обработка запуска приложения с помощью объекта MapKit
MKDirectionsRequest
. - Предоставьте watchOS возможность научиться предлагать приложение на основе взаимодействия пользователей.
Когда приложение запускается с объектом MapKit MKDirectionsRequest
, оно должно автоматически начинать предоставлять пользователю указания в запрошенном расположении или представлять пользовательский интерфейс, который упрощает получение направлений. Например:
using System;
using Foundation;
using UIKit;
using MapKit;
using CoreLocation;
namespace MonkeyChat
{
[Register ("AppDelegate")]
public class AppDelegate : UIApplicationDelegate, IUISplitViewControllerDelegate
{
...
public override bool OpenUrl (UIApplication app, NSUrl url, NSDictionary options)
{
if (MKDirectionsRequest.IsDirectionsRequestUrl (url)) {
var request = new MKDirectionsRequest (url);
var coordinate = request.Destination?.Placemark.Location?.Coordinate;
var address = request.Destination.Placemark.AddressDictionary;
if (coordinate.IsValid()) {
var geocoder = new CLGeocoder ();
geocoder.GeocodeAddress (address, (place, err) => {
// Handle the display of the address
});
}
}
return true;
}
}
}
Подробно рассмотрим этот код. Он проверяет, является ли он допустимым целевым запросом:
if (MKDirectionsRequest.IsDirectionsRequestUrl(url)) {
Если это так, он создает MKDirectionsRequest
из URL-адреса:
var request = new MKDirectionsRequest(url);
Новое в watchOS 3 приложение может быть отправлено адрес, который не имеет географических координат, в результате чего разработчику нужно закодировать адрес:
var geocoder = new CLGeocoder();
geocoder.GeocodeAddress(address, (place, err)=> {
// Handle the display of the address
});
Итоги
В этой статье рассматриваются упреждающие предложения и показано, как разработчик может использовать их для передачи трафика в приложение Xamarin.iOS для watchOS. Он рассмотрел этап реализации упреждающих предложений и представленных рекомендаций по использованию.