0
votes

I'm having problems to get my Windows Phone 8.1 live tile update by itself daily (around 7am)

My project has 2 parts :

  • a Web API project hosted on Azure that provides the tile template in XML (that part works fine)
  • a Windows Phone 8.1 project with a single MainPage.xaml where I build 2 square/wide tiles

When I pin my app to the start screen from the app list, my tile (whether I choose the square or wide format) flips back and forth between my 2 brands of the day just fine. The next morning at 7:15 am, the tile won't update with the 2 new brands :(

I noticed that if I tap the tile to launch the app and come back to the start screen, the tile has updated. It also works if I unpin and repin the tile but in both cases, that's "cheating" :-/

I call my Azure website like this to get the tile templates of both brands : http://example.azurewebsites.net/api/tiles/0 (BRAND1)

http://example.azurewebsites.net/api/tiles/1 (BRAND2)

The XML tile template looks like this (example):

<tile>
    <visual>
        <binding template="TileWide310x150ImageAndText01">
            <image id="1" src="http://www.example.com/sales/BRAND1/visualWide.png"/>
            <text id="1">Brand 1</text>
        </binding>
        <binding template="TileSquare150x150PeekImageAndText04">
          <image id="1" src="http://www.example.com/sales/BRAND1/visualSquare.png"/>
          <text id="1">Brand 1</text>
        </binding>
    </visual>
 </tile>

The WP8.1 page contains this :

public MainPage()
{
    this.InitializeComponent();

    this.NavigationCacheMode = NavigationCacheMode.Required;

    TileUpdateManager.CreateTileUpdaterForApplication().EnableNotificationQueue(true);
    PeriodicUpdateRecurrence recurrence = PeriodicUpdateRecurrence.Daily;

    Task<string> responseBody;

    for (int i = 0; i < 2; i++)
    {
    using (var httpClient = new HttpClient())
    {
        httpClient.BaseAddress = new Uri("http://xxxxx.azurewebsites.net/api/tiles/" + i); //I hid the address here for discretion
        HttpResponseMessage response = httpClient.GetAsync(httpClient.BaseAddress).Result;
        string statusCode = response.StatusCode.ToString();
        response.EnsureSuccessStatusCode();
        responseBody = response.Content.ReadAsStringAsync();
    }

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(responseBody.Result);

    string srcWide, srcSquare, textWide, textSquare, templateWide, templateSquare;

    XElement root = XElement.Parse(responseBody.Result);

    IEnumerable<XElement> wideElement = root.Descendants("binding").Where(a => a.Attribute("template").Value.ToLower().Contains("wide"));
    IEnumerable<XElement> squareElement = root.Descendants("binding").Where(a => a.Attribute("template").Value.ToLower().Contains("square"));

    templateWide = wideElement.Attributes("template").SingleOrDefault().Value;
    srcWide = wideElement.Descendants("image").Attributes("src").SingleOrDefault().Value;
    textWide = wideElement.Descendants("text").SingleOrDefault().Value;

    templateSquare = squareElement.Attributes("template").SingleOrDefault().Value;
    srcSquare = wideElement.Descendants("image").Attributes("src").SingleOrDefault().Value;
    textSquare = wideElement.Descendants("text").SingleOrDefault().Value;

    XmlDocument wideTileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWide310x150ImageAndText01);
    XmlNodeList wideTileTextAttributes = wideTileXml.GetElementsByTagName("text");
    wideTileTextAttributes[0].InnerText = textWide;
    XmlNodeList wideTileImageAttributes = wideTileXml.GetElementsByTagName("image");
    ((XmlElement)wideTileImageAttributes[0]).SetAttribute("src", srcWide);
    ((XmlElement)wideTileImageAttributes[0]).SetAttribute("alt", textWide);

    XmlDocument squareTileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquare150x150PeekImageAndText01);
    XmlNodeList squareTileTextAttributes = squareTileXml.GetElementsByTagName("text");
    squareTileTextAttributes[0].AppendChild(squareTileXml.CreateTextNode(textSquare));
    XmlNodeList squareTileImageAttributes = squareTileXml.GetElementsByTagName("image");
    ((XmlElement)squareTileImageAttributes[0]).SetAttribute("src", srcSquare);
    ((XmlElement)squareTileImageAttributes[0]).SetAttribute("alt", textSquare);


    IXmlNode node = wideTileXml.ImportNode(squareTileXml.GetElementsByTagName("binding").Item(0), true);
    wideTileXml.GetElementsByTagName("visual").Item(0).AppendChild(node);

    TileNotification tileNotification = new TileNotification(wideTileXml);
    tileNotification.ExpirationTime = DateTimeOffset.UtcNow.AddDays(1).AddHours(7).AddMinutes(0);
    TileUpdateManager.CreateTileUpdaterForApplication().Update(tileNotification);
    }

    List<Uri> urisToPoll = new List<Uri>(5);
    urisToPoll.Add(new Uri("http://example.azurewebsites.net/api/tiles/0")); //fake url
    urisToPoll.Add(new Uri("http://example.azurewebsites.net/api/tiles/1")); //fake url

    //I want the tile to update its content every day at 7:15am
    //(the Azure website supposedly returns new brands of the day at 7am)
    DateTime dtTomorrow7 = DateTime.SpecifyKind(DateTime.Today.AddDays(1).AddHours(7).AddMinutes(15), DateTimeKind.Local);
    DateTimeOffset dtoTomorrow7 = dtTomorrow7;
    TileUpdateManager.CreateTileUpdaterForApplication().StartPeriodicUpdateBatch(urisToPoll, dtoTomorrow7, recurrence);
}

I'm not sure I'm using the StartPeriodicUpdateBatch method correctly. In debug mode,I can see the DateTimeOffset value is Day+1 7:15am +2:00 which looks correct but the tile does not update. I live in France that is UTC+2 Thanks for your suggestions.

1

1 Answers

0
votes

Your dtTomorrow7 is incorrect. It should just be 7:15 AM. Then it will first do an update at 7:15 AM and subsequent updates occurring at the periodic interval thereafter(you set it to daily).

Example of start time where the last TimeSpan is offset from UTC:

    DateTime tomorrow = DateTime.Today.AddDays(1);
    var startTime = new DateTimeOffset(tomorrow.Year, tomorrow.Month, tomorrow.Day, 7, 15, 0, TimeSpan.FromHours(2));