WP7 - Search Extensibility

Windows Phone 7 – Search Extensibility

<Windows Phone 7 – Photo Extensibility>討論過Pictures Extensibility的部分,接著介紹另一個主題:Search Extensibility。

Search Extensibility主要在WP7.1中應用程式可使用App ConnectApp Instant Answer來擴充在WP7上搜尋的體驗與功能

透過App Connect的結合,在進行Bing搜尋的結果裡可以加上自行增加的擴充搜尋結果或是取得Bing的搜尋結果。

接下來將詳細討論整個擴充的概念與如何與App Connect互動。

 

 

〉Search Extensibility

在談論前有一個重要的觀念必需先了解<Quick Card Sample>,這裡面提供了Bing Search Result產生的資料結構(quick cards)為何物,

並且透過該資料結構才能讓開發者實作的Application可以結合搜尋的結果並創造出新的應用與內容。 因此,往下針對quick cards的內

容與用途,將一一說明:

 

a. Search Result & Quick Cards (整合Search Result Items)

    在WP7中搜尋結果包含了詳細的Quick cards,每一個Quick card包括了搜尋相關的結果與資訊,這些資訊可用於應用程式中

    加強搜尋的體驗。特別是Quick cards的資訊主要是取決於搜尋的類型

    在Search Result主要分成三個classes:

    (1) Place:「local pivot」中顯示相關locations清單的搜尋結果;

    (2) Product:「web pivot」中顯示產品(products標題)相關清單的搜尋結果;

    (3) Movies:「web pivot」中顯示目前靠近自我座標的電影院正在播放電影的清單

    當然,Quick cards裡儲存的資料不僅上述提到搜尋結果的部分之外,更包括:內容、圖片、描述、評分、產品資訊或電影價格等。

    另外,每一個Quick cards包含一個「App pivot」,該pivot主要專用呈現與App Connect串聯的應用程式。每一個與App Connect

    串聯的應用程式,提供從pivot導向應用程式時取得的相關資訊,呈現於應用程式之外更可以結合其他搜尋引擎的搜尋結果,加強

    搜尋的功能與體驗。

    根據MSDN上提供的圖示(如下所示),可以得知透過WP7內鍵的Bing Search搜尋「baby doll strollers」可找到如下的結果,點擊其中

    一個項目"stroller",畫面呈現相關的Product資訊(例如:about/review/apps三個pivot),接下點擊「apps pivot」,即出現支援擴

    充搜尋功能的應用程式,選擇其中一個,該應用程式執行並帶入stroller的Quick card資訊進入。

    image

   

2. 實作Extensibility的Application Architecture

    要讓開發的應用程式可以與App Connect互動,在實作Search Extensibility應用程式時,有三個重要的檔案需要注意:

    (1) WMAppManifest.xml

                去定義<Extensions>標籤內容,增加固定的標籤屬性:CustomerID、ExtensionName、ExtraFile。其中要注意的是:

         在WMAppManifest.xml定義Extensions將會向Bing Search進行註冊。

 

    (2) Extras.xml

                詳細定義了Application在Bing Search Extensions時要呈現的ApplicationTitle(多語系)、定義出現於Pivot Page中的標題

         、CustomerID與相關要擴充Quick Card中的範圍。參考<Search Registration and Launch Reference for Windows Phone>,

         該文件裡定義了Place card, Product card, Movie card的常數字串,協助在撰寫Extras.xml時可以設定要擴充的類型。

 

    (3) 在實作的Application中至少有一個Page去接收由搜尋結果Quick card送出的深層連結URI

                 收到的URI會依據在Extras.xml與WMAppManifest.xml中定義的ExtensionName來組合成不同的URI格式。其格式為:

         「app://{CustomerID}/_default#/Serachextras?{Product/Place/Movie Parameters}」,{}為動態的值。以下列出三種例子:

         =>Place:參數:ProductName、Category,例如:

   1: app://046B642D-C70D-4D8D-95E2-D92236763294/_default#/SearchExtras?
   2:     ProductName=XBox 360&
   3:     Category=Bing_Products_Electronics,Bing_Products_Office_Products

         =>Product:參數:PlaceName、PlaceLatitude、PlaceLongitude、PlaceAddress、Category,例如:

   1: app://046B642D-C70D-4D8D-95E2-D92236763294/_default#/SearchExtras?
   2:     PlaceName=Fourth Coffee&
   3:     PlaceLatitude=47.64602&
   4:     PlaceLongitude=-122.135074&
   5:     PlaceAddress=1234 Microsoft Way, WA, 98101&
   6:     Category=Bing_Places_Food_and_Dining

         =>Movies:參數:MovieName、Category,例如:

   1: app://046B642D-C70D-4D8D-95E2-D92236763294/_default#/SearchExtras?
   2:      MovieName=Adventure Works&
   3:      Category=Bing_Movies

    針對這三個不同的URI與Parameters往下將在實作的部分仔細說明。

 

    下圖為針對MSDN上示意應用程式如何向WP7內鍵的搜尋進行註冊與接收由Quick card送過來的連結資訊並顯示與應用程式的畫面:

    IC513017

 

