do more with less
news, esperienze, esempi da condividere e qualcosa su di me

domenica 7 aprile 2013

Attenzione all’encoding nelle Tile Periodic Notification

Se vi trovate a implementare le Periodic Notification in una Windows Store App fate attenzione all’encoding dell’aggiornamento della tile che inviate al client. Questo tipo di notifiche vengono sollecitate dal client, la vostra Windows Store App, chiamando un indirizzo web (Url) predeterminato in cui avete implementato un metodo in grado di restituire un xml che rispetti lo schema previsto per quel tipo di contenuto.  Nel mio caso il metodo del servizio sfruttava una classe di utility creata in precedenza per gestire la creazione dei contenuti di una Tile da inviare tramite le notifiche (Push o Periodic). L’output del metodo è una stringa xml il cui encoding, questo l’ho scoperto dopo molte ore di debugging, è UTF-16 mentre l’encoding richiesto dalle tile è UTF-8. Purtroppo ho verificato questo solo come “ultima spiaggia” viziato dal fatto che quel metodo è in produzione per le notifiche Push da circa 6 mesi e non ha mai mancato alla sua funzione permettendoci di inviare notifiche Push per le Tile con successo. Evidentemente, visto che le notifiche push transitano tramite il WNS di Microsoft, li veniva garantita l’uscita in UTF-8 verso le tile del client.

Comunque, ecco come ho risolto il problema per ora (non è la soluzione migliore ma è quella che mi ha permesso di andare in produzione con la funzionalità) in attesa di migliorare la classe di utilità garantendomi così il giusto output per ogni tipologia di contenuto (tile, badge, toast e raw notification).

   1: [...]
   2:  
   3: //Creazione contenuto per la notifica
   4: xml = this.CreateTileWideImage(content.WideImageUrl, content.SquareImageUrl, content.Title);
   5:  
   6: //Encoding in UTF-8        
   7: byte[] encodedString = Encoding.UTF8.GetBytes(xml);
   8: MemoryStream ms = new MemoryStream(encodedString);
   9: ms.Flush();
  10: ms.Position = 0;
  11:  
  12: //Predisposizione dell'XElement da restituire al chiamante
  13: XElement element = XElement.Load(ms);
  14: return element;
  15:  
  16: [...]