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.
- 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.
- 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? ) - 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.
- 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). - Per eseguire il provisioning di un'app per un dispositivo, deve contenere l'UDID del dispositivo nel
embedded.mobileprovision
file, 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.)}
- Ok, quindi dobbiamo dimetterci dall'app. Xcode fornisce uno strumento da riga di comando chiamato
codesign
che 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 è comecodesign -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-rules
bandiera veniva utilizzata per indicare quali parti di un'app devono essere firmate, ma poiché iOS8 è obsoleto e l'intera app deve essere firmata. - 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 malformed
eA 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? - 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.
- 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 xcrun
posto di quello xcodebuild
che ho usato.