3. App Connect Global Availability (實作讓Application擴充Bing時,支援多語系的呈現)

    在WP7的「Settings/region+language/Browser & search language」 定義了Bing Search內鍵使用的語系,

    為了讓擴充的Application也支援語系的轉換,則需要在Extras.xml中需加以定義才能呈現如下的圖示,例如:

    image

    3-1. 定義Application Title:

   1: <!-- 定義Application在Bing Search出現的標題名稱 -->
   2: <AppTitle>
   3:     <!-- Default title of the application. -->
   4:     <default>Trey Research Product Recalls</default>
   5:     <!-- Illustrates where localized application titles would be specified. -->
   6:     <es-ES>Trey Research Product Recalls [es-ES]</es-ES>
   7:     <en-GB>Trey Research Product Recalls [en-GB]</en-GB>
   8:     <it-IT>Trey Research Product Recalls [it-IT]</it-IT>
   9:     <fr-FR>Trey Research Product Recalls [fr-FR]</fr-FR>
  10:     <en-US>Trey Research Product Recalls [en-US]</en-US>
  11:     <de-DE>Trey Research Product Recalls [de-DE]</de-DE>
  12: </AppTitle>

    3-2. 定義Caption String:

   1: <Consumer ConsumerID="">
   2: <ExtensionInfo>
   3:   <Extensions />
   4:   <!-- 定義Caption string多語系呈現內容 -->
   5:   <CaptionString>
   6:     <!-- Default caption for baby and nursery products -->
   7:     <default>Research baby product recalls</default>
   8:     <!-- Illustrates localized captions for baby and nursery products. -->
   9:     <es-ES>Research Baby product recalls [es-ES]</es-ES>
  10:     <en-GB>Research Baby product recalls [en-GB]</en-GB>
  11:     <it-IT>Research Baby product recalls [it-IT]</it-IT>
  12:     <fr-FR>Research Baby product recalls [fr-FR]</fr-FR>
  13:     <en-US>Research Baby product recalls [en-US]</en-US>
  14:     <de-DE>Research Baby product recalls [de-DE]</de-DE>
  15:   </CaptionString>
  16: </ExtensionInfo>
  17:  
  18: </Consumer>

    雖然提供這樣的定義,但是「a combination of Marketplace and quick cards is not available in all markets.」所以有可能出現有些

    quick card沒有辦法多語系呈現的問題。

 

4. App Instant Answer (透過Bing Search直接啟動自己的程式)

    這是Windows Phone 7.5(Mango)之後的特性,透過Bing Search後如果與App有相關的keyword或terms出現,Bing Search會自動將符

    合的App出現在Search Result之中(如下圖)。

    001

    這與上述需要註冊Extras.xml或Extensions屬於不同的機制因為這是由Bing Search內鍵的特性,透過它(App Instant Answer)

    可直接啟動與將搜尋的關鍵字參數透過URI的方式導至自己的App。因此,重點即是「URI」:{bing_query}關鍵字,其格式如下:

    「app://FF971299-EED8-DF11-A844-00237DE2DB9E/_default?bing_query={在bing search上輸入的文字}」,{}為動態的值。

 

〉實作範例

 

