Dice il saggio: “Squadra che vince non si cambia”.. ed io, Francesco Montrone aka freellino nel forum devAPP, ho insistito con l’uso di XCode3 finchè non ho dovuto scrivere codice per iOS 5, il che ha reso praticamente necessario aggiornare il mio IDE alla versione 4.2 (perdendomi nel frattempo la 4.0). OK, piuttosto che tradizionalista, mi dovrei definire pigro! Cambiato l’IDE, sicuramente migliore del precedente, passo dopo passo ho dovuto superare molti dei problemi inevitabili che un cambio di abitudini porta con sé. Fra questi, ultimo in ordine di tempo, ma non ultimo per importanza, ho dovuto incrociare: la distribuzione Ad Hoc con XCode 4.
Prerequisiti
Per mettere in pratica quanto segue, dovremo essere in possesso di un certificato per la distribuzione Ad Hoc e, di conseguenza, aver aderito al Developer Program di Apple. L’adesione al programma free infatti non consente l’installazione delle app che stiamo creando nel nostro device e, tantomeno, non permette la condivisione della nostra app, per la quale stiamo scrivendo il codice, su altri dispositivi. Insomma, l’unico mezzo di test, con tutte le sue limitazioni, senza un accont developer a pagamento, è il simulatore.
In aiuto come al solito viene devAPP.it che, con il suo tutorial “Creiamo i certificati per l’invio ad Apple“, spiega tutti i passi necessari per ottenere ed installare i certificati.

La nostra guida
L’articolo che vi accingete a leggere è applicato ad un ipotetico progetto XCode chiamato “DevAppTut”.
Xcode 4.2 (anche 4.0 a dire il vero) ha aggiunto nuove funzionalità ed ha modificato le procedure per ottenere alcuni risultati. Fra queste, proprio la modalità di distribuzione della nostra applicazione, sia attraverso il canale standard, App Store per intenderci, sia per la distribuzione ad amici, betatester, clienti, chiamata distribuzione Ad Hoc. E questa modalità sarà oggetto del presente tutorial. Esiste anche un’altra modalità di distribuzione, molto comoda, la cosiddetta OTA (On the Air Distribution) che sarà oggetto di un futuro articolo.
Il primo passo da fare è creare una nuova configurazione per il tipo di distribuzione che vogliamo fare (in questo caso, ovviamente, una Ad Hoc Distribution).
Per fare ciò, dovremo selezionare il Project Navigator (1) che ci mostrerà tutti i componenti della nostra app. Nel caso fosse nascosto, potremo visualizzarlo tramite click sulle icone (2) e (3).
Quindi clicchiamo sul progetto (4) nel Project Editor e selezioniamo il tab “Info” (5).

A questo punto dovremo semplicemente duplicare la configurazione di Release, cliccando su bottone Add (1) e scegliendo “Duplicate Release Configuration” (2).

Possiamo assegnare qualunque nome alla configurazione che stiamo creando. Ritengo che non ci sia nulla di meglio che assegnare un nome esplicito come, ad esempio, “AdHoc”.
Abbiamo così preparato Xcode per tre configurazioni.

Dobbiamo ora associare la configurazione creata con il certificato di distribuzione che abbiamo realizzato, scaricato ed installato in precedenza.
Anche questo passaggio è molto semplice: apriamo il tab “Build Settings” (1) e nella sezione Code Signing selezioniamo la Code Signing Identity che si è venuta a creare (2) quindi, nel popup che si apre (3), scegliamo il certificato di distribuzione. In figura è visualizzato ciò che ho ottenuto con il mio certificato.

Dobbiamo ora creare uno “scheme” per la distribuzione.
È questa, a mio parere, la parte meno immediata di Xcode 4.2. Nostalgicamente devo dire che questa fase era più intuitiva e rapida in Xcode 3, ma tant’è!
Scacciamo la nostalgia e vediamo come bisogna procedere.
Lo Scheme Editor è “nascosto” nel menu dropdown che compare cliccando sul Path Control (1) e successivamente selezionando “Edit scheme”.

Ed ecco finalmente visualizzato il nostro Scheme Editor.

Selezioniamo lo scheme “Archive–Release” (1) e trasformiamo la Build Configuration da “Release” ad “AdHoc”, tramite la selezione nel menu dropdown (2).
Nota: la “Destination” deve essere impostata a “iOS Device” (3).
Prima di cliccare su “OK” verifichiamo che lo Scheme “AdHoc” sia impostato correttamente:

A questo punto possiamo procedere con l’ “Archive”.
Tramite la voce di menu “Product” selezioniamo “Archive”:

Se si fa l’archive del progetto in un momento successivo può accadere di ritrovarsi con la voce di menu non selezionabile. Evidentemente stiamo cercando di archiviare non avendo come target il device, ma il simulatore. Quindi assicuriamoci sempre di trovarci nella seguente situazione:

Finalmente viene “buildato” il nostro progetto e viene creato l’archivio. Automaticamente si aprirà l’Organizer con già selezionato il tab “Archives”, il quale contiene tutti i nostri progetti di cui abbiamo fatto la build.

Selezioniamo l’app che intendiamo distribuire (1), nel nostro caso “DevAppTut”, e clicchiamo “Share” (2).
Potrebbe succedere che alla fine della build l’Organizer non si apra automaticamente, allora ci toccherà farlo manualmente tramite il menu Window | Organizer

Selezioniamo “iOS App Store Package (.ipa)” (1) e come “Identity” scegliamo ancora una volta il nostro certificato (2) proseguiamo quindi cliccando Next. Nella finestra successiva potremo decidere dove salvare il file e quale nome assegnargli.
Sarà un filename puramente identificativo; una volta installata sul device la nostra app avrà il nome che abbiamo deciso per il nostro “Bundle name”.
Dico questo perchè in fase di test non è da sottovalutare l’uso di una numerazione progressiva per identificare il file sotto test e non il numero di versione che, personalmente decido all’inizio della lavorazione e che cambio in vista di significativi passi avanti fatti in corso di sviluppo ed affinamento.
Ed eccolo finalmente il nostro file pronto per essere inviato all’amico, betatester, cliente… il quale dovrà semplicemente trascinarlo sull’icona di iTunes e sincronizzare il suo dispositivo.

20 Responses to “Xcode 4: Distribuzione Ad Hoc delle applicazioni iPhone e iPad”
10 Gennaio 2012
danielaGrazie Francesco, era una delle cose che non riuscivo proprio a fare !
Mi servirà giusto a breve quindi…… benarrivato !!
16 Gennaio 2012
LucaOttimo tutorial…… grazie.
29 Gennaio 2012
leopardmac (michele)grandi, era un problema che da mesi non riuscivo a risolvere, vi meritate 10+
29 Gennaio 2012
leopardmac (michele)20 Febbraio 2012
danielaFantastico !
Funziona alla perfezione. Grazie Francesco !!!!
21 Febbraio 2012
cesareOttimo, ho solo una domanda per il betatest su altri device non bisogna inviare anche il certificato di distrbuzione?
Grazie Cesare
22 Febbraio 2012
Francesco Montronein rigoroso ordine cronologico
@daniela + luca + luca : grazie
@luca : rivedi perbene la validità dei certificati. associa il certificato corretto nel tab “building settings” -> code signing identity. non è escluso un tour nell’organizer con l’elimanazione dei certificati e il reinserimento degli stessi (se sei assolutamente sicuro che sono gli ultimi validi in tuo possesso)
@cesare : l’ipa contiene al suo interno il certificato di distribuzione, pertanto non occorre fornire altro che non sia il .ipa
grazie
22 Febbraio 2012
cesareGrazie Francesco
Cesare
28 Febbraio 2012
cesareGrazie ancora e volevo solo dire che:
Sul mio iPhone ha funzionato benissimo ma non sul quello del tester dove dice che non è compatibile eppure tutti e due igli iPhone sono presenti nel certificato ed ho abbassato il target a 3.1 per essere compatibile col mio tester.
Grazie, avete qualche idea?
28 Marzo 2012
SimoneGrazie della guida. Posseggo due iPhone (iPhone 1 e iPhone 2) e sto facendo qualche prova.
Avrei due domande:
1. Se il provisioning profile Ad Hoc contiene solo il device “iPhone 1” ma non il Device “iPhone 2” riesco lo stesso ad installare la applicazione nel iPhone 2? Chiuedo questo perché stranamente sono riuscito a fare il deploy “Share” del programma e sincronizzare la app con iPhone 2. Non dovrebbe bloccarsi?
2. Dal tasto Share *non* posseggo la possibilità di creare il file IPA, ma ho solo come opzioni:
– Contents:
1. Package (No Package exist for the type of app) [NON SELEZIONABILE]
2. Build Products
3. Archive
– Identity:
1. This Kind of Archive cannot be signed [NON SELEZIONABILE]
Grazie dell’aiuto!
8 Aprile 2012
@AndreaGrazie. vi scrivo perche comunque non mi va dando questo errore
CodeSign error: code signing is required for product type ‘Application’ in SDK ‘iOS 5.1’
Ho un iphone 5.0 e malgrado giorni di prove non trovo l’inghippo
Grazie ancora ciao Andrea
9 Aprile 2012
@Andrea3 Maggio 2012
Lucaottimo articolo! Una domanda, cosa cambia dal tuo tutorial se al posto che creare un .ipa ad hoc volessimo pubblicarlo sull’apple store?
5 Giugno 2012
AndreaCiao a tutti.
quasi tutti i miei amici a cui vorrei fargli fare da cavia, non hanno l’iphone sincronizzato con iTunes. Scaricano le app direttamente dall’iphone. Non volgi fargli allineare le app con iTunes, così non sono legati al pc. Ciò vuol dire che non posso fargli provare la mia applicazione?
19 Giugno 2012
pastMolto bene, grazie: sono riuscito così ad inviare la mia prima app ad un amico per vedere cosa ne pensa. Ho provato però anche il pulsante “archivio” perché volevo avere un “pacchetto” contenente tutti i files che ho usato e creato per fare l’applicazione: infatti ogni volta che facevo dei cambiamenti mi tenevo prudentemente la versione precedente, colo che ora l’App linka a files .m o .h contenuti in altre cartelle. Si riesce a “esportare” un archivio per tenerlo come base per le future modifiche?
Grazie mille
Fausto
20 Luglio 2012
AntonioHo seguito alla lettera tutti i punti, ma quando vado a creare l’archivio mi torna l’errore che la compilazione non è andata a buon fine. Ci sono altri passi e/o controlli che posso fare?
Grazie 1000
22 Agosto 2012
SilSalve, sono giorni che provo e riprovo senza esito ad inserire il Code Signing Identity ..
però ho notato una cosa, in sostanza quando scorro la lista dei profili selezionabili da relazionare ad es. ad AdHoc (oppure Debug o Release che sia..), non vedo i miei nuovi Priofiling nella lista, ma sempre i vecchi. Anzi noto che alcuni Profili che ho fatto sono in grigio chiaro, quindi non selezionabili.
Esiste un modo per fare un “reset” alla lista dei profili disponibili e quindi selezionabili ???
22 Settembre 2012
GiuseppeBuonasera, vi risulta ancora funzionante il metodo con il nuovo xcode 4,5? Ora mi crea un file .ipa di piccolissime dimensioni che non puo’ essere installato sul dispositivo.
Grazie
Giuseppe
17 Giugno 2013
SergioSalve a tutti,
sono giorni che ci lavoro …ma non riesco proprio a creare un IPA installabile sul mio iPad.
Se eseguo il codice sul device, tutto ok …se distribuisco l’IPA, trascinandolo su iTunes, niente ..ricevo questo errore:
Jun 17 00:18:33 SergioiPad lockdownd[45] : 01542000 __copy_itunes_value_block_invoke_0: com.apple.mobile.iTunes.store/PurchaseTypes -> (null)
Jun 17 00:18:37 SergioiPad installd[54] : 0x2ff7f000 handle_install: Install of “/var/mobile/Media/PublicStaging/***.ipa” requested by itunesstored
Jun 17 00:18:37 SergioiPad installd[54] : 0x2ff7f000 MobileInstallationInstall_Server: Installing app it.***.***
Jun 17 00:18:37 SergioiPad mobile_assertion_agent[101] : service_one_connection: Connection closed for client iTunes.
Jun 17 00:18:37 SergioiPad installd[54] : Jun 17 00:18:37 SecTrustEvaluate [leaf CriticalExtensions IssuerCommonName]
Jun 17 00:18:38 SergioiPad installd[54] : 0x2ff7f000 verify_signer_identity: MISValidateSignatureAndCopyInfo failed for /var/tmp/install_staging.66cmMz/foo_extracted/Payload/***.app/***: 0xe8008017
Jun 17 00:18:38 SergioiPad installd[54] : 0x2ff7f000 do_preflight_verification: Could not verify executable at /var/tmp/install_staging.66cmMz/foo_extracted/Payload/***.app
Jun 17 00:18:38 SergioiPad itunesstored[73] : 0x19ce000 MobileInstallationInstall: failed with -1
Jun 17 00:18:38 SergioiPad installd[54] : 0x2ff7f000 install_application: Could not preflight application install
Jun 17 00:18:38 SergioiPad installd[54] : 0x2ff7f000 handle_install: API failed
Ho seguito alla lettere le guide …nulla 🙁
Chi mi aiuta ?
13 Agosto 2013
LeonardoCiao grazie della guida, una vera manna dal cielo; ho una domanda sono fermo al passaggio BUILD -> ARCHIVE; mi da buil failed e mi dice A valid provisioning profile matching the application’s Identifier ‘Verona-For-You.VeronaForYou’ could not be found
cosa significa? non riesco a capire mi sapete dare una dritta? sarebbe mooolto utile!!
Grazie