Эта статья является Днем № 22 из серии под названием «
31 Дней Манго» и написана приглашенным автором Мэттом Эландом. С Мэттом можно связаться в Твиттере по адресу
@integerman .
Что такое App Connect?
Windows Phone Mango представляет множество фантастических улучшений и без того великолепной операционной системы Windows Phone. Среди этих улучшений — ряд улучшений поисковой системы Bing на телефоне. Хотя многие из этих функций, таких как визуальный поиск и пошаговые инструкции, предназначены для клиентов, Microsoft также представила несколько функций, позволяющих разработчикам интегрировать приложения в результаты поиска с помощью мгновенных ответов, что позволяет выделить приложения, относящиеся к конкретным запросам. или с помощью новой функции в Mango под названием Quick Cards.
Быстрые карты — это элементы, которые появляются в определенных поисках и позволяют пользователям узнать больше об определенных продуктах, местах или фильмах в Bing. На рисунке ниже приведен пример результатов поиска, включающих Quick Cards для нескольких книг, соответствующих запросу пользователя:
Нажав на один из этих пунктов, вы перейдете к Быстрой Карте этого продукта, которая позволяет вам найти больше информации о продукте в централизованном месте, как показано ниже:
App Connect — это еще одна новая функция в Windows Phone Mango, которая позволяет указывать приложения в элементе приложения «Быстрые карты», которые имеют отношение к предмету приложения. Оттуда пользователь может щелкнуть и запустить приложение и получить опыт запуска приложения, который можно настроить в соответствии с быстрой картой, с которой только что пришел пользователь.
Важно отметить, что в настоящее время только США поддерживают карточки быстрого доступа к продуктам и фильмам, хотя места на карточках быстрого доступа более доступны. Несмотря на это существующее ограничение, мы также коснемся локализации текста результатов поиска.
См. Http://msdn.microsoft.com/en-us/library/hh202957(v=VS.92).aspx#BKMK_AppConnect для получения более подробного и актуального списка типов поддерживаемых быстрых карт.
Как и в случае с быстрыми картами, разработчики могут также информировать свои приложения о сценариях, в которых они запускаются, например, с помощью мгновенных ответов Bing, еще одного улучшения Mango в поиске Bing. Мгновенные ответы Bing позволяют Bing показывать определенные приложения, которые, по его мнению, имеют непосредственное отношение к конкретному поиску.
В этой статье мы создадим приложение, которое позволит вам быстро найти книгу на сайте интернет-магазина, воспользовавшись преимуществами интеграции с расширенными возможностями поиска для быстрых карточек для книг и журналов и предоставив настраиваемый интерфейс, если он был запущен из Bing Instant Answers. ,
Начало работы с расширяемостью поиска
Настройка приложения для использования преимуществ App Connect относительно проста, хотя для того, чтобы все заработало, нужно выполнить ряд шагов.
Мы начнем с создания нового проекта приложения Windows Phone для Visual Studio, ориентированного на Windows Phone 7.1.
Регистрация поисковых расширений
Чтобы Windows Phone знал, что ваше приложение поддерживает App Connect, необходимо добавить запись в файл манифеста, сообщающий телефону, какие поисковые расширения поддерживает приложение. Это важно и должно включать только те типы продуктов, которые соответствуют вашему применению.
Разверните узел свойств файла проекта и перейдите в файл WMAppManifest.xml. Это манифест приложения телефона для магазина и определяет всю необходимую информацию для вашего приложения. Вам нужно будет добавить новый узел внутри элемента App, как показано в следующем файле:
<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2009/deployment" AppPlatformVersion="7.1"> <App ="" > <IconPath IsRelative="true" IsResource="false">ApplicationIcon.jpg</IconPath> <Capabilities></Capabilities> <Tasks> <DefaultTask Name ="_default" NavigationPage="MainPage.xaml"/> </Tasks> <Tokens></Tokens> <Extensions> <!-- Beta extension, for development and testing only --> <Extension ExtensionName="Products" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}" TaskID="_default" ExtraFile="Extensions/Extras.xml" /> <!-- Production extensions, for submission to Marketplace --> <Extension ExtensionName="Bing_Products_Books_and_Magazines" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}" TaskID="_default" ExtraFile="Extensions/Extras.xml" /> </Extensions> </App> </Deployment>
Важным аспектом этого являются два элемента расширения. ExtensionName определяет, с какой Quick Card расширение поддерживает интеграцию. См. Http://msdn.microsoft.com/en-us/library/hh202958(v=VS.92) для получения полного списка доступных быстрых карт.
Эмулятор обрабатывает App Connect иначе, чем финальная версия Mango, которая работает на телефоне. В эмуляторе все QuickCards для продуктов имеют категорию «Продукты» вместо более конкретных отдельных ExtensionNames. То есть, если бы мы зарегистрировали наше приложение для поддержки книг и журналов с помощью ExtensionName «Bing_Products_Books_and_Magazines», наше приложение будет отображаться как поддерживаемое для быстрой карточки книги на устройстве, но не на эмуляторе, и если мы зарегистрировались как поддерживающие В категории «Продукты» приложение эмулятора будет работать нормально, но не будет работать на реальных устройствах. Из-за этого вы захотите поддерживать как широкую категорию «Продукты», так и любые конкретные категории, которые вы можете обрабатывать, определяя несколько элементов Extension.
С другими полями в элементе Extension относительно просто работать: ConsumerID идентифицирует расширяемость поиска как функцию, с которой связано расширение, и изменять ее не следует. TaskID определяет задачу, которая должна быть запущена при запуске расширения. ExtraFile сообщает приложению, где искать дополнительные данные, необходимые для поддержки интеграции поиска, и должен указывать на Extensions / Extras.xml, иначе App Connect не будет работать.
Настройка дополнительных данных, необходимых для App Connect
Поскольку наш проект не содержит Extensions / Extras.xml, на который мы ссылались в двух зарегистрированных нами расширениях, нам придется его создать. Щелкните правой кнопкой мыши проект в обозревателе решений и выберите «Добавить -> Новая папка», переименуйте папку в «Расширения», щелкните правой кнопкой мыши эту папку и выберите «Добавить -> Новый элемент». Выберите XML-файл из списка и назовите его Extras.xml. Имя и путь к этому файлу должны быть точными, иначе расширения для поиска не будут работать должным образом.
Теперь у вас должен быть файл Extras.xml в папке Extensions. Отсюда нам нужно добавить узел ExtrasInfo в xml-файл, который определяет, как приложение работает с зарегистрированными нами расширениями.
<ExtrasInfo> <AppTitle> <!-- Neutral language application title. --> <default>Book Helper</default> <!-- Localized titles --> <es-ES>Libro Helper</es-ES> <fr-FR>Livre Helper</fr-FR> <zh-CN></zh-CN> </AppTitle> <Consumer ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"> <ExtensionInfo> <Extensions> <!-- Corresponding product extension for books --> <ExtensionName>Bing_Products_Books_and_Magazines</ExtensionName> <!-- Beta extension, for all products. --> <ExtensionName>Products</ExtensionName> </Extensions> <CaptionString> <!-- Neutral language caption --> <default>Search vendors for books and eBooks</default> <!-- Localized captions --> <es-ES>Bsqueda de libros y libros electrnicos de varios proveedores</es-ES> <fr-FR>Recherche de livres et eBooks provenant de divers fournisseurs</fr-FR> <zh-CN></zh-CN> </CaptionString> </ExtensionInfo> </Consumer> </ExtrasInfo>
Элемент AppTitle и его дочерние элементы сообщают Windows Phone, как вызывать наше приложение (и предоставляют несколько локализованных строк для разных локалей). Узел по умолчанию внутри этого используется, если не может быть найдена специфичная для локали строка, и она должна представлять заголовок приложения на нейтральном языке сборки. Дополнительные узлы могут быть добавлены с именами, соответствующими коду культуры, для которого предназначена локализованная строка. Например, es-ES в этом примере указывает строку, используемую в настройках испанского языка.
Узел Consumer имеет ConsumerID, который соответствует идентификаторам ConsumerID, которые мы зарегистрировали в файле WMAppManifest.xml ранее. Внутри этого узла находится узел ExtensionInfo с узлом Extensions, который содержит элементы ExtensionName, которые определяют расширения, которые, как мы сказали, мы поддерживали.
Элемент CaptionString определяет сообщение, используемое рядом с плиткой расширения поиска, и локализуется так же, как и элемент AppTitle. Пример этого приложения, отображаемого как расширение поиска, изображен ниже:
Обратите внимание, что значок приложения используется для этого изображения, и фон может быть светлым или темным в зависимости от темы. Следовательно, прозрачность значков приложений не должна использоваться при наличии интеграции App Connect. Кроме того, элемент сводки для App Connect на быстрых картах в эмуляторе говорит «дополнительные», тогда как на реальных устройствах Mango этот элемент сводки помечен как «приложения».
Если вам нужно указать разные заголовки для разных типов продуктов, вы можете сделать это, объявив несколько элементов ExtensionInfo и используя некоторые элементы ExtensionName в одном элементе ExtensionInfo и другие в другом, если все ExtensionNames, которые, как вы говорите, поддерживает ваше приложение, представлены в ExtensionInfo. ,
Настройка сопоставления URI
Когда пользователь входит в приложение с помощью App Connect, среда выполнения попытается перейти к URI / SearchExtras. Для поддержки этой точки входа нам нужно настроить некоторые сопоставления URI для перенаправления трафика на соответствующую страницу. Для этого мы определим ресурс UriMapper в коллекции ресурсов приложения, перейдя в App.xaml и добавив следующий ресурс в Application.Resources:
<Application.Resources> <nav:UriMapper x:Key="UriMapper" xmlns:nav="clr-namespace:System.Windows.Navigation;assembly=Microsoft.Phone"> <nav:UriMapper.UriMappings> <nav:UriMapping Uri="/SearchExtras" MappedUri="/MainPage.xaml" /> </nav:UriMapper.UriMappings> </nav:UriMapper> </Application.Resources>
Определение этого ресурса недостаточно. Мы должны сообщить приложению, чтобы найти и использовать этот UriMapper для разрешения запросов. Мы делаем это, добавляя следующий код в конструктор в App.xaml.cs:
// Enable URI mapping for Search Extras deep link URIs RootFrame.UriMapper = Resources["UriMapper"] as UriMapper;
Это правильно сопоставит весь входящий трафик App Connect для перехода на главную страницу после использования нашего приложения. Если бы мы хотели, мы могли бы указать конкретную страницу сведений об элементе в свойстве MappedUri, которая является специфической для App Connect, но для целей этого примера этого будет достаточно.
Воспользуйтесь преимуществами интеграции App Connect
На этом этапе, если вы запустите свое приложение в эмуляторе, а затем перейдете к поиску Bing на устройстве с помощью ключа поиска, вы должны увидеть свое приложение в списке дополнительных возможностей для быстрой карты продукта — при условии, что вы зарегистрировали свое приложение в качестве поддерживающих продуктов — сопоставления отдельных типов продуктов не работают для эмулятора, но будут работать на вашем фактическом устройстве (и наоборот — регистрация как поддержка широкой категории продуктов не работает на реальных устройствах).
К сожалению, наше приложение на самом деле ничего не делает с данными, предоставленными App Connect. Чтобы это исправить, давайте начнем с определения нашего пользовательского интерфейса. Перейдите в MainPage.xaml и замените Grid с именем LayoutRoot и всех его дочерних элементов следующим XAML:
<Grid Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <StackPanel Margin="12,17,0,28"> <TextBlock Text="BOOK HELPER" Style="{StaticResource PhoneTextNormalStyle}" /> <TextBlock Text="Welcome" x:Name="lblPageTitle" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" /> </StackPanel> <ScrollViewer Margin="12,0,12,0" Grid.Row="1"> <StackPanel> <TextBlock TextWrapping="Wrap" x:Name="lblBookTitle" Visibility="Collapsed" Style="{StaticResource PhoneTextLargeStyle}" Text="Book title goes here" /> <TextBlock TextWrapping="Wrap" x:Name="lblNoSearch" Text="To use this product, use your device's search functions to look for a book and then select this app from the apps section." Style="{StaticResource PhoneTextNormalStyle}" /> <HyperlinkButton HorizontalContentAlignment="Left" Foreground="{StaticResource PhoneAccentBrush}" Margin="{StaticResource PhoneVerticalMargin}" Content="Search Amazon" Click="HandleSearchAmazonBooks" /> <HyperlinkButton HorizontalContentAlignment="Left" Foreground="{StaticResource PhoneAccentBrush}" Margin="{StaticResource PhoneVerticalMargin}" Content="Search Barnes and Noble" Click="HandleSearchBarnesAndNoble" /> </StackPanel> </ScrollViewer> </Grid>
Это определяет пользовательский интерфейс, который сможет функционировать как автономное приложение (в случае нормального запуска приложения) или служить страницей сведений, если приложение запускается с помощью App Connect. По умолчанию приложение будет выглядеть следующим образом:
Обработка параметров запроса
Очевидно, что мы бы хотели сделать что-то особенное, если бы запустили приложение из App Connect на Quick Card. К счастью, при входе на страницу через App Connect контекст навигации страницы содержит два параметра строки запроса, которые могут помочь нам определить основную информацию о Quick Card, запустившей приложение. Аргумент строки запроса ProductName будет содержать название продукта, связанного с Quick Card, которую только что просмотрел пользователь, а аргумент Category будет ExtensionName, который связан с этой Quick Card.
Важно дождаться загрузки страницы, прежде чем проверять параметры строки запроса, поскольку NavigationContext не будет доступен до завершения загрузки.
Хотя это довольно базовая информация, она по-прежнему полезна для приложений, которым необходимо предварительно заполнить поля или элементы управления названиями продуктов, или для страниц, которые должны быть достаточно гибкими для работы с несколькими типами продуктов. Имейте в виду, что для целей отладки Category всегда будет «Products» в эмуляторе, но будет иметь правильные значения при запуске на реальном устройстве.
Для нашего примера приложения у нас будет страница, отображающая название продукта на странице, если мы вошли в приложение через App Connect, но оставим существующий пользовательский интерфейс, если он обрабатывает стандартный запуск. Поскольку точка входа приложения и точка входа дополнительных функций поиска используют одну и ту же страницу для нашей демонстрации, важно проверить наличие аргументов строки запроса, прежде чем пытаться их использовать.
Вот модифицированный файл MainPage.xaml.cs, который включает логику для анализа параметров строки запроса и обработки щелчков гиперссылки:
public partial class MainPage : PhoneApplicationPage { private string _book; // Constructor public MainPage() { InitializeComponent(); // We need to wait until loaded before checking NavigationContext Loaded += HandleLoaded; } private void HandleLoaded(object sender, RoutedEventArgs e) { // Determine what the context of the app launch is if (NavigationContext.QueryString.ContainsKey("ProductName")) { _book = NavigationContext.QueryString["ProductName"]; lblPageTitle.Text = "Book Details"; } else { _book = null; } // In a "real" application we'd want to use binding and converters if (!string.IsNullOrWhiteSpace(_book)) { lblBookTitle.Text = _book; lblNoSearch.Visibility = Visibility.Collapsed; lblBookTitle.Visibility = Visibility.Visible; } else { lblNoSearch.Visibility = Visibility.Visible; lblBookTitle.Visibility = Visibility.Collapsed; } } private void HandleSearchBarnesAndNoble(object sender, RoutedEventArgs e) { if (string.IsNullOrWhiteSpace(_book)) { BrowseTo("http://www.barnesandnoble.com/ebooks/index.asp"); } else { BrowseTo("http://productsearch.barnesandnoble.com/search/results.aspx?store=BOOK&keyword=\"" + _book.Replace(" ", "+") + "\""); } } private void HandleSearchAmazonBooks(object sender, RoutedEventArgs e) { if (string.IsNullOrWhiteSpace(_book)) { BrowseTo("http://www.amazon.com/gp/aw/sb.html/sn=Books"); } else { BrowseTo("http://www.amazon.com/gp/aw/s/?k=" + _book.Replace(" ", "+")); } } private static void BrowseTo(string address) { var webTask = new Microsoft.Phone.Tasks.WebBrowserTask { Uri = new Uri(address) }; webTask.Show(); } }
Теперь, когда мы запускаем наше приложение через App Connect, мы видим следующее:
Поддержка мгновенных ответов приложения
Еще одна связанная функция, представленная в Windows Phone Mango, — это приложение «Мгновенные ответы». Это автоматическая функция поиска Bing, когда приложения, которые Bing считает релевантными для определенного поиска, отображаются в верхней части результатов поиска. Вам не нужно ничего делать, чтобы поддерживать запуск из мгновенных ответов, но вы можете воспользоваться информацией, переданной через эту функцию, если вы выберете. Эта информация предоставляется через параметр строки запроса, называемый «bing_query», и доступ к ней осуществляется аналогично параметрам строки запроса ProductName и Category.
Модификация нашего примера приложения для использования мгновенных ответов чрезвычайно проста, что иллюстрируется модифицированной верхней половиной метода HandleLoaded:
// Determine what the context of the app launch is if (NavigationContext.QueryString.ContainsKey("ProductName")) { _book = NavigationContext.QueryString["ProductName"]; lblPageTitle.Text = "Book Details"; } else if (NavigationContext.QueryString.ContainsKey("bing_query")) { _book = NavigationContext.QueryString["bing_query"]; lblPageTitle.Text = "Related Search"; }
Эта модификация позволяет приложению извлекать либо название книги из названия продукта Quick Card, если оно есть, либо из запроса Bing, который сгенерировал результат мгновенных ответов. Изображение ниже иллюстрирует вход в приложение через результат мгновенных ответов для строки поиска «Сфера Майкла Крайтона»
Тестирование приложения Connect
Вам может быть интересно узнать, как тестировать мгновенные ответы или прикреплять с помощью отладчика при работе с расширениями поиска. Это верный момент, поскольку в настоящее время нет хорошего способа повлиять на результаты поиска Bing с помощью эмулятора, а при работе с расширениями поиска атрибут Category не регистрируется так же, как на устройстве. Кроме того, может потребоваться много времени, чтобы перейти к Bing, выполнить определенный поиск, а затем запустить приложение с помощью App Connect. К счастью, есть простой способ симулировать запуск вашего приложения с помощью расширений поиска или мгновенных ответов.
Поскольку мы можем предсказать параметры строки запроса, которые Quick Cards будет генерировать при входе в наше приложение, можно жестко закодировать эти значения в точку входа приложения для целей тестирования. Приложения для Windows Phone хранят адрес страницы по умолчанию внутри файла WMAppManifest.xml в узле свойств проекта. Откройте этот файл и найдите элемент DefaultTask в коллекции Tasks. Это должно выглядеть примерно так:
<DefaultTask Name = «_ default» NavigationPage = «MainPage.xaml» />
Этот элемент сообщает приложению, куда следует перемещаться при запуске приложения, и может быть изменен для указания на любой файл, который вы пожелаете. Его также можно изменить, чтобы имитировать вход в приложение с помощью расширений поиска или мгновенных ответов, указав параметры строки запроса. Например, следующая запись использовалась для проверки мгновенных ответов в разделе выше:
<DefaultTask Name = «_ default» NavigationPage = «MainPage.xaml? Bing_query = Сфера Майкла Крайтона» />
Модификации для моделирования точки входа расширения поиска для аналогичного продукта очень похожи. Обратите внимание, что поскольку мы указываем несколько параметров строки запроса, используя & amp; важно избежать амперсанда, как показано в следующем фрагменте:
<DefaultTask Name = «_ default» NavigationPage = «MainPage.xaml? Category = Bing_Products_Books_and_Magazines & ProductName = Sphere» />
Конечно, как только вы закончите тестирование и будете готовы к развертыванию приложения, убедитесь, что вы удалили все жестко закодированные параметры строки запроса из задачи по умолчанию, чтобы приложение функционировало так, как задумано.
Иногда вы можете столкнуться с ошибками развертывания, когда вносите изменения в файл WMAppManifest.xml и пытаетесь запустить приложение в эмуляторе. Если развертывание завершается неудачно с сообщением: «Установка приложения не удалась. Произошла ошибка во время выполнения. Исправьте возможности в файле WMAppManifest.xml ». и ваш раздел возможностей выглядит нормально, просто пересоберите приложение и попробуйте снова.
Резюме
Это включает в себя описание App Connect и мгновенных ответов, двух простых, гибких и простых в использовании способов, позволяющих вашему приложению интегрироваться с точками расширения в улучшенной поисковой системе Bing для Windows Phone Mango.
Чтобы загрузить полнофункциональное приложение для Windows Phone, использующее код, продемонстрированный в этой статье, нажмите кнопку «Загрузить код» ниже:
Завтра Самидип Басу вернется, чтобы обсудить модель исполнения Windows Phone, включая быстрое переключение приложений, и то, как Tombstoning (который освещался в 14-м дне 31-го дня Windows Phone ) немного изменился, чтобы приспособиться к новой операционной системе 7.5. Увидимся позже!
Источник: http://www.jeffblankenburg.com/2011/11/22/31-days-of-mango-day-22-app-connect/