giovedì 5 maggio 2011

Come fare se avete perso la Private Key del vostro Distribuition Certificate


Durante la creazione del certificato per poter pubblicare e testare le app sul vostro iphone / ipad viene fornita una chiave privata. La potete trovare nell'utility "Accesso Portachiavi" del vostro Mac.
E' possibile salvarla, basta selezionare il certificato, poi si seleziona la chiave privata corrispondente, click dx e poi "Esporta..". Sarà creato un file con estensione ".p12", salvatelo su un qualche supporto esterno.

Se perdete per caso(!!!) i dati sul vostro Mac, potete sempre scaricarvi di nuovo il certificato dal vostro account e recuperare la vostra chiave privata. Se invece non avete salvato la chiave, non vi rimane che ricreare un nuovo certificato.

La creazione di un nuovo certificato prevede l'eliminazione di quello precedente. Le app che sono già state pubblicate su AppStore con il vecchio certificato non subiranno conseguenze, mentre le app che devono essere ancora approvate probabilmente dovranno essere firmate con il nuovo certificato.

domenica 13 marzo 2011

DefferedLoadListBox

David Anson ha pubblicate le ultime versioni aggiornate del  LowProfileImageLoader e del controllo DeferredLoadListBox, scaricatele da qui .
Per una descrizione dei controlli date un'occhiata a questo post.
( Ringrazio David per aver linkato questo blog all'interno dell'articolo ! :) )

lunedì 21 febbraio 2011

Link diretto per aprire la pagina di un'Applicazione con Zune

Esiste un link che permette di aprire, direttamente dal browser, la pagina di un'applicazione sul MarketPlace tramite Zune, precisamente Microsoft fornisce il seguente link:

Link di esempio ad applicazione Coming Soon
zune://navigate/?appID=76583cd8-cf32-e011-854c-00237de2db9e

Link generico (sostutire con l'APPID desiderato)
zune://navigate/?appID=APPID

Purtroppo questo link sembra funzionare solo su Internet Explorer IE9, su altri browser compare il seguente errore:

Impossibile Aprire, l'elemento richiesto non è disponibile per la tua zona
Impossible to Open, Element Required Is Not Available in Your Region (in inglese)

Fortunatamente esiste un link per poter aprire la propria applicazione con zune anche da altri browser, testato su Firefox e Chrome:

Link di esempio ad applicazione Coming Soon
http://redirect.zune.net/External/LaunchZuneProtocol.aspx?pathuri=navigate?phoneAppID=76583cd8-cf32-e011-854c-00237de2db9e

Link generico (sostutire con l'APPID desiderato)
http://redirect.zune.net/External/LaunchZuneProtocol.aspx?pathuri=navigate?phoneAppID=APPID

In questo modo i link alle vostre applicazioni saranno correttamente utilizzabili.

lunedì 3 gennaio 2011

Preserve and Restore ListBox State for Windows Phone

Per salvare e recuperare lo stato selle pagine su phone 7 c'è un articolo interessante su msdn :

Nell'articolo mancano però i metodi per gestire il controllo ListBox, vi aggiungo qui sotto i metodi da aggiungere per poter agilmente salvare lo stato di questo controllo :


   1:  /// <summary>
   2:  /// Saves the scroll offset of a ListBox to the state dictionary.
   3:  /// </summary>
   4:  /// <param name="state">The calling page's state dictionary.</param>
   5:  /// <param name="scrollViewer">The ListBox to be preserved.</param>
   6:  public static void PreserveState(IDictionary<string, object> state, ListBox listbox)
   7:  {           
   8:              
   9:      ScrollViewer viewer = ((VisualTreeHelper.GetChild(listbox, 0) as FrameworkElement).FindName("ScrollViewer") as ScrollViewer);
  10:      if (viewer != null) {
  11:          state[listbox.Name + "_HorizontalOffset"] = viewer.HorizontalOffset;
  12:          state[listbox.Name + "_VerticalOffset"]   = viewer.VerticalOffset;
  13:      }
  14:   
  15:      state[listbox.Name + "_selectedIndex"] = listbox.SelectedIndex;
  16:  }
  17:   
  18:  public class datListBox {
  19:      public double offsetX=0;
  20:      public double offsetY=0;
  21:      public int selectedIndex=-1;
  22:  }
  23:   
  24:  /// <summary>
  25:  /// Retrieves the saved scroll offset from the state dictionary and creates a delegate to
  26:  /// restore the scroll position on the page's first render.
  27:  /// </summary>
  28:  /// <param name="state">The calling page's state dictionary</param>
  29:  /// <param name="scrollViewer">The ListBox to be restored</param>
  30:  public static datListBox RestoreState(IDictionary<string, object> state, ListBox listbox)
  31:  {
  32:      datListBox data = new datListBox();
  33:      data.offsetX = TryGetValue<double>(state, listbox.Name + "_HorizontalOffset", 0);
  34:      data.offsetY = TryGetValue<double>(state, listbox.Name + "_VerticalOffset", 0);
  35:      data.selectedIndex = TryGetValue<int>(state, listbox.Name + "_selectedIndex", -1);
  36:   
  37:      ScheduleOnNextRender(delegate { RestoreState(listbox,data); });
  38:      return data;
  39:  }
  40:   
  41:  private static void RestoreState(ListBox listbox,datListBox data)
  42:  {
  43:      if (listbox == null || data == null ) return;
  44:      ScrollViewer viewer = ((VisualTreeHelper.GetChild(listbox, 0) as FrameworkElement).FindName("ScrollViewer") as ScrollViewer);
  45:      if (viewer != null)
  46:      {
  47:          viewer.ScrollToHorizontalOffset(data.offsetX);
  48:          viewer.ScrollToVerticalOffset(data.offsetY);
  49:      }
  50:  }

Nel metodo RestoreState() potete aggiungere anche il ripristino dell'elemento selezionato se vi interessa (basta aggiungere : listbox.SelectedIndex = data.selectedIndex;)
Un'altra cosa, ho trovato un piccolo Bug nell'articolo MSDN sopra indicato, nel metodo PreserveState del controllo ScrollViewer viene salvato due volte il VerticalOffset :


   1:  public static void PreserveState(IDictionary<string, object> state, ScrollViewer scrollViewer)
   2:  {
   3:    state[scrollViewer.Name + "_HorizontalOffset"] = scrollViewer.VerticalOffset;
   4:    state[scrollViewer.Name + "_VerticalOffset"] = scrollViewer.VerticalOffset;
   5:  }

Modificatelo così :

   1:  public static void PreserveState(IDictionary<string, object> state, ScrollViewer scrollViewer)
   2:  {
   3:   state[scrollViewer.Name + "_HorizontalOffset"] = scrollViewer.HorizontalOffset;
   4:   state[scrollViewer.Name + "_VerticalOffset"] = scrollViewer.VerticalOffset;
   5:  }