[iOs] Link Maker: generazione dinamica dei link di Apple Store

Per la generazione dei link di tutti gli articoli (ebook, musica, app, podcast, audiolibri, ecc.) disponibili su iTunes, iBook ed App Store, Apple mette a disposizione la pagina di iTunes Link Maker:  http://linkmaker.itunes.apple.com

Link Maker Apple

Esistono, in realtà, vari strumenti utili per la generazione dei link (creare link ad iTunes), utili però solo per la creazione di widget e link statici. Ad esempio, in questo Q&A si spiega come generare link a propri item (come, ad esempio, alla pagina delle app sviluppate da uno sviluppatore o da una società: Creating easy-to-read short links to the App Store for your apps and company).

Tuttavia, non esiste un vero e proprio framework che consenta di recuperare dinamicamente tali link. Occorre richiamare una URL di servizio, fornita proprio da Apple, così come si legge dalla Search API Documentation.

Ho così realizzato uno “scriptino” PHP in grado di restituirvi i risultati della pagina di iTunes Link Maker in formato JSON. Per fare ciò, mi sono aiutato con uno sniffer e ho recuperato tutte le URL richiamate dopo aver lanciato una ricerca sulla pagina di Link Maker. Le URL generate “dietro le quinte” dalla ricerca sono un bel po’ e cambiano in base alla combinazione tra “media” selezionato (categoria di item: audio, video, app, ebook, ecc.) e relative entity (sottocategorie di item non selezionabili, ma impostate da Apple come ulteriori keyword di ricerca, in base al media selezionato).

Potete provare la ricerca dalla form di esempio disponibile qui:

Nello script PHP che ho realizzato, non faccio altro che richiamare la stessa URL di Apple, passando una combinazioni di parametri (essenzialmente cambiano “media” ed “entity“):

http://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/wsSearch?term=%s&country=%s&media=%s&entity=%s&limit=%s&genreId=%s&version=2&output=json

Al posto di %s occorre inserire dei valori ammissibili (la lista completa la trovate sulla documentazione ufficiale – Search API Documentation):

  • term: contiene la keyword di ricerca (ad esempio, “Oasis what’s the story morning glory”)
  • country: identificativo del Paese (IT, US, UK, ecc.). La ricerca restituirà gli item disponibili sugli Apple Store del paese selezionato. La lista completa dei Paesi è disponibile qui: http://www.francescoficetola.it/link-maker/countries.json
  • media: deve contenere la categoria di item. I valori ammissibili sono: audiobook (per gli AudioLibri), shortFilm (per i Cortometraggi), movie (per i Film), software (per le iOs app), ebook (per i Libri), macSoftware (per le Mac Apps), music (per i brani audio), podcast (per i PodCast), musicVideo (per i Video).
  • limit: numero massimo di risultati di ricerca da restituire;
  • entity: contiene le sottocategorie dei prodotti. Questo valore dipende dal parametro media impostato (le varie combinazioni sono elencate di seguito);
  • genreId: (opzionale) contiene il codice relativo al genere di media desiderato. Esistono varie combinazioni, disponibili al seguente link:

Ecco le combinazioni di media e relative entity, così come mappate nel mio script PHP:

//AUDIOLIBRI
if($media=='audiobook'){
   $entity = array('audiobookAuthor','audiobook');
}

//CORTOMETRAGGI
if($media=='shortFilm'){
   $entity = array('shortFilmArtist','shortFilm');
}

//FILM
if($media=='movie'){
   $entity = array('movieArtist','movie');
}

//iOS Apps
if($media=='software'){
   $entity = array('softwareDeveloper','software','iPadSoftware');
}

//LIBRI
if($media=='ebook'){
   $entity = array('ebookAuthor','metaEbook,textbook,ebook');
}

//Mac Apps
if($media=='macSoftware'){
   $entity = array('softwareDeveloper','macSoftware');
}

//MUSICA
if($media=='music'){
   $entity = array('musicArtist','song','album','musicVideo');
}

//PODCAST
if($media=='podcast'){
   $entity = array('musicArtist','podcastAuthor','podcast');
}

//VIDEO
if($media=='musicVideo'){
   $entity = array('musicVideoArtist','musicVideo');
}

Se volete richiamare direttamente il mio script PHP, senza passare dalla form di esempio su linkata (magari per farvi restituire un JSON da utilizzare nelle vostre app), eccovi la URL diretta:

  • http://francescoficetola.it/link-maker/linkmaker.php?term=%s&country=%s&media=%s&limit=%s&genreId=%s

I valori ammissibili da passare sono quelli espressi precedentemente e di seguito riassunti:

  • media: audiobook, shortFilm, movie, software, ebook, macSoftware, music, podcast, musicVideo
  • country: IT, US, UK, ecc.
  • term: la vostra query di ricerca (ad esempio, Oasis what’s the story morning glory”)
  • limit: (opzionale, di default è impostato a 50) determina il numero massimo di risultati che occorre restituire per ognuna delle combinazioni di URL di ricerca richiamate da Apple, in base al media impostato.
  • genreId: (opzionale) codice del genere degli item, il cui valore ammissibile è disponibile nel dizionario lmMediaTypeAndGenreDictionaries fornito da Apple.

Le combinazioni di entity sono definite direttamente nello script e non occorre specificare il parametro in input.

Ecco un esempio di ricerca:

http://francescoficetola.it/link-maker/linkmaker.php?term=jovanotti+bella&country=IT&media=music&limit=50&genreId=14

[iOS] iOs Data Storage guidelines reject (2.23 – App Store Review Guidelines)

Brutta parola, “Apple reject“. La strada per farsi approvare un’app da Apple per il rilascio su Apple Store è assai tortuosa. Occorre seguire per filo e per segno ciascun punto delle App Store Review Guidelines. C’è un punto (il 2.23) che riguarda le iOS Data Storage Guidelines che onestamente non riesco a “disambiguare”, visto che su vari blog si danno suggerimenti e pareri assai discordi su come rispettarle. Il mio grosso quesito è capire dove è corretto salvare i contenuti che vengono scaricati tramite la mia app, considerando che questi vengono prima acquistati (con il sistema In-App Purchases di Apple) e poi sincronizzati manualmente dagli utenti.

Nell’ultima app che ho sottoposto al processo di approvazione di Apple, mi è stato risposto con un messaggio di rigetto riguardo il punto 2.23 e che vi incollo di seguito:

2.23
We also found that your app does not follow the iOS Data Storage Guidelines, which is required per the App Store Review Guidelines.

In particular, we found that after downloading one content, your app stores 13.8 MB. To check how much data your app is storing:

– Install and launch your app
– Go to Settings > iCloud > Storage & Backup > Manage Storage
– If necessary, tap “Show all apps”
– Check your app’s storage

The iOS Data Storage Guidelines indicate that only content that the user creates using your app, e.g., documents, new files, edits, etc., may be stored in the /Documents directory – and backed up by iCloud.

Temporary files used by your app should only be stored in the /tmp directory; please remember to delete the files stored in this location when the user exits the app.

Data that can be recreated but must persist for proper functioning of your app – or because customers expect it to be available for offline use – should be marked with the “do not back up” attribute. For NSURL objects, add the NSURLIsExcludedFromBackupKeyattribute to prevent the corresponding file from being backed up. For CFURLRef objects, use the corresponding kCFURLIsExcludedFromBackupKeyattribute.

For more information, please see Technical Q&A 1719: How do I prevent files from being backed up to iCloud and iTunes?

In poche parole, Apple dice che quando l’app permette agli utenti di scaricare contenuti (downloadable contents), che siano essi immagini, video, audio, pdf, ecc., questo potrebbe far diminuire lo spazio sul dispositivo (e fin qui nessun problema); ma la cosa indesiderata è che il nuovo sistema iCloud potrebbe backuppare l’app con tutti i file scaricati e consumare lo spazio dell’account (che come si sa, è gratuito fino ai primi 5 giga, e a pagamento annuale in base alle soglie di spazio richiesto). A questo punto è iniziata la mia indagine e ho studiato un pò il caso per capire meglio come risolvere questo grosso dilemma e magari aiutarvi ad affrontarlo alla meglio.

Nel rispetto dei requisiti di storage dei dati sugli iDevice, Apple ha stilato le iOS Data Storage Guidelines in cui si legge questo (NOTA. La traduzione è ad interpretazione mia e mi scuso per eventuali errori):

iOS Data Storage Guidelines. iCloud include un sistema di backup che automaticamente effettua il salvataggio dei dati presenti sui device iOs degli utenti in modalità WI-FI. Tutto quello che si trova nella Home Directory della propria app viene backuppato, ad eccezione dell’application bundle, delle directory di cache e dei file temporanei.
Le musiche acquistate (su iTunes), le apps, le Camera Roll (le foto inserite nelle categorie, dette “rullini”), le impostazioni del telefono, la home screen e l’organizzazione delle app, i messaggi e le suonerie vengono automaticamente backuppate.

Poichè i backup vengono eseguiti in modalità wireless e memorizzati in iCloud per ciascun utente, occorre minimizzare la quantità di dati che le apps memorizzano. File grandi allungano i tempi di backup e consumano spazio di storage sull’account iCloud.

Affinchè i backup siano il più possibile efficienti, occorre assicurare che l’app memorizzi i dati in accordo con le seguenti linee guida:

  1. Solo i documenti o altri dati che vengono generati dall’utente (user-generated), o che non possono essere altrimenti ricreati dall’app, devono essere memorizzati nella directory /Documents e verranno automaticamente backuppati da iCloud.
  2. I dati che possono essere scaricati più volte o rigenerati dovrebbero essere memorizzati nella directory /Library/Caches. Esempi di file che potrebbero essere salvati nella directory Caches includono i file di cache del database e contenuto scaricabile (downloadable content), come magazine, newspaper e map applications.
  3. I dati che vengono usati soltanto temporaneamente dovrebbero essere memorizzati nella directory /tmp. Sebbene questi file non vengono backuppati da iCloud, occorre ricordare di cancellarli quando non servono più così da non consumare spazio sul dispositivo dell’utente.
  4. Usare l’attributo “do not back up per specificare i file che dovrebbero rimanere sul device, anche in situazioni di basso storage. Questo attributo si usa con i dati che possono essere ricreati ma che occorre siano persistenti, anche in situazioni di basso storage, per far funzionare propriamente l’app o perchè gli utenti si aspettano di averli disponibili anche durante l’uso offline. L’attributo funziona sui file marcati a prescindere dalla directory in cui si trovano, inclusa la directory Documents. Questi file non verranno eliminati o non verranno inclusi nell’iCloud dell’utente o di backup di iTunes. Poichè questi file utilizzano spazio di archiviazione sul device, la vostra app è responsabile del controllo e dell’eliminazione periodica di questi file.

Per maggiori dettagli vedi: Technical Q&A QA1719-How do I prevent files from being backed up to iCloud and iTunes?

Prima di entrare nel meglio della trattazione tecnica e del codice di programmazione, riporto quanto estratto dal documento di App Backup Best Practices.

Continua la lettura