1. 開發支援Search Extensibility的步驟

    a. 在WMAppManifest.xml增加Extensions標籤;

        定義要延伸的ExtensionName為:「Bing_Products_Music」找一些與音樂相關的產品。

   1: <Extensions>
   2:   <!-- Search Extensions的Customer ID固定為:5B04B775-356B-4AA0-AAF8-6491FFEA5661 -->
   3:   <!-- Production extensions, for products: Video games -->
   4:   <Extension ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}" 
   5:              ExtensionName="Bing_Products_Video_Games"
   6:              ExtraFile="Extensions\\Extras.xml" 
   7:              TaskID="_default" />
   8:   
   9:   <!-- Production extensions, for movies. -->
  10:   <Extension ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
  11:              ExtensionName="Bing_Movies"
  12:              ExtraFile="Extensions\\Extras.xml"
  13:              TaskID="_default" />
  14:   
  15:   <!-- Production extensions, for place: travel, food, and dining -->
  16:   <Extension ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
  17:              ExtensionName="Bing_Places_Food_and_Dining"
  18:              ExtraFile="Extensions\\Extras.xml"
  19:              TaskID="_default" />
  20: </Extensions>

 

    b. 定義Extras.xml裡要擴充Search的內容與對象;

        b-1. 在專案中新增Extensions資料夾與Extras.xml檔案

        b-2. 定義ExtensionName、AppTitle、CaptionString等屬性:

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <ExtrasInfo>
   3:   <!-- Application Title -->
   4:   <AppTitle>
   5:     <default>客製Search Extension Proj</default>
   6:   </AppTitle>
   7:   
   8:   <!-- Search-related captions (定義搜尋關聯性)-->
   9:   <Cusumer ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}">
  10:     <!-- Products caption for VIDEO GAME -->
  11:     <ExtensionInfo>
  12:       <Extensions>
  13:         <ExtensionName>Bing_Products_Video_Games</ExtensionName>
  14:       </Extensions>
  15:       <CaptionString>
  16:         <default>Product URI Details</default>
  17:       </CaptionString>
  18:     </ExtensionInfo>
  19:  
  20:     <!-- Movie caption-->
  21:     <ExtensionInfo>
  22:       <Extensions>
  23:         <ExtensionName>Bing_Movies</ExtensionName>
  24:       </Extensions>
  25:       <CaptionString>
  26:         <default>Movie URI Details</default>
  27:       </CaptionString>
  28:     </ExtensionInfo>
  29:  
  30:     <!-- Places caption for food and dining -->
  31:     <ExtensionInfo>
  32:       <Extensions>
  33:         <ExtensionName>Bing_Places_Food_and_Dining</ExtensionName>
  34:       </Extensions>
  35:       <CaptionString>
  36:         <default>Places URI Details</default>
  37:       </CaptionString>
  38:     </ExtensionInfo>
  39:   </Cusumer>
  40: </ExtrasInfo>

 

    c. 透過UriMapper將Bing Search傳遞過來的quick card deep URI與參數對應至Application中的處理頁面;

        由於與Bing Search result互動均是透過URI與參數,在Product、Place、Movie參數也有所不同。因此,繼承UriMapper實作

        切換的功能是個不錯的選擇。運作的概念如下圖:(由於Code較多,可以直接下載範例參考)

        圖片1

 

    d. 定義App.xaml.cs整合UriMapper擷取quick card deep URI的參數,接著處理需要擴充的使用體驗;

   1: private void InitializePhoneApplication()
   2: {
   3:     if (phoneApplicationInitialized)
   4:         return;
   5:  
   6:     // Create the frame but don't set it as RootVisual yet; this allows the splash
   7:     // screen to remain active until the application is ready to render.
   8:     RootFrame = new PhoneApplicationFrame();
   9:  
  10:     // 設定RootFrame的UriMapper屬性為客製過的QuickCardUriMapper。
  11:     RootFrame.UriMapper = new QuickCardUriMapper();
  12:  
  13:     RootFrame.Navigated += CompleteInitializePhoneApplication;
  14:  
  15:     // Handle navigation failures
  16:     RootFrame.NavigationFailed += RootFrame_NavigationFailed;
  17:  
  18:     // Ensure we don't initialize again
  19:     phoneApplicationInitialized = true;
  20: }

   

    e. 實作QuickCardUriParameters與QuickCardViewModel二個類別,用於承接Parameter參數與呈現Parameter參數於實作的Page上;

        實作quick card uri parameters主要是將deep Uri中的內容,依照Parameters逐一解開放入固定的類別或稱model;

        實作quick card view model主要是將quick card uri parameters用於data binding時放置於畫面呈現的內容;

        二者都實作了INotifyChanged介面。(由於Code較多,可以直接下載範例參考)

 

    f. 測試整合至Bing Search;

        測試「Products」時,可以輸入:XBOX、XBOX 360或其他video game;

        測試「Places」時,可以輸入:food、或其他相關的食物或晚餐關鍵字;

        測試「Movies「時,可以輸入:movies、movies in theaters;

        =>但不是每次搜尋都會有辦法看到自己的App出現於「App的pivot」中。如果一直無法測試的話,可以直接使用改掉

           WMAppManifest.xml中的DefaultTask的方式來進行測試。

        (movies) 1001 1002 1003

        (xbox) 0002 00030001

 

