2015-11-19 5 views
6

La nostra azienda desidera distribuire un SDK closed-source per iOS ai nostri clienti. Ho usato Cocoapods per costruire il framework e creato un'app di esempio che ne facesse uso. In precedenza l'app ha funzionato bene sul simulatore e anche quando è stata installata sul dispositivo. Tuttavia, stavo anche incorporando il file Pods.framework nell'app stessa. Un'altra informazione che potrebbe interessare è che il framework è scritto in Swift, le dipendenze dei cocoapodi incluse sono sia Swift che Objective-C.Embedding framework all'interno di framework Swift closed-source

Volevo rendere i requisiti dei pod più facili da gestire, quindi l'utente non deve preoccuparsi di loro e ha cercato di incorporare il file Pods.framework all'interno dell'SDK che stiamo costruendo, quindi ho rimosso i passaggi per Incorpora pods framework e Copia le risorse dei pod dall'app di esempio, lasciandoli solo nel framework, ho rimosso anche Pods.framework come dipendenza dall'app di esempio, lasciandolo solo nell'SDK. Questo sembrava funzionare nel simulatore, ma l'app ora si blocca sul dispositivo mobile con dyld: Errore libreria non caricato.

Al momento la ricerca è, mi sono imbattuto in un paio di discussioni correlate: https://github.com/CocoaPods/CocoaPods/issues/344https://objectpartners.com/2014/06/25/developing-private-in-house-libraries-with-cocoapods/

Tuttavia, la soluzione suggerita di utilizzare baccelli privati ​​non sembra che avrebbe funzionato per noi, è la mia comprensione che il codice sorgente in il pod privato sarebbe ancora aperto e non possiamo condividerlo con i nostri clienti.

Qualcuno potrebbe consigliare una soluzione che funzionerebbe in questo caso?

+0

ho avuto lo stesso problema esattamente come lei non troppo tempo fa e rinunciato a causa di frustrazione. In realtà, era all'incirca alla stessa ora. Purtroppo non ho trovato soluzione. Fortunatamente ero all'inizio dello sviluppo del mio framework quindi l'ho cambiato in Objective-C in modo che potesse essere closed source. Ho quindi abbandonato i Pod e ho appena importato il progetto 1 necessario nel suo progetto. – lespommes

+0

Penso che il tuo primo link potrebbe non essere quello che intendevi. Si collega a una libreria di grafici a torta. Hai mai capito come farlo? C'è una buona quantità di documentazione su come creare un cocoapod privato, ma non riesco a trovare nulla su come creare un cocoapod a codice chiuso, o almeno nessuno che non sia incredibilmente vago. – shmim

+0

Hai ragione, il link sembra non essere correlato, probabilmente ho collegato per errore un problema CocoaPod sbagliato, sfortunatamente non ricordo quello originale che intendevo. L'ho capito e posso postare la mia soluzione, anche se è fragile e richiede qualche salto a cerchio. –

risposta

1

OK, finalmente ho una soluzione più duratura. E 'una versione modificata, più pulita del mio vecchio, ora che ho capito i collegamenti come Xcode nei miei Swift sub-framework meglio

problema che rende la distribuzione/raccolta un po' brutto:

Dal librerie standard Swift non sono in bundle sul dispositivo come Obj-C, né sono garantiti per essere stabile tra le versioni ancora (interfaccia binaria stabile promessa in Swift 3: https://github.com/apple/swift-evolution#development-major-version--swift-30), dobbiamo assicurarci che l'intero progetto sia compilato rispetto alla stessa versione di Swift. Ciò significa che il tizio che usa il tuo framework closed-source deve usare la stessa versione di Swift nel loro Xcode per il loro progetto come hai fatto per compilare la libreria, anche se non usa Swift nel suo codice perché alla fine è la sua versione di Swift che viene inserito nell'app e viene eseguito il tuo SDK. Questo è solo un problema per i framework closed-source perché quelli open-source saranno sempre compilati rispetto alla stessa versione del progetto finale. Possibile soluzione alternativa è limitare i client alla stessa versione utilizzata o distribuire più compilation (ad esempio Swift 2.1 e Swift 2.0). Per rimediare a ciò, è possibile fornire agli utenti copie di binari compilate su più versioni di Swift.

A parte questo, ecco quello che ho dovuto fare durante la compilazione/distribuzione per fare un quadro binario che funziona a Swift:

Quando si costruisce il quadro:

  • Nel target del progetto, assicurati di aggiungere Pods.framework a Framework e librerie collegate (assicurati che questa sia una versione RED precompilata di Pods.framework, ho avuto un pod compilato in nero.framework nella stessa directory che ha costruito bene, ma poi ha generato un framework che avrebbe causato lamentele all'architettura armv7 mancante durante la fase linker in un progetto successivo)
  • In Build Settings, nella sezione Definito dall'utente, aggiungere un campo chiamato BITCODE_GENERATION_MODE e impostarlo per codice binario che
  • non #import eventuali quadri nella vostra intestazione bridging, tutte le istruzioni che ti dice di fare, che sono rimasti dalla Swift 1,0-1,2 giorni, non hai bisogno di più e lo fa più male che bene (il progetto successivo si lamenterà che non riesce a trovare queste intestazioni che non sono nemmeno esposte ad esso)
  • Cambiamento di destinazione di generazione per generico dispositivo iOS, Archivio e esportazione quadro

Quando si costruisce il progetto con il quadro:

  • Trascinare e rilasciare il quadro nel progetto, nella scheda Generale aggiungerlo a binari incorporati e Strutture e librerie collegate (è sufficiente aggiungere il framework stesso, non i sub-framework o il file baccello)
  • Nella scheda Impostazioni del torso, aggiungere un nuovo percorso per quadro percorsi di ricerca: $ (project_dir) /MyFramework.framework/ qUADRI
  • genera il progetto
+0

Non capisco come questo risolva il tuo rapido problema di versione. Cosa succede se il tuo cliente sta utilizzando swift 2.3 e il tuo framework è compilato contro 3.0? –

+0

In quello stesso paragrafo, le due frasi direttamente dopo spiegano i 2 possibili soluzioni alternative. A parte questo, non c'è una buona soluzione finché Swift non smette di procrastinare sulla standardizzazione del loro ABI. –

+0

@AlexanderTsepkov è possibile distribuire un framework compilato per ogni versione di Swift. Questo può essere automatizzato. – Demi