Georg fährt extra nach Berlin um Steve Ballmer zu treffen

31 Tage Mango | Tag #22: App Connect

Die­ser Arti­kel ist Tag #22 der Serie 31 Tage Man­go von Jeff Blan­ken­burg.

Der Ori­gi­nal­ar­ti­kel befin­det sich hier: Day #22: App Con­nect.

Die­ser Arti­kel wur­de in der Ori­gi­nal­se­rie von Gast­au­tor Matt Eland geschrie­ben. Bei Twit­ter kann Matt unter @integerman erreicht wer­den.

Was ist App Connect?

Win­dows Pho­ne Man­go hat zahl­rei­che Neue­run­gen und Erwei­te­run­gen für das Win­dows Pho­ne Betriebs­sys­tem gebracht. Unter die­sen sind auch eini­ge für die Bing Such­ma­schi­ne auf dem Tele­fon. Wäh­rend bei­spiels­wei­se Visu­al Search und die ver­bes­ser­ten Weg­be­schrei­bun­gen haupt­säch­lich den End­kun­den nut­zen, gibt es ein paar Fea­tures, mit denen Ent­wick­ler ihre Apps mit den Such­ergeb­nis­sen inte­grie­ren kön­nen. Hier­zu gibt es zwei Wege: mit Instant Ans­wers wer­den rele­van­te Apps zu einem Such­ergeb­nis ange­zeigt; auf Quick Cards wer­den detail­lier­te Infor­ma­tio­nen und rele­van­te Apps zu einem gesuch­ten Pro­dukt, Ort oder einem Film ange­zeigt. Unten sehen Sie ein Bei­spiel für Such­ergeb­nis­se mit Quick Cards für alle Bücker, die der Suche des Benut­zers ent­spre­chen:

Wenn der Anwen­der auf einen der Ein­trä­ge klickt, kommt er auf die Quick Card zum ent­spre­chen­den Pro­dukt, wo er alle wich­ti­gen Infor­ma­tio­nen zum Pro­dukt an einer zen­tra­len Stel­le fin­det:

Mit dem neu­en Man­go-Fea­ture App Con­nect kön­nen Anwen­dun­gen, die the­ma­tisch etwas mit der Suche zu tun haben, auf der „Anwen­dun­gen“ Pivot Sei­te der Quick Card ange­zeigt wer­den. Von dort kann der Anwen­der die App direkt star­ten. Basie­rend auf den Infor­ma­tio­nen der Quick Card kann die Anwen­dung nun selbst wei­te­re rele­van­te Infor­ma­tio­nen anzei­gen.

Ach­tung: Die Quick Cards für Pro­duk­te und Fil­me wer­den der­zeit nur in den USA unter­stützt. Die Quick Card für Orte ist etwas mehr ver­brei­tet (unter ande­rem auch in Deutsch­land). Unab­hän­gig von die­ser Ein­schrän­kung wer­den wir uns auch anschau­en, wie der Text der Such­ergeb­nis­se loka­li­siert wer­den kann.

Hier fin­den Sie eine aktu­el­le­re und detail­lier­te Lis­te zur Ver­füg­bar­keit von Quick Cards: http://msdn.microsoft.com/en-us/library/hh202957(v=VS.92).aspx#BKMK_AppConnect

(Anm. leit­ning: Es ist soooo scha­de, dass die gan­zen coo­len Bing-Fea­tures in Euro­pa nicht funk­tio­nie­ren. Local Scout, Visu­al Search und Search Exten­si­bi­li­ty sind für mich unter den geils­ten Fea­tures von Win­dows Pho­ne. Am liebs­ten wür­de ich sofort nach Red­mond oder Unter­schleiß­heim oder sonst wohin fah­ren und mit­hel­fen, dass die­se Fea­tures auch bei uns in Euro­pa ver­füg­bar wer­den.)

Ähn­lich wie bei Quick Cards wer­den Apps auch unter­rich­tet, wenn Sie in Form einer Instant Ans­wer (einer wei­te­ren Erwei­te­rung der Bing Suche in Man­go) auf­ge­ru­fen wer­den. Durch Bing Instant Ans­wers kön­nen Apps in den Such­ergeb­nis­sen ange­zeigt wer­den, wenn Bing die­se für den spe­zi­fi­schen Such­be­griff als rele­vant erach­tet.

In die­sem Arti­kel wer­den wir eine Anwen­dung bau­en, die Ihnen erlaubt, auf der Web­sei­te eines Online­händ­lers nach einem Buch zu suchen. Hier­zu ver­wen­den wir die Erwei­te­run­gen der Suche für Bücher und Zeit­schrif­ten mit­tels Quick Cards. Wei­ter­hin wer­den wir eine spe­zi­el­le Ansicht anzei­gen, wenn die App über Bing Instant Ans­wers auf­ge­ru­fen wur­de.

Erste Schritte mit den Sucherweiterungen

Eigent­lich ist die Ein­rich­tung von App Con­nect für Ihre Anwen­dung rela­tiv ein­fach. Es gibt aber eini­ge Schrit­te, die Sie durch­füh­ren müs­sen damit alles funk­tio­niert.

Wir begin­nen, indem wir im Visu­al Stu­dio eine neue Win­dows Pho­ne Anwen­dung für Win­dows Pho­ne 7.1 erstel­len.

Sucherwei­te­run­gen regis­trie­ren

Damit Win­dows Pho­ne weiß, dass Ihre Anwen­dung App Con­nect unter­stützt, müs­sen Sie in der Mani­fest-Datei einen Ein­trag hin­zu­fü­gen, der beschreibt, wel­che Sucherwei­te­run­gen Ihre Anwen­dung unter­stützt. Hier soll­ten Sie wirk­lich nur die­je­ni­gen Erwei­te­run­gen (zum Bei­spiel Pro­dukt­ty­pen) ange­ben, die wirk­lich rele­vant für Ihre Anwen­dung sind.

Klap­pen Sie den Kno­ten Pro­per­ties in Ihrem Pro­jekt auf und öff­nen Sie die Datei WMAppManifest.xml. Die­se Datei defi­niert alle wich­ti­gen Infor­ma­tio­nen über Ihre Anwen­dung. Inner­halb des App Ele­ments müs­sen Sie einen Kno­ten Exten­si­ons hin­zu­fü­gen, wie im fol­gen­den Code­bei­spiel illus­triert:

<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> 

Die wich­ti­gen Berei­che sind hier die bei­den Exten­si­on Ele­men­te. Exten­si­onNa­me gibt an, für wel­che Quick Card die Exten­si­on gilt. Für eine kom­plet­te Lis­te der ver­füg­ba­ren Quick Cards sehen Sie hier nach: http://msdn.microsoft.com/en-us/library/hh202958(v=VS.92).

Im Emu­la­tor ver­hält sich App Con­nect anders als auf einem ech­ten Tele­fon. Im Emu­la­tor haben alle Pro­duk­te die Kate­go­rie „Pro­duc­ts“ anstatt der detail­lier­te­ren Exten­si­onNa­mes. Das heißt: wenn wir unse­re App für Bücher und Zeit­schrif­ten regis­trie­ren, indem wir den Exten­si­onNa­me „Bing_Products_Books_and_Magazines“ ange­ben, wür­de unse­re App auf einem ech­ten Tele­fon bei der Quick Card eines Buchs ange­zeigt wer­den aber nicht im Emu­la­tor. Wenn wir die App umge­kehrt für „Pro­duc­ts“ regis­trie­ren wür­den, wür­de im Emu­la­tor alles funk­tio­nie­ren aber auf einem ech­ten Gerät wür­de unse­re App nicht auf­tau­chen. Aus die­sem Grund emp­fiehlt es sich, sowohl die all­ge­mei­ne „Pro­duc­ts“ Kate­go­rie als auch die spe­zi­fi­schen Kate­go­ri­en durch Defi­ni­ti­on wei­te­rer Exten­si­on Ele­men­te zu unter­stüt­zen.

Die ande­ren Fel­der im Exten­si­on Ele­ment sind ein­fach: Con­su­me­r­ID gibt an, dass die Exten­si­on sich auf das Fea­ture Search Exten­si­bi­li­ty bezieht. Die­se ID soll­te nicht ver­än­dert wer­den. Tas­kID gibt an, was pas­sie­ren soll, wenn die Erwei­te­rung auf­ge­ru­fen wird. Extra­Fi­le sagt der App, wo die wei­te­ren Daten zur Unter­stüt­zung der Sucherwei­te­run­gen lie­gen. Dies muss auf Extensions/Extras.xml ver­wei­sen. Andern­falls wird App Con­nect nicht funk­tio­nie­ren.

Kon­fi­gu­ra­ti­on der wei­te­ren Daten für App Con­nect

Da unser Pro­jekt noch kei­ne Datei Extensions/Extras.xml ent­hält, müs­sen wir die­se zunächst erstel­len. Kli­cken Sie mit rechts auf das Pro­jekt und dann „Add > New Fol­der“. Geben Sie die­sem Ord­ner den Namen „Exten­si­ons“. Kli­cken Sie mit rechts auf den Ord­ner und dann „Add > New Item“. Wäh­len Sie XML File aus der Lis­te und nen­nen Sie die Datei Extras.xml. Der Ord­ner­na­me und der Datei­na­me müs­sen exakt so hei­ßen — andern­falls wer­den die Sucherwei­te­run­gen nicht funk­tio­nie­ren.

Sie soll­ten jetzt eine Datei Extras.xml im Ord­ner Exten­si­ons haben. Wir fügen jetzt einen Kno­ten Extras­In­fo in der XML Datei hin­zu. Durch die­sen geben wir an, wie die App sich für die regis­trier­ten Erwei­te­run­gen ver­hal­ten soll.

<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> 

Das Ele­ment App­Tit­le und die Kind­ele­men­te geben an, wie unse­re Anwen­dung hei­ßen soll (mit ver­schie­de­nen, loka­li­sier­ten Namen). Im Kno­ten default geben wir den Namen an, der ver­wen­det wer­den soll, wenn kei­ner der loka­li­sier­ten Strings passt. Die­ser soll­te dem Namen der App in der neu­tra­len Spra­che („neu­tral lan­guage“) des Assem­blies ent­spre­chen. Der Name in ande­ren Spra­chen kann durch wei­te­re Kno­ten ange­ge­ben wer­den. In unse­rem Bei­spiel geben wir bei­spiels­wei­se einen Namen für die Spra­che („lan­guage code“) es-ES (also Spa­nisch) an.

Der Kno­ten Con­su­mer ent­hält eine Con­su­me­r­ID, die der Con­su­me­r­ID ent­spricht, die wir vor­her in der Datei WMAppManifest.xml defi­niert haben. Inner­halb die­ses Kno­tens gibt es einen Kno­ten Exten­sio­nIn­fo, der wie­der­um einen Kno­ten Exten­si­ons ent­hält. Die­ser ent­hält Exten­si­onNa­me Ele­men­te für die Exten­si­ons, von denen wir gesagt haben, dass wir sie unter­stüt­zen.

Das Ele­ment Cap­ti­onS­tring defi­niert die klei­ne Nach­richt, die unter dem Titel der Sucherwei­te­rung ange­zeigt wird. Sie kann auf die sel­be Wei­se loka­li­siert wer­den wie das Ele­ment App­Tit­le. Ein Bei­spiel, wie die­se Anwen­dung als Sucherwei­te­rung aus­sieht, sehen Sie im fol­gen­den Screen­shot:

Beach­ten Sie, dass das Anwen­dungs­sym­bol hier ver­wen­det wird, und dass der Hin­ter­grund hell oder dun­kel sein kann. Sie soll­ten also kei­ne trans­pa­ren­ten Icons ver­wen­den, wenn Sie Ihre App an App Con­nect ange­bun­den haben. Wei­ter­hin hat die Pivot Sei­te für App Con­nect im Emu­la­tor den Titel „extras“ wäh­rend er auf einem ech­ten Gerät „apps“ (bei uns „Anwen­dun­gen“) heißt.

Wenn Sie für unter­schied­li­che Typen von Pro­duk­ten unter­schied­li­che Tex­te anzei­gen wol­len, kön­nen Sie das tun, indem Sie meh­re­re Ele­men­te Exten­sio­nIn­fo dekla­rie­ren und jeweils unter­schied­li­che Exten­si­onNa­me Ele­men­te ver­wen­den. Dabei muss zu jedem unter­stütz­ten Exten­si­onNa­me ein pas­sen­des Exten­sio­nIn­fo vor­han­den sein.

URI Map­ping ein­rich­ten

Wenn ein Anwen­der die App über App Con­nect star­tet, wird die Lauf­zeit­um­ge­bung ver­su­chen, zu einer Sei­te /SearchExtras zu navi­gie­ren. Um die­sen Ein­stiegs­punkt zu unter­stüt­zen, müs­sen wir eine Abbil­dung der URIs ein­rich­ten, die die Navi­ga­ti­on auf die rich­ti­ge Sei­te umlei­tet. Wir defi­nie­ren hier­zu eine Resour­ce Uri­Map­per in den Resour­cen der App in der Datei App.xaml. Wir fügen die fol­gen­de Resour­ce hin­zu:

<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> 

Nur die Resour­ce zu defi­nie­ren ist aber nicht genug. Wir müs­sen der App noch mit­tei­len, wo sie den Uri­Map­per fin­det, den sie zur Auf­lö­sung von Anfra­gen ver­wen­den soll. Wir machen das, indem wir im Kon­struk­tur in App.xaml.cs fol­gen­den Code hin­zu­fü­gen:

// Enable URI mapping for Search Extras deep link URIs

RootFrame.UriMapper = Resources["UriMapper"] as UriMapper; 

Jetzt wer­den alle über App Con­nect ankom­men­den Auf­ru­fe kor­rekt an die Main­Page umge­lei­tet. Wenn wir woll­ten, könn­ten wir in der Eigen­schaft Map­pe­dU­ri eine spe­zi­el­le Detail­sei­te ange­ben, die nur beim Auf­ruf über App Con­nect sicht­bar wird. Für unser Bei­spiel reicht es aber, auf die Main­Page zu lei­ten.

App Con­nect in der App inte­grie­ren

Wenn Sie Ihre Anwen­dung jetzt im Emu­la­tor star­ten, dann zur Bing Suche wech­seln, indem Sie den Suche But­ton drü­cken, soll­ten Sie Ihre Anwen­dung auf der „extras“ Pivot Sei­te einer Quick Card für Pro­duk­te sehen — vor­aus­ge­setzt, Sie haben Ihre App für Pro­duk­te regis­triert. Wie oben erwähnt, wer­den die ein­zel­nen, detail­lier­te­ren Kate­go­ri­en im Emu­la­tor nicht funk­tio­nie­ren. Umge­kehrt wird eine App auf einem ech­ten Gerät nicht ange­zeigt, wenn sie nur die zu all­ge­mei­ne Kate­go­rie „pro­duc­ts“ unter­stützt.

Unglück­li­cher­wei­se macht unse­re Anwen­dung noch nichts mit den Daten, die sie von App Con­nect bekommt. Wir begin­nen mal wie­der mit der Defi­ni­ti­on einer Benut­zer­schnitt­stel­le. Wech­seln Sie zur MainPage.xaml und erset­zen Sie das Grid mit dem Namen Lay­ou­tRoot (und alle sei­ne Kin­der) durch den fol­gen­den Code:

<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> 

Damit haben wir eine Benut­zer­schnitt­stel­le, die sowohl als eigen­stän­di­ge App (also wenn sie nor­mal auf­ge­ru­fen wird) als auch als Detail­sei­te funk­tio­nie­ren wird (wenn sie per App Con­nect auf­ge­ru­fen wird). Stan­dard­mäßg sieht unse­re Anwen­dung so aus:

Que­ry Para­me­ter ver­ar­bei­ten

Wenn die Anwen­dung von einer Quick Card über App Con­nect auf­ge­ru­fen wur­de, wol­len wir die Infor­ma­tio­nen von App Con­nect natür­lich nut­zen. Hier­für ent­hält der Navi­ga­ti­ons­kon­text zwei Que­ry String Para­me­ter, die uns wesent­li­che Infor­ma­tio­nen über die auf­ru­fen­de Quick Card mit­tei­len. Das Que­ry String Argu­ment Pro­duc­t­Na­me ent­hält den Namen des Pro­dukts, das der Anwen­der auf der Quick Card gera­de betrach­tet hat und das Argu­ment Cate­go­ry ent­hält den Exten­si­onNa­me der Quick Card.

Es ist wich­tig, das Laden der Sei­te abzu­war­ten, bevor man die Que­ry String Para­me­ter abfragt. Der Navi­ga­tionCon­text wird nicht bereit sein, bevor die Sei­te kom­plett gela­den ist.

Auch wenn die über­ge­be­nen Daten nur rela­tiv grund­le­gen­de Infor­ma­tio­nen beinhal­ten, sind sie hilf­reich, um Fel­der oder Con­trols schon mal mit Wer­ten vor­zu­be­le­gen, oder für Anwen­dun­gen, die mit meh­re­ren Kate­go­ri­en von Pro­duk­ten umge­hen. Den­ken Sie wie­der dar­an, dass die Kate­go­rie im Emu­la­tor immer „Pro­duc­ts“ sein wird. Auf einem ech­ten Gerät wer­den aber die rich­ti­gen Kate­go­ri­en ver­wen­det.

In unse­rer Bei­spiel­an­wen­dung zei­gen wir den Namen des Pro­dukts auf der Sei­te an, wenn sie über App Con­nect gestar­tet wur­de. Wir las­sen die Benut­zer­schnitt­stel­le unver­än­dert, wenn die Anwen­dung nor­mal gestar­tet wur­de. Da der Ein­stieg in die Anwen­dung über die Sucherwei­te­run­gen in unse­rer Demo die sel­be Sei­te ver­wen­det wie der nor­ma­le Ein­stieg in die App, ist es wich­tig, dass wir zunächst prü­fen, ob die Que­ry String Argu­men­te über­haupt vor­han­den sind bevor wir die­se ver­wen­den.

Hier ist die über­ar­bei­te­te MainPage.xaml.cs. Die­se ent­hält jetzt die Logik zum Par­sen der Que­ry String Para­me­ter und behan­delt die Klicks auf die Hyper­links:

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();
   }
}

Wenn wir unse­re Anwen­dung jetzt über App Con­nect star­ten, sehen wir bei­spiels­wei­se das fol­gen­de:

App Instant Ans­wers unter­stüt­zen

Ein wei­te­res neu­es Man­go Fea­ture sind die App Instant Ans­wers. Die­ses ist ein auto­ma­ti­sches Fea­ture der Bing Suche, durch das Apps, die Bing als rele­vant für eine spe­zi­el­le Suche betrach­tet, oben in der Ergeb­nis­lis­te der Suche ange­zeigt wer­den. Sie müs­sen nichts machen, um den Start über Instant Ans­wers zu unter­stüt­zen. Sie soll­ten aber die Infor­ma­tio­nen nut­zen, die in die­sem Fall an die Anwen­dung über­ge­ben wer­den. Die­se wer­den in Form eines Que­ry String Para­me­ters mit dem Namen „bing_query“ über­ge­ben. Der Zugriff dar­auf erfolgt genau wie oben auf die Que­ry String Para­me­ter Pro­duc­t­Na­me und Cate­go­ry.

Die Anwen­dung zur Nut­zung von App Instant Ans­wers zu erwei­tern ist also sehr ein­fach. Im fol­gen­den Code­bei­spiel habe ich die obe­re Hälf­te der Metho­de Hand­leL­oa­ded über­ar­bei­tet:

// 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";
} 

Mit die­ser Modi­fi­ka­ti­on kann die Anwen­dung den Namen des Buchs ent­we­der aus dem von einer Quick Card über­ge­be­nen Pro­duc­t­Tit­le oder aus der über Instant Ans­wers über­ge­be­nen Bing Such­an­fra­ge aus­le­sen. Das Bild unten illus­triert den Ein­stieg in die App über Instant Ans­wers wenn der Such­be­griff „Sphe­re by Micha­el Crich­ton“ war.

App Con­nect tes­ten

Sie wer­den sich viel­leicht fra­gen, wie man App Con­nect tes­ten kann oder wie man den Debug­ger mit den Sucherwei­te­run­gen ver­wen­den kann. Das ist in der Tat eine gute Fra­ge, da es momen­tan ers­tens kei­ne Mög­lich­keit gibt, die Bing Such­ergeb­nis­se zu mani­pu­lie­ren und da zwei­tens die Kate­go­rie im Emu­la­tor nicht die sel­be ist wie auf einem tat­säch­li­chen Gerät. Wei­ter­hin kann es auf Dau­er läs­tig wer­den, immer erst zu Bing zu navi­gie­ren, einen Such­be­griff ein­zu­ge­ben um dann die Anwen­dung über App Con­nect zu star­ten. Zum Glück kann man den Auf­ruf über die Sucherwei­te­run­gen oder über Instant Ans­wers recht leicht simu­lie­ren.

Wir wis­sen, wel­che Que­ry String Para­me­ter im Fal­le des Auf­rufs aus einer Quick Card über­ge­ben wer­den. Wir kön­nen uns die­ses Wis­sen zunut­ze machen, indem wir die ent­spre­chen­den Wer­te zum Tes­ten im Ein­stiegs­punkt der App hart kodie­ren. Die Adres­se der Ein­stiegs­sei­te einer Win­dows Pho­ne Anwen­dung wird in der Datei WMAppManifest.xml defi­niert. Öff­nen Sie die Datei und suchen Sie nach dem Ele­ment Default­Task in der Tasks Collec­tion. Die­ses soll­te etwa so aus­se­hen:

<DefaultTask Name ="_default" NavigationPage="MainPage.xaml"/>

Die­ses Ele­ment legt fest, wohin die Anwen­dung beim Start navi­gie­ren soll. Sie kön­nen hier ange­ben, was Sie wol­len. Ins­be­son­de­re kön­nen wir das Ele­ment so ver­än­dern, dass es den Auf­ruf über die Sucherwei­te­run­gen oder über Instant Ans­wers simu­liert, indem wir die ent­spre­chen­den Que­ry String Para­me­ter ange­ben. Den fol­gen­den Code habe ich bei­spiels­wei­se benutzt, um den Auf­ruf über Instant Ans­wers aus dem obi­gen Screen­shot zu simu­lie­ren:

<DefaultTask Name ="_default" NavigationPage="MainPage.xaml?bing_query=Sphere by Michael Crichton"/>

Die Ände­run­gen zur Simu­la­ti­on eines Auf­rufs über die Sucherwei­te­run­gen sind sehr ähn­lich. Da wir in die­sem Fall zwei Que­ry String Para­me­ter haben, müs­sen wir das tren­nen­de & mit &amp; mas­kie­ren:

<DefaultTask Name ="_default" NavigationPage="MainPage.xaml?Category=Bing_Products_Books_and_Magazines&amp;ProductName=Sphere"/>

Natür­lich soll­ten Sie nicht ver­ges­sen, die hard­ko­dier­ten Que­ry String Para­me­ter nach dem Tes­ten und vor der Ver­öf­fent­li­chung wie­der zu ent­fer­nen, damit der Default­Task wie­der so funk­tio­niert wie er soll.

Wenn Sie die Datei WMAppManifest.xml bear­bei­ten, kann es manch­mal zu Feh­lern bei der Instal­la­ti­on der Anwen­dung im Emu­la­tor kom­men. Wenn die Instal­la­ti­on im Emu­la­tor mit der Nach­richt „Instal­la­ti­on of the app­li­ca­ti­on fai­led. Run time error has occur­red. Fix the Capa­bi­li­ties in WMAppManifest.xml file.“ fehl­schlägt, der Abschnitt Capa­bi­li­ties aber in Ord­nung ist, bau­en Sie die Anwen­dung ein­fach neu und pro­bie­ren es noch ein­mal.

Zusammenfassung

Damit sind wir am Ende unse­res Arti­kels zu App Con­nect und Instant Ans­wers — zwei ein­fa­chen Mög­lich­kei­ten, Ihre Anwen­dung mit der Bing Such­ma­schi­ne in Win­dows Pho­ne Man­go zu inte­grie­ren.

Um eine kom­plet­te Solu­ti­on mit dem Code die­ses Arti­kels her­un­ter­zu­la­den, kli­cken Sie auf den Down­load Code But­ton unten:

Mor­gen kommt Sami­dip Basu zurück und wird uns das Aus­füh­rungs­mo­dell von Win­dows Pho­ne näher­brin­gen. Er wird dabei auf Fast App Swit­ching und Tomb­s­to­ning (wel­ches bereits hier behan­delt wur­de: Day #14 of 31 Days of Win­dows Pho­ne) und auf die Ände­run­gen seit Win­dows Pho­ne 7.5 ein­ge­hen.

Bis dahin!

Kommentare sind geschlossen.