2. 結合App Instant Answer的功能

    實作擷取NavigationContext.QueryString中的關鍵URI參數:「bing_query」。

   1: protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
   2: {
   3:     base.OnNavigatedTo(e);
   4:     //如果導入該畫面時,在URI中的Query String存在bing_query的key,代表是App Instant Answer。
   5:     if (NavigationContext.QueryString.Keys.Contains("bing_query"))
   6:     {
   7:         txtUriParameterName.Visibility = Visibility.Visible;
   8:         txtUriParameterValue.Visibility = Visibility.Visible;
   9:         //取出由Bing Search透過App Instant Answer送過來的Uri參數:bing_query
  10:         txtUriParameterValue.Text = 
  11:                         NavigationContext.QueryString["bing_query"].ToString();
  12:         txtNoLaunch.Visibility = Visibility.Collapsed;
  13:     }
  14: }

 

[範例程式]

 

[注意] - 根據MSDN上有提到要注意的部分..

1. 為了避免濫用App Connect的風險,註冊者(指應用程式)只能擴充搜尋功能是與應用程式相關的部分;

2. App Connect目的是節省用戶的時間,所以應用程式要能使用App Connect URI參數做一些有意義的事情;

3. 定義Extensions與Extras.xml時,需注意:

       主要依賴WMAppManifest.xml與Extras.xml去定義該Application與Bing Search要互動的搜尋依據,讓Bing Search

       進行搜尋時,可以依照App註冊的Extensions將{Product, Place, Movie}標籤的搜尋結果加以串聯起來。

4. 使用Windows Phone Emular除錯時

    利用WMAppManifest.xml中的DefaultTask標籤來加以模擬,DefaultTask代表App啟動時RootFrame要載入的預設Page,

    因此,只要修改該標籤的值即可以在Page進入時,立刻可以取得到送過來的URI參數。

    4-1. 模擬由Bing Search extensions觸發傳入的特定搜尋參數:(使用Product, Place, Movie的URI參數)          

   1: <!--<DefaultTask  Name ="_default" NavigationPage="MainPage.xaml"/>-->
   2: <!-- 直接修改NavigationPage後的URI參數加以模擬Extensions帶過來的quick card uri -->
   3: <DefaultTask Name="_default" 
   4:    NavigationPage="SearchExtras?MovieName=Test&amp;Category=Bing_Movies" />

 

     4-2. 模擬App Instant Answer觸發應用程式傳入的URI參數:(使用Bing Search的Query String參數)

   1: <!--<DefaultTask  Name ="_default" NavigationPage="MainPage.xaml"/>-->
   2: <!-- 使用bing_query為URI的參數值,來模擬透過App Instant Answer的方式啟動app -->
   3: <DefaultTask  Name ="_default" 
   4:    NavigationPage="MainPage.xaml?bing_query=XBOX 360"/>

           

======

本篇主要介紹WP7.1針對Search功能的擴充,透過App Connect與App Instant Answer取得Quick cards,

並且配合自行開發的應用程式提供更豐富的搜尋體驗與功能。其內文蠻多來自MSDN的說明,所以閱讀起來會覺得有點怪異,

因為很多名詞我透過自己的話再說過一次,多少會有些不同的地方。不過了解了二篇支援擴充的文章之後,還是期待WP7.1

未來提供更多元的擴充,讓應用程式開發的範圍與應用更多方面。

 

References:

Search Extensibility for Windows Phone

Search Registration and Launch Reference for Windows Phone

How to: Extend Search with App Connect for Windows Phone

Search Extensibility Sample

Quick Card Sample (必看)

Search Extensibility Overview for Windows Phone (必讀)

How to: Integrate with App Instant Answer for Windows Phone (另一個延伸bing search功能的方式)

Windows Phone 7 Developer Guide

WP7 修練 DAY 02:如何在頁面顯示前自動轉向到其他頁面 (使用UriMapper的基本方式)

 

Dotblogs Tags: