Distribuire in remoto un'app iOS compilata in Xcode 7 senza App Store, sub di programma per sviluppatori o jailbreak?


10

Seguendo queste istruzioni (vedi anche la documentazione per gli sviluppatori Apple e la risposta di BoltClock al test dell'app iOS su un dispositivo senza programma per sviluppatori Apple o jailbreak ), sono stato in grado di compilare un'app iOS (in questo caso la provenienza , un'app di emulazione della console per videogiochi che non rispettare le linee guida di Apple e non sarà mai consentito nell'App Store di Apple) in Xcode 7, firmarlo con il mio account iCloud personale, trasferirlo sul mio iPhone (collegandolo al mio Mac tramite USB e selezionando il mio iPhone nel menu xcode -> Prodotto -> Destinazione) e consenti al mio telefono di eseguirlo "fidando" delle app con questa firma in Impostazioni -> Generale -> Profilo, che installa il certificato associato al mio account icloud sul dispositivo.

Vorrei replicare questi passaggi con un download over the air. Posso ottenere Xcode per produrre un eseguibile che posso condividere con mio fratello, che ha un iPhone, ma non ha accesso a un Mac con Xcode?

StackExchange Network ha realizzato qualcosa di simile apparentemente per il suo programma beta di app iOS, usando la distribuzione aziendale di Apple tramite Gestione dispositivi mobili, come menzionato in questa domanda . Esiste anche BuildStore ( http://builds.io/ ), che per $ 10 / anno abilita anche questa funzionalità, apparentemente aggiungendo utenti a un "team di sviluppatori" associato a un account Apple Developer Program a pagamento (consultare i documenti di sviluppo Apple ) . Con Xcode 7, è possibile fare una cosa del genere senza un account sviluppatore a pagamento aziendale o regolare?

aggiornamento: grazie all'aiuto di Stacksza, ho fatto alcuni progressi, che riassumerò qui.

  1. XCode creerà un archivio (Prodotto -> Archivio), ma non consente di esportare un archivio in un file .ipa per la distribuzione ad hoc senza abbonarsi al livello di account ADP a pagamento.
  2. Nessun problema, però, perché lo strumento Xcode riga di comando fa creare un eseguibile .ipa, anche senza conto ADP pagato. Usa un comando simile xcodebuild -exportArchive -archivePath Provenance-Release\ 11-20-15\,\ 22.24.xcarchive/ -exportOptionsPlist ~/manifest.plist -exportPath ~/Provenance(vedi la risposta di Khawar in Come creare ipa in xcode 6 senza account sviluppatore Apple? )
  3. Ma questo comando richiede di specificare un file manifest .plist. La risposta di Razvan a Over The Air (OTA) Distribuzione file IPA iOS per pubblico? contiene un manifest.plist di esempio, nonché le istruzioni per il formato del collegamento ipertestuale necessarie per fornire un collegamento per il download, che deve essere ospitato su una pagina Web SSL. Potrebbe essere che l'URL SSL debba calcolare l'id del bundle dell'app, non ne sono sicuro.
  4. Ma quanto sopra funziona solo se l'app è predisposta per il dispositivo che la scarica e il dispositivo ha già installato il certificato dello sviluppatore. Quindi, ad esempio, un dispositivo che è stato precedentemente collegato tramite USB al mio Xcode ora può scaricare l'app via etere, il che è fantastico. Questo è progresso. Ma per i dispositivi puliti, ottengo l'errore Could not install embedded profile: 0xe8008012 (This provisioning profile cannot be installed on this device.)(come visualizzato nella console del dispositivo, che può essere visualizzato in Xcode -> Finestra -> Dispositivi, oppure nell'app Apple Configurator).
  5. Per eseguire il provisioning di un'app per un dispositivo, deve contenere l'UDID del dispositivo nel embedded.mobileprovisionfile, vedere Come incorporare un profilo di provisioning in un'app iOS , Come automatizzare il controllo di un campo in embedded.mobileprovision di un ipa? , Come scoprire quale profilo è stato utilizzato per la creazione del file * .ipa? e c'è un modo per vedere quali UDID sono inclusi in una build? . Non puoi semplicemente modificare questo file per aggiungere l'UDID, tuttavia, poiché quindi CODESIGNATURE dell'app non corrisponde e il dispositivo segnalerà l'erroreFailed to verify code signature of /private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.7jBjpk‌​/extracted/Payload/Provenance.app : 0xe8008017 (A signed resource has been added, modified, or deleted.)}
  6. Ok, quindi dobbiamo dimetterci dall'app. Xcode fornisce uno strumento da riga di comando chiamato codesignche può fare questo. Le istruzioni sono su Come riscrivere il file ipa? e Firma nuovamente IPA (iPhone) e Dimetti un'app per iPhone, inserisci un nuovo ID pacchetto e invia a Xcode Organizer per il caricamento e Come riscrivere manualmente un IPA con un nuovo profilo di provisioning . Ho dovuto specificare il mio certificato di sviluppatore, il cui nome preciso può essere trovato in Accesso Portachiavi, nella scheda Certificati, e assomiglia a "Sviluppatore iPhone: nomeutente@mac.com (ABCDEFGHIJ)". Quindi il comando è come codesign -f -s "iPhone Developer: username@mac.com (ABCDEFGHIJ)" Payload/Provenance.app. I comandi di esempio nelle istruzioni sopra includevano un flag chiamato--resource-rules, ma non ho trovato tale file nella mia app compilata, quindi ho rimosso quel flag. Mi chiedo cosa faccia e se sia necessario. Modifica: L'eccellente post sul blog Inside Code Signing di Thomas Kollbach spiega che la --resource-rulesbandiera veniva utilizzata per indicare quali parti di un'app devono essere firmate, ma poiché iOS8 è obsoleto e l'intera app deve essere firmata.
  7. Ora che l'app ha aggiunto l'UDID ed è firmata, scaricandola sul nuovo dispositivo si ottengono gli errori Could not install embedded profile: 0xe8008003 (This provisioning profile is malformede A valid provisioning profile for this executable was not found. Suppongo che il problema ora sia che il dispositivo non ha ancora installato il certificato dello sviluppatore. Quando esegui il sideload tramite Xcode, prima che l'app venga eseguita, devi trovare il certificato installato in Impostazioni -> Generale -> Profilo, seleziona il tuo certificato e tocca "fiducia". Tuttavia, questa opzione non viene visualizzata dopo il download over-the-air dell'app ad hoc, quindi non sono sicuro di come procedere. Penso di aver bisogno di un modo per installare il certificato dello sviluppatore sul dispositivo. Secondo l' installazione del profilo di provisioning su iOS 8.0.2, era possibile semplicemente inviando il certificato tramite e-mail al dispositivo, ma non funziona più a partire da iOS 8. Non ho provato a confermare. Come posso installare il mio certificato di sviluppatore su un dispositivo iOS da remoto?
  8. Ho provato a esportare il mio certificato sviluppatore iPhone da Keychain Access e inviarlo tramite e-mail al dispositivo. Il dispositivo è stato in grado di installare il certificato, ma è stato visualizzato con un avviso rosso che non era firmato, mentre quando il certificato è stato installato tramite Xcode / USB non aveva tale avviso. Secondo Rhythmic Fistman è possibile ricrittografare un file embedded.mobileprovision? , il profilo deve essere firmato da Apple per funzionare. Questo potrebbe essere il punto critico. Apple firmerà il tuo certificato solo se hai un account ADP a pagamento.
  9. Questo post sul blog sul provisioning di Sean Heber è stato molto illuminante sulla teoria generale dei certificati degli sviluppatori e dei profili di provisioning (insieme a quelli di Kollbach, entrambi dovrebbero essere tenuti a leggere). Contiene questo paragrafo:

    Il motivo per cui tutto questo funziona ed è sicuro è che Apple genera i profili di provisioning nel portale e quindi li firma con le proprie chiavi private prima di consegnarteli. La firma dei profili di provisioning è qualcosa che solo Apple può fare. Pertanto, il file scaricato non può essere manomesso senza renderlo non valido. Un profilo di provisioning non valido non sarà accettato da iOS e quindi Apple può controllare esattamente cosa può e non può essere fornito da uno sviluppatore limitando semplicemente l'accesso alla firma del profilo di provisioning a cose che il portale degli sviluppatori ti autorizza a configurare nel primo luogo - anche se i profili di provisioning possono supportare qualsiasi numero di altre fantastiche opzioni che non è possibile utilizzare senza il jailbreak. Ecco perché devi registrare i dispositivi di test nel portale, aggiungi i tuoi certificati al portale, ecc. - solo le cose nel portale (e quindi i cui numeri possono essere controllati e limitati arbitrariamente da Apple) possono essere inclusi in un profilo di provisioning generato e firmato correttamente. Il portale è dove vengono effettivamente applicate le politiche e le limitazioni di provisioning di Apple.

Questo sembra rispondere definitivamente alla mia domanda (posso far funzionare l'app senza un account ADP a pagamento) con un "no". Sebbene questo articolo sia precedente a Xcode 7. Apparentemente Xcode 7 invierà l'UDID di un dispositivo al portale Apple e riceverà in risposta un profilo di provisioning firmato da Apple, contenente tale UDID. Xcode 7 lo fa solo quando il dispositivo è collegato tramite USB e riconosciuto da Xcode, ma ci si chiede se una richiesta Xcode manuale ad Apple possa essere realizzata? Ciò si approfondisce con il reverse engineering delle cose di Apple di cui non mi sento a mio agio e probabilmente viola ToS o altro, quindi penso di essere soddisfatto della risposta "no".

Secondo la pagina about di BuildStore , gestiscono qualcosa di simile via e-mail, quindi potrebbe essere possibile.

Xcode "Build and Archive" dalla riga di comando è piuttosto vecchio (circa xcode 3), ma suggerisce di usare al xcrunposto di quello xcodebuildche ho usato.


1
Per favore, considera di dividerlo. La domanda dovrebbe essere breve, semplice e di facile comprensione. Tutte le risposte / i processi su come hai ottenuto la risposta e il post sul blog dovrebbero trovarsi nella sezione delle risposte.
bmike

Risposte:


2

La risposta è quasi SÌ!

Sono riuscito a installare nuove build della stessa app sui dispositivi tramite Fabric.io senza abbonamento a apple dev. (Immagino che tu possa anche distribuirli con iTunes. Invia ipa al tester e dovrebbe essere in grado di installarlo tramite iTunes.)

L'unico svantaggio è che devi connettere il dispositivo a Xcode almeno una volta . Quindi è possibile installare in remoto nuove versioni. (Non ho trovato il modo di farlo manualmente conoscendo il udid)

Quando si collega il dispositivo "sconosciuto" a xcode 7, è presente un fix issuepulsante Target general settings. Risolvi il problema e Xcode genererà un nuovo profilo di provisioning con questo dispositivo incluso. (lo puoi trovare in ~/Library/MobileDevice/Provisioning Profiles)

Quindi puoi utilizzare questo profilo di provisioning per distribuire app tramite Fabric.io

  1. Iscriviti su Fabric.io
  2. Setup Fabric per il tuo progetto (c'è una guida passo passo)
  3. Assicurati che xcode utilizzi la giusta prov. profilo per firmarlo. Automaticha funzionato per me.
  4. Xcode> Progetto> archivio
  5. helper fabric rileverà la build e sarai in grado di distribuirla.

Mi dispiace ragazzi che non sono abbastanza abili con Xcode, non ho molto tempo per aggiungere meno guida soggetta a errori, ma spero che questa risposta possa aiutare qualcuno con idee.

SUGGERIMENTO: utilizzare questo plugin quicklook per vedere all'interno di ipas e prov. profili!


1
Sì, questa risposta è coerente con ciò che ho scoperto nei miei test. Mi chiedo ancora se sarebbe possibile aggirare quel "connetti il ​​dispositivo a xcode almeno una volta", falsificando il messaggio che Xcode invia ai server Apple con il nuovo dispositivo UDID
ziggurism

2

A partire da alcune versioni di iOS 9.x rilasciate da quando la mia risposta è stata originariamente pubblicata, questa non è più nemmeno una possibilità. Apple ora limita i download OTA su account non liberi, come mostrato da errori nei registri del dispositivo in caso di installazione non riuscita.

L'ho provato ampiamente, poiché sarebbe fantastico anche per le mie app.

Posso distribuire l'OTA delle mie app senza un abbonamento al programma per sviluppatori (costa denaro)?

È possibile creare e firmare un IPA e creare il file manifest per esso, ma l'installazione non verrà eseguita sul dispositivo. Il motivo è che Xcode deve configurare l'IPA per quel dispositivo (presumibilmente firmandolo correttamente con l'UDID). Puoi persino vederlo accadere se provi a collegare un nuovo dispositivo al Mac ed esegui l'app tramite Xcode su di esso. La risposta breve è no.

Cosa posso fare per farlo funzionare?

Puoi iscriverti al Programma per sviluppatori con Apple (costa denaro) e aggiungere l'UDID del suo dispositivo al tuo profilo, quindi creare un file IPA e manifest, caricarli su un server Web e inviargli l'URL.

È davvero per la sicurezza, poiché la barriera dei prezzi è di solito ciò che impedisce la distribuzione di app dannose sul Web. Per non parlare del mantenimento della maggior parte dei download di app nell'App Store.

Mi sono registrato al programma per sviluppatori? Come lo distribuisco ora?

È necessario disporre di un server Web HTTPS (e un certificato SSL per il quale è possibile creare il proprio root). Devi anche aver aggiunto il loro UDID al tuo profilo di sviluppatore (non sono esattamente sicuro di come farlo). È necessario utilizzare Xcode per creare l'IPA (Prodotto> Archivio> Esporta> Salva per distribuzione ad hoc> Accedi con ID Apple> Segui le istruzioni) e otterrai un file Plist e un file IPA. Mettili entrambi sul tuo server e modifica i valori nel file Plist in modo che corrispondano agli URL HTTPS sul tuo server. Quindi usi un link speciale per collegarti al manifest di Plist e apparirà chiedendo all'utente di installare la tua app. Se tutto va bene, l'utente avrà la tua app. Devi anche codificare il tuo metodo di aggiornamento se lo desideri.

Se questa è un'app che vuoi distribuire a questo punto, potrebbe essere più sensato metterla effettivamente sull'App Store o se questo è per il beta test, utilizza TestFlight. Se disponi di un account sviluppatore, puoi utilizzare TestFlight e saltare tutte queste cose per i test delle app. Tutto ciò che serve è la loro e-mail e far loro installare l'app TestFlight dall'App Store. TestFlight può essere gestito da iTunes Connect.


E una volta che ti sei registrato per lo sviluppatore, come distribuisci l'app?
ziggurismo

Aggiornato il mio post con le istruzioni.
AppleBetas,

Grazie, è quello che stavo cercando. So che hai detto che era necessario disporre di un account di sviluppo a pagamento e provisioning di UDID, ma mi piacerebbe provare questo metodo senza prima. Riporterò indietro i risultati.
ziggurismo

Seguendo le istruzioni per creare un archivio, ma i pulsanti "Carica su app store", "convalida" ed "esporta" erano tutti oscurati, con un link sotto che diceva "La distribuzione richiede l'iscrizione all'Apple Developer Program" che ha dato il via a una pagina Web per registrarmi all'ADP. Quindi, da un lato, è come hai promesso: sembra che sia richiesto un abbonamento di $ 99 al Programma per gli sviluppatori Apple, anche se vuoi solo fare una distribuzione ad hoc over-the-air (OTA) della tua app. La GUI XCode non creerà l'IPA e il profilo di provisioning.
ziggurismo il

D'altra parte, a stackoverflow.com/questions/26928721/... affermazioni Khawar utente che può essere fatto senza il sub ADP utilizzando la xcodebuildriga di comando che creerà l'archivio .ipa così come segno e disposizione l'applicazione se si utilizza la -exportProvisioningProfilebandierina (vedi commento di Pankaj Rathor).
ziggurismo il

1

Fondamentalmente, qualcuno deve firmare l'app. È possibile ottenere il file IPA, ma non verrà eseguito su dispositivi arbitrari. Concentrati su questo e deciderai rapidamente se vuoi sopportare il fastidio di ogni persona che utilizza Xcode o se ha senso pagare Apple per la firma delle tue app.

Se fai affidamento sull'accesso non sviluppatore di iOS 9 con un vecchio ID Apple, tutti i tester devono accedere con il tuo ID Apple per eseguire l'app.

Puoi pagare per Apple per gestire gli account e la firma pagando per un anno di account per sviluppatori. Quindi puoi inviare un'e-mail, far apparire l'app su qualsiasi server, utilizzare TestFlight o, in generale, metodi più semplici per te oltre a distribuire il tuo ID Apple ai tester / utenti dell'app.

Puoi sempre inviare il codice sorgente a tuo fratello se ha Xcode, ma hai detto che era il punto di non avere qualcuno con un Mac da installare e firmare l'app.

La rottura del carcere è più facile che forgiare la catena di certificati di Apple, ma non lo consiglio.


Dove dovrebbero accedere i tester con il mio ID Apple per eseguire le app firmate non sviluppatore?
ziggurismo il

In Xcode usare il tuo Mac è il più semplice. Vorrei che ti mandassero il telefono per caricare l'app se non riusciva a raggiungere Xcode ...
bmike

Sì, l'installazione da Xcode su USB funziona alla grande. La mia domanda riguardava la possibilità di distribuzione / installazione remota. StackExchange l'ha fatto per la sua app beta. Voglio farlo anch'io.
ziggurismo il

@ziggurism SE ha pagato un certificato aziendale. Avrai bisogno di un po 'di documenti legali per farlo accadere. Inoltre diverse centinaia di $ all'anno. TestFlight è l'opzione più economica e meno di un'area grigia. Ciò che SE ha fatto non è probabile "secondo il libro" secondo la licenza per i certificati utilizzati, ma io non sono un avvocato ...
bmike
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.