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

31 Tage Mango | Tag #11: Live Tiles

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

Der Ori­gi­nal­ar­ti­kel befin­det sich hier: Day #11: Live Tiles.

Heu­te beschäf­ti­gen wir uns mit Live Tiles für Win­dows Pho­ne. Das ist ein ver­gleichs­wei­se umfang­rei­ches The­ma — mög­li­cher­wei­se aber auch eines der wich­tigs­ten der gan­zen Serie. Auf zwei Punk­te möch­te ich heu­te beson­ders ein­ge­hen: wie man die Haupt­ka­chel der Anwen­dung („Pri­ma­ry Tile“) aktua­li­siert und wie man wei­te­re, zusätz­li­che Kacheln erstellt („Secon­da­ry Live Tiles“).

Was sind Live Tiles?

Falls Sie nicht sel­ber ein Win­dows Pho­ne besit­zen, wis­sen Sie mög­li­cher­wei­se nicht, was für ein wesent­li­cher (und coo­ler) Bestand­teil des Betriebs­sys­tems die Live Tiles sind. Begin­nen wir des­halb mit einem klei­nen Video mei­nes Start­bild­schirms:

Um einer mög­li­chen Ent­täu­schung gleich vor­zu­beu­gen: wir wer­den in die­sem Arti­kel kei­ne Live Tiles erstel­len, die so leben­dig und ani­miert aus­se­hen wie in dem Video (wir kön­nen der­zeit kei­ne ani­mier­ten Kacheln erstel­len, abge­se­hen von den dre­hen­den mit einer Rück­sei­te). Wir wer­den unse­ren Anwen­dern aber neue Infor­ma­tio­nen prä­sen­tie­ren indem wir den Inhalt unse­rer Kachel aus der App aktua­li­sie­ren. Dafür haben wir zwei Mög­lich­kei­ten: wir kön­nen die Stan­dard­wer­te eines Live Tiles ver­än­dern oder wir kön­nen gleich den gan­zen Hin­ter­grund einer Kachel aus­tau­schen. Mit der zwei­ten Vari­an­te sind unse­rer gestal­te­ri­schen Frei­heit kei­ne Gren­zen gesetzt.

Ein ent­schei­den­der Punkt bevor wir anfan­gen ist: die Live Tiles befin­den sich auf den Start­bild­schirm des Tele­fons und der Anwen­der ent­schei­det frei, wel­che Kacheln er ger­ne auf dem Start­bild­schirm sieht. Wenn Sie also Live Tiles ver­wen­den, las­sen Sie den Anwen­der wis­sen, dass er die Kachel auf den Start­bild­schirm pin­nen soll­te. Ansons­ten wer­den die Anwen­der mög­li­cher­wei­se nichts von Ihren Bemü­hun­gen haben.

Der Standard Tile Ihrer Anwendung

Sobald Sie eine Anwen­dung beim Mar­ket­place ein­rei­chen, haben Sie bereits Ihre ers­te Kachel erstellt. Die Daten dafür befin­den sich in der Datei WPAppManifest.xml, wel­che im Ord­ner Pro­per­ties eines jeden Win­dows Pho­ne Pro­jekts liegt. Auf zwei Stel­len in die­ser Datei möch­te ich Sie beson­ders hin­wei­sen: Die ers­te ist der App Tit­le. Er hat nicht unmit­tel­bar mit die­sem Arti­kel zu tun, ist aber ein wich­ti­ges The­ma, das Sie im Auge behal­ten soll­ten. Wenn Sie die XML Datei öff­nen, wer­den Sie eine Zei­le wie die fol­gen­de fin­den (nor­ma­ler­wei­se die 4. Zei­le):

<App xmlns="" ProductID="{1009dd75-9bef-4b08-9d0a-7518dafd777a}" Title="Day #11 - Live Tiles" RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal"Author="Jeff Blankenburg" Description="Sample description" Publisher="Jeff Blankenburg">

Die wich­tigs­te Stel­le hier ist die Eigen­schaft Tit­le. Wie im Bild unten zu erken­nen, bestimmt der Text hier, was die Anwen­der sehen wenn sie die Lis­te der Anwen­dun­gen durch­se­hen.

