Usare e manipolare il file Info.plist

Premesso che il file Info.plist in realtà viene nominato in automatico-Info.plist, questo è un file in formato simile all’XML in cui sono memorizzate alcune importanti informazioni riguardanti l’applicazione.

In Xcode possiamo visualizzarlo e modificarlo grazie ad una comoda interfaccia a tabella, ma possiamo usare via codice le informazioni in esso contenuto anche direttamente dall’app.

Se ad esempio volessimo ottenere il numero della versione attuale dell’app, che nel file Info.plist è indicata come Bundel version, ovvero CFBundleVersion se impostiamo la visualizzazione “Raw” delle chiavi, allora ecco il codice per accedere alla stringa della versione:

1
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

Se invece volessimo fare in modo che un valore sia diverso a seconda della lingua utilizzata dobbiamo accedere al file InfoPlist.string, che è localizzabile come ogni altro file (dal pannello destro Utilities, nella scheda File Inspector, scegliamo Localizzation e aggiungiamo le lingue da gestiere).

Allora basterà scrivere il valore corrispondente per ogni chiave dal localizzare, come ad esempio CFBundleDisplayName se vogliamo fare in modo che l’app abbia nome (quello sotto l’icona, non quello nell’App Store) diverso a seconda della lingua. La riga da inserire in questo file .string sarà quindi come segue:

1
CFBundleDisplayName = "EnglishName";
CFBundleDisplayName = "EnglishName";

Notifiche Push: idee ed avvertenze

Quando si implementano le Notifiche Push può essere utile, talvolta, di notificare solo il cambiamento di badge, senza suono né testo.

E viceversa si può fare in modo che le notifiche con testo vengano mostrate come UIAlertView quando vengono ricevute ad app aperta, grazie al metodo application:didReceiveRemoteNotification: e grazie ad un dizionario che alla chiave “aps” contiene, fra l’altro, il testo della notifica.

Apple usa JSON come formato di comunicazione fra il server delle notifiche e l’app e questo formato restituisce un NSCFBoolean se il valor è zero, oppure un NSCFString se è una stringa. Quindi cosa accade se riceviamo una notifica muta ad app aperta?

Prima di creare l’alert dobbiamo sincerarci di aver ricevuto una stringa e quindi usiamo il metodo isKindOfClass e la seguente condizione:

1
2
3
4
5
6
id notification = [userInfo objectForKey:@"aps"] valueForKey:@"alert"];
 
if ([notification isKindOfClass:[NSString class]]) {
     // mostra alert
 
}
id notification = [userInfo objectForKey:@"aps"] valueForKey:@"alert"];

if ([notification isKindOfClass:[NSString class]]) {
     // mostra alert

}

In questo modo non si rischierà di usare un booleano dove invece andrebbe usata una stringa, con conseguente crash assicurato dell’app a causa di un errore del tipo:

-[__NSCFBoolean isEqualToString:[: unrecognized selector sent to instance…