Der ande­re wich­ti­ge Teil befin­det sich ziem­lich am Ende der XML Datei (nor­ma­ler­wei­se Zei­le 25) im Kno­ten <Tokens>. Der <Pri­ma­ry­To­ken> unse­rer heu­ti­gen Anwen­dung sieht bei­spiels­wei­se so aus:

<Tokens>
  <PrimaryToken TokenID="Day11_LiveTilesToken" TaskName="_default">
    <TemplateType5>
      <BackgroundImageURI IsRelative="true" IsResource="false">Background.png</BackgroundImageURI>
      <Count>20</Count>
      <Title>Jeff Blankenburg</Title>
    </TemplateType5>
  </PrimaryToken>
</Tokens> 

Die ent­schei­den­den Wer­te hier sind Back­groundI­ma­geU­RI, Count und Tit­le. Das sind die Eigen­schaf­ten, die wir im Lau­fe die­ses Arti­kels mani­pu­lie­ren wer­den und im Kno­ten <Tokens> in der Datei WMAppManifest.xml kön­nen Sie die Start­wer­te fest­le­gen (ich ver­wen­de hier die Background.png aus der Pro­jekt­vor­la­ge. Wenn Sie die Anwen­dung beim Win­dows Pho­ne Mar­ket­place ein­rei­chen wol­len, kön­nen Sie die­ses Stan­dard­sym­bol nicht ver­wen­den — Ihre Anwen­dung wür­de abge­lehnt wer­den).

Mit den Wer­ten von oben hät­ten wir fol­gen­de Kachel erstellt:

Wie Sie sehen, wird die Eigen­schaft Count als klei­ner, schwar­zer Kreis mit wei­ßer Schrift dar­ge­stellt. Der Wert der Eigen­schaft Tit­le wird auf dem Tile unten mit wei­ßer Schrift dar­ge­stellt. Die Far­ben, Grö­ßen und das Lay­out ändert sich nicht — auch nicht, wenn der Anwen­der die Farb­ein­stel­lun­gen sei­nes Han­dys umstellt. Die Eigen­schaft Back­groundI­ma­geU­RI nutzt ein Bild, um den Hin­ter­grund der Kachel auf der gan­zen Flä­che aus­zu­fül­len. Wenn die Bild­da­tei nicht die Abmes­sun­gen 173x173 Pixel hat, wird sie ent­spre­chend gestreckt. Ich emp­feh­le also drin­gend, ein Bild in den Abmes­sun­gen 173x173 Pixel zu ver­wen­den.

Jetzt, wo wir die anfäng­li­che Kachel für unse­re Anwen­dung erstellt haben, kön­nen wir uns im Rest des Arti­kels damit beschäf­ti­gen, wie wir die Inhal­te der Kacheln dyna­misch ver­än­dern (ja, Kacheln sind hier absicht­lich im Plu­ral).

Den Standard Tile aktualisieren

Wie zu Beginn erwähnt, kön­nen Sie sowohl den Inhalt des Stan­dard Tiles ver­än­dern als auch wei­te­re („Secon­da­ry“) Tiles erstel­len und ver­än­dern. In die­sem Abschnitt wol­len wir uns zunächst mit dem Stan­dard Tile beschäf­ti­gen. Die Secon­da­ry Tiles fol­gen im zwei­ten Teil des Arti­kels. Es gibt vie­le ver­schie­de­ne Mög­lich­kei­ten zur Aktua­li­sie­rung des Live Tiles. Damit Sie einen Ein­druck bekom­men, was alles mög­lich ist, begin­ne ich wie­der mit einem klei­nen Video unse­rer fer­ti­gen Anwen­dung.

Zunächst müs­sen wir wie­der eine Ober­flä­che bau­en. Dafür brau­chen wir die Icons für den Smi­ley und das trau­ri­ge Gesicht. Sie kön­nen die bei­den Sym­bo­le hier in der pas­sen­den Grö­ße her­un­ter­la­den:

smileysadface

Bevor Sie die Sym­bo­le ver­wen­den kön­nen, müs­sen Sie die­se Ihrem Pro­jekt hin­zu­fü­gen und den Con­tent Type in den Visu­al Stu­dio Eigen­schaf­ten auf „Con­tent“ set­zen. Falls Sie das vor­her noch nicht gemacht haben: Kli­cken Sie rechts auf Ihr Pro­jekt und wäh­len „Add Exis­ting Item…“ (Anm. leit­ning: Sor­ry, ich habe sel­ber nur ein eng­li­sches Visu­al Stu­dio und weiß gera­de nicht aus­wen­dig, wie der Menü­punkt im deut­schen Visu­al Stu­dio heißt).

Sobald die Bil­der in Ihrem Pro­jekt sind, wird ein Klick auf die­se die Eigen­schaf­ten öff­nen. Hier soll­ten Sie sicher­stel­len, dass die Build Action auf „Con­tent“ anstatt „Resour­ce“ steht.

Die Bil­der sind jetzt vor­be­rei­tet. Das fol­gen­de XAML kön­nen Sie ver­wen­den, um eine Ober­flä­che wie die­se hier zu erstel­len:

Sie sehen im XAML, dass wir zwei Image Con­trols, einen Sli­der, einen Text­Block, eine Text­Box und zwei But­tons haben. Die­se Con­trols wer­den uns erlau­ben, den Live Tile anzu­pas­sen.

<phone:PhoneApplicationPage
   x:Class="Day11_LiveTiles.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
   xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
   FontFamily="{StaticResource PhoneFontFamilyNormal}"
   FontSize="{StaticResource PhoneFontSizeNormal}"
   Foreground="{StaticResource PhoneForegroundBrush}"
   SupportedOrientations="Portrait" Orientation="Portrait"
   shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="31 DAYS OF MANGO - DAY #11" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="live tiles" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <TextBlock Text="primary tile" Height="40" VerticalAlignment="Top" FontSize="26.667" />
            <Image x:Name="SadButton" Source="images/sadface.png" Width="150" Height="150" Margin="191,48,115,0" VerticalAlignment="Top" MouseLeftButtonDown="SadButton_MouseLeftButtonDown" Opacity=".5" />
            <Image x:Name="SmileButton" Source="images/smiley.png" Width="150" Height="150" HorizontalAlignment="Left" Margin="21,48,0,0" VerticalAlignment="Top" MouseLeftButtonDown="SmileButton_MouseLeftButtonDown" Opacity=".5" />
            <Slider x:Name="CountSlider" Margin="8,198,102,0" Foreground="Green" Maximum="99" ValueChanged="CountSlider_ValueChanged" Height="84" VerticalAlignment="Top"/>
            <TextBox x:Name="TitleText" Margin="8,250,102,288" TextWrapping="Wrap"/>
            <TextBlock x:Name="SliderText" HorizontalAlignment="Right" Margin="0,181,12,0" TextWrapping="Wrap" Text="0" Width="90" FontSize="64" Height="84" VerticalAlignment="Top" TextAlignment="Center"/>
            <TextBlock Text="secondary tile" Height="40" VerticalAlignment="Bottom" FontSize="26.667" Margin="0,0,0,133" />
            <Button x:Name="SecondaryButton" Content="create a secondary tile" Height="75" Margin="5,0,102,56" VerticalAlignment="Bottom" Click="SecondaryButton_Click"/>
            <Button x:Name="PrimaryButton" Content="update primary tile" Height="75" Margin="9,0,102,204" VerticalAlignment="Bottom" Click="PrimaryButton_Click"/>
        </Grid>
    </Grid>
</phone:PhoneApplicationPage> 

Abge­se­hen von den neu­en Con­trols im Con­tent­Pa­nel han­delt es sich bei dem XAML um den Stan­dard Code, den das Visu­al Stu­dio bei einem neu­en Pro­jekt für die MainPage.xaml anlegt.

Das ent­schei­den­de Stück­chen Code in die­sem Abschnitt ist jenes, wel­ches aus­ge­führt wird, wenn der Anwen­der auf den But­ton „update pri­ma­ry tile“ klickt. Der Code des Event Hand­lers PrimaryButton_Click sieht etwa so aus:

private void PrimaryButton_Click(object sender, RoutedEventArgs e)
{
   ShellTile PrimaryTile = ShellTile.ActiveTiles.First();

   if (PrimaryTile != null)
   {
      StandardTileData tile = new StandardTileData();

      tile.BackgroundImage = new Uri("images/sadface.png", UriKind.Relative);
      tile.Count = (Int32)Math.Round(CountSlider.Value, 0);
      tile.Title = TitleText.Text;
      PrimaryTile.Update(tile);
   }
} 

Wir holen uns eine Refe­renz auf den Pri­ma­ry Tile indem wir das First() Ele­ment der Active­Ti­les Collec­tion abfra­gen. Die­se Collec­tion ent­hält nicht nur den Pri­ma­ry Tile (die­ser ist aber immer der ers­te), son­dern auch alle wei­te­ren Secon­da­ry Tiles, die Sie erstellt haben.

Ich habe ein neu­es Stan­dard­Ti­le­Da­ta Objekt ange­legt und die Eigen­schaf­ten so gesetzt, dass das trau­ri­ge Gesicht als Hin­ter­grund­bild ver­wen­det wird, der Wert der Eigen­schaft Count dem Wert des Sli­ders ent­spricht und der Tit­le den Wert der Text­Box bekommt. Dann rufen wir die Metho­de Update() auf dem Shell­Ti­le Objekt des Stan­dard Tiles auf und über­ge­ben die neu­en Tile Daten. Mehr ist nicht nötig um den Tile zu aktua­li­sie­ren. Natür­lich müs­sen Sie nicht alle Eigen­schaf­ten mit Wer­ten bele­gen.

Wenn Sie eine Wet­ter-Anwen­dung ent­wi­ckeln, möch­ten Sie mög­li­cher­wei­se die aktu­el­le Tem­pe­ra­tur in der Eigen­schaft Count dar­stel­len. Die ande­ren Wer­te wür­den dann unver­än­dert blei­ben. Wo wir beim Bei­spiel der Tem­pe­ra­tur sind: Die Eigen­schaft Count hat einen Maxi­mal­wert von 99. Es gibt aber Orte mit einer höhe­ren Tem­pe­ra­tur als 99 Grad (Anm. leit­ning: Jeff bezieht sich hier auf Tem­pe­ra­tur in Grad Fah­ren­heit). Für die­se Fäl­le gibt es eine bes­se­re Lösung.

Eine ein­fa­che Vari­an­te wäre, einen Hau­fen von Bil­dern mit allen mög­li­chen Wer­ten zu erstel­len und die­se dem Pro­jekt hin­zu­zu­fü­gen. Dann könn­ten Sie ein­fach die Eigen­schaft Back­groundI­mage auf das ent­spre­chen­de Bild set­zen und hät­ten einen pas­sen­den Tem­pe­ra­tur-Tile. Mit hun­der­ten von Bil­dern wür­de die­se Lösung Ihre Anwen­dung ziem­lich auf­blä­hen.

Zum Glück kön­nen wir auch Bil­der ver­wen­den, die auf einem Web­ser­ver lie­gen. In die­sem Fall geben wir für die Eigen­schaft Back­groundI­mage ein­fach die URI zum ent­spre­chen­den Bild an, wie im fol­gen­den Bei­spiel zu sehen:

tile.BackgroundImage = new Uri("http://jeffblankenburg.com/images/jeff.png"); 

Ich habe das mit unter­schied­li­chen Bild­for­ma­ten aus­pro­biert und es scheint nur mit PNG Bil­dern zu funk­tio­nie­ren. Das soll­ten Sie im Hin­ter­kopf behal­ten, wenn Sie die­se Tech­nik ver­wen­den wol­len. Wenn Sie eine end­li­che Anzahl von Bil­dern haben, ist die Abla­ge auf einem Web­ser­ver eine her­vor­ra­gen­de Mög­lich­keit, dem Anwen­der abhän­gig von den Bedin­gun­gen eine pas­sen­de Kachel anzu­zei­gen — wie in unse­rem Fall zum Bei­spiel 27 Grad und wol­kig.

Einen Secondary Tile erstellen

Bis­her haben wir uns nur mit der Haupt­ka­chel der Anwen­dung beschäf­tigt. Wen­den wir uns den Secon­da­ry Tiles zu. Dies sind wei­te­re Kacheln, die Ihr Benut­zer aus der Anwen­dung her­aus auf die Start­sei­te pin­nen kann.

Als Bei­spiel stel­len Sie sich eine Anwen­dung vor, die ver­schie­de­ne Spie­le beinhal­tet. Sie kön­nen mit der Anwen­dung z.B. Tic Tac Toe, Wör­ter raten und Hang­man spie­len. Nor­ma­ler­wei­se müss­te Ihr Anwen­der die Anwen­dung aus der Anwen­dungs­lis­te öff­nen, das Spiel wäh­len um die­ses dann schließ­lich zu spie­len. Mit Secon­da­ry Tiles kön­nen Sie Ihrem Anwen­der erlau­ben, sepa­ra­te Tiles für jedes Spiel zu erstel­len, so dass sie z.B. Hang­man direkt von ihrer Start­sei­te aus spie­len kön­nen. Mit dem Secon­da­ry Tile haben Sie dem Anwen­der eine Abkür­zung in einen bestimm­ten Lieb­lings­be­reich der Anwen­dung gebaut.

Um einen Secon­da­ry Tile anzu­le­gen, brau­chen wir fast den sel­ben Code wie beim Pri­ma­ry Tile. Es gibt nur eini­ge klei­ne Unter­schie­de. Ers­tens: der ent­spre­chen­de Secon­da­ry Tile kann aber muss nicht da sein, wenn Sie nach ihm suchen (der Pri­ma­ry Tile ist auch dann in der Collec­tion, wenn die Anwen­dung nicht auf die Start­sei­te gepinnt ist). Ein Secon­da­ry Tile ver­schwin­det aus der Collec­tion, wenn der Anwen­der die­sen von der Start­sei­te ent­fernt.

Die Event Hand­ler Metho­de SecondaryButton_Click, die wir im obi­gen XAML bereits regis­triert hat­t­ten, fin­det sich im fol­gen­den Code­bei­spiel:

private void SecondaryButton_Click(object sender, RoutedEventArgs e)
{
   ShellTile SecondaryTile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("ID=2"));

   StandardTileData tile = new StandardTileData();
            
   if (SecondaryTile == null)
   {
      tile.BackgroundImage = new Uri("images/yoda.png", UriKind.Relative);
      tile.Title = "Beware...";
      tile.BackTitle = "The Dark Side";
      tile.BackBackgroundImage = new Uri("images/darthvader.png", UriKind.Relative);
      tile.BackContent = "I...am your father.";

      ShellTile.Create(new Uri("/DeepLink.xaml?ID=2", UriKind.Relative), tile);
   }
}

Wie Sie im Bei­spiel sehen, ver­wen­de ich etwas LINQ, um den gewünsch­ten Live Tile zu fin­den. Ich suche in der Active­Ti­les Collec­tion nach einem Tile, des­sen Navi­ga­ti­o­nUri „ID=2“ ent­hält. Ich erklä­re das am bes­ten vom Ende her.

Wenn Sie einen Secon­da­ry Tile erstel­len, rufen Sie die Metho­de ShellTile.Create() auf. Die­ser über­ge­ben Sie eine URI und ein zuvor erstell­tes Stan­dard­Ti­le­Da­ta Objekt. Die URI zeigt auf eine bestimm­te Sei­te inner­halb Ihrer Anwen­dung und es kann nicht zwei Secon­da­ry Tiles geben, die die sel­be URI haben. Die URI ist somit ein ein­deu­ti­ger Iden­ti­fi­ka­tor für den Secon­da­ry Tile. Des­halb kön­nen wir oben die Collec­tion per LINQ nach der ent­spre­chen­den URI durch­su­chen. Soll­ten meh­re­re Secon­da­ry Tiles auf die sel­be Sei­te inner­halb Ihrer Anwen­dung zei­gen aber dort unter­schied­li­che Daten anzei­gen, kön­nen Sie Que­ry String Varia­blen mit über­ge­ben um die URI ein­deu­tig zu machen. Die Suche nach einem bestimm­ten Tile zielt dann nicht auf den Sei­ten­na­men, son­dern auf den Que­ry String, wie in unse­rem Bei­spiel oben.

Wenn die Suche den ent­spre­chen­den Tile nicht in der Collec­tion gefun­den hat, kön­nen wir ihn wie im obi­gen Bei­spiel neu anle­gen. Wie Sie sehen, han­delt es sich um das sel­be Stan­dard­Ti­le­Da­ta Objekt wie oben, nur dass wir dies­mal drei wei­te­re Eigen­schaf­ten set­zen (die drei wei­te­ren Eigen­schaf­ten kön­nen Sie auch für den Pri­ma­ry Tile set­zen — ich woll­te das nur für etwas spä­ter im Arti­kel auf­spa­ren).

Um zu zei­gen, was die drei neu­en Eigen­schaf­ten machen, folgt hier wie­der ein klei­nes Video:

Sobald Sie eine der Eigen­schaf­ten Back­Tit­le, Back­Back­groundI­mage oder Back­Con­tent set­zen, wird Ihr Tile auto­ma­tisch umdre­hen. Das Betriebs­sys­tem bestimmt, wann der Tile umdreht. Sie kön­nen nur fest­le­gen, dass er sich umdre­hen soll. Die Rück­sei­te der Kachel hat übri­gens kei­ne Eigen­schaft Count. Die Vor­der­sei­te hat dafür kei­ne Eigen­schaft Con­tent (für den grö­ßer auf der Rück­sei­te dar­ge­stell­ten Text). Hier sind zwei Screen­shots mit der Vor­der- und der Rück­sei­te unse­rer Kachel:

imageimage

Sie kön­nen Ihrem Anwen­der erlau­ben, belie­big vie­le Secon­da­ry Tiles zu erstel­len. Wich­tig dabei ist nur fol­gen­des:

  • Jeder Live Tile muss auf eine ein­deu­ti­ge URI ver­wei­sen.
  • Jedes Mal, wenn Sie einen neu­en Tile erstel­len, wird der Anwen­der zur Start­sei­te wech­seln um den neu­en Tile zu sehen. Sie kön­nen nicht meh­re­re Secon­da­ry Tiles auf ein­mal erstel­len.
  • Alle Eigen­schaf­ten in den obi­gen Code­bei­spie­len fun­tio­nie­ren sowohl für den Pri­ma­ry Tile als auch für die Secon­da­ry Tiles.
  • Es ist nicht immer eine gute Idee, die Start­sei­te des Anwen­ders mit Live Tiles voll­zu­pflas­tern. Erstel­len Sie kei­nen Secon­da­ry Tile, wenn es nicht einen guten Grund dafür gibt. Die Anwen­der könn­ten sonst schnell genervt sein.

Zusammenfassung

Das Video in die­sem Arti­kel soll­te ganz gut illus­triert haben, wie sich die Live Tiles einer Anwen­dung ver­hal­ten. Sie sind ein sehr wich­ti­ges Mit­tel bei der Inter­ak­ti­on mit dem Anwen­der. Wenn Sie dem Anwen­der rele­van­te Infor­ma­tio­nen auf der Start­sei­te anzei­gen, wer­den die­se nicht nur erin­nert, Ihre Anwen­dung zu benut­zen, sie sind auch in der Lage, alle wich­ti­gen Infor­ma­tio­nen direkt auf der Start­sei­te im Über­blick zu haben.

Wenn Sie mit der voll funk­ti­ons­fä­hi­gen Anwen­dung die­ses Arti­kels her­um­ex­pe­ri­men­tie­ren möch­ten, kli­cken Sie auf den Down­load Code But­ton.

Mor­gen unter­hal­ten wir uns über ein sehr wich­ti­ges The­ma für eine erfolg­rei­che Anwen­dung: Beta Tes­ting. Mein Gast­au­tor Jared Bienz wird Ihnen genau zei­gen, wie Sie Ihre Anwen­dung beta-tes­ten kön­nen und wie die­se davon pro­fi­tie­ren wird.

Bis dahin!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert