Nota importante: Questa risposta è stata scritta prima che iOS 8 è stato annunciato. Mentre i dettagli tecnici si applicano ancora ai framework di sistema, ora è possibile creare i propri framework collegati dinamicamente che vengono forniti all'interno del pacchetto di app. Esistono restrizioni, ad esempio, solo un'app e le sue estensioni possono collegarsi alla stessa istanza di un framework incorporato, ma resta il fatto che l'infrastruttura personalizzata, collegata dinamicamente è possibile da iOS 8. Se vuoi saperne di più, fai riferimento a this guide (Utilizzo di un framework incorporato per condividere il codice) e WWDC 2014 sessione 416, Creazione di framework moderni.
risposta originale: Nessuna delle discipline (piattaforma) è davvero "inclusi nel bundle". Invece, la tua app ha un riferimento ("link") a un framework dopo averlo aggiunto alla fase di compilazione "Collega il file binario con la libreria". I framework sono preinstallati sui dispositivi. Quando esegui un'applicazione, tutti i riferimenti alle strutture dell'app vengono risolti dal linker dinamico (sul dispositivo), il che significa che il codice framework viene caricato in modo che la tua app possa utilizzarlo.
Alcuni framework potrebbero non essere disponibili su tutti i dispositivi che si intende supportare, ad esempio, PassKit è stato introdotto in iOS 6. Se si esegue un'app che si collega a PassKit su un dispositivo iOS 5, si blocca subito dopo il lancio, perché il linker dinamico non riesce a trovare il framework sul dispositivo.Tuttavia, se si esegue il collegamento debole con PassKit, il linker dinamico imposterà tutti i simboli del framework su nil
, se non è possibile trovare il framework. Questo impedisce l'applicazione da crash e si può controllare la disponibilità dei simboli in fase di esecuzione, ad esempio:
if ([PKPass class]) {
// Class is available - use it
PKPass *pass = [[PKPass alloc] init];
}
[PKPass class]
è sicuro da usare su tutti i dispositivi/sistemi in quanto il simbolo PKPass
classe saranno nil
su sistemi più vecchi, e messaggistica nil
non è un problema in Objective-C.
Altro su Debole-Linking: Apple Documentation
Per rispondere alla tua domanda in realtà:
Vuol dire che il quadro è incluso solo nel bundle quando viene importato da qualche parte?
No. Il quadro sarà sempre legata dalla app. Solo quando il framework non viene trovato sul dispositivo effettivo su cui è in esecuzione la tua app, il framework non verrà caricato.
Una soluzione sarebbe avere obiettivi separati per Debug e App Store Build. Un'alternativa è di non usare la fase di compilazione "Link Binary con Library" incorporata da Xcode, ma di collegare i framework di Debug tramite le opzioni del linker. Questi possono essere specificati per ogni configurazione (Debug/Release/...) a parte, in questo modo:
Se ci si vuole debole-link esso, utilizzare -weak_framework PassKit
(PassKit, naturalmente, essendo solo un esempio qui ... inserisci il nome del tuo framework). Se il tuo framework Debug non si trova in una delle directory framework predefinite, potresti dover fornire un percorso completo o modificare il percorso di ricerca di Frameworks. Inoltre, dovresti probabilmente usare le macro per assicurarti che nessuno del codice che utilizza i framework di debug lo faccia alla build App Store.
Modifica: Un'altra opzione poiché Xcode 5 deve utilizzare @import <FrameworkName>;
. In questo modo, puoi lasciare la fase "Link binario ..." vuota e attivare il collegamento di framework nel codice. È quindi possibile utilizzare macro come DEBUG
per assicurarsi che alcuni framework non vengano utilizzati per le build di App Store. C'è uno excellent answer riguardante @import
.
Ok, quindi il collegamento debole include ancora il framework di debug che utilizza API private e pertanto Apple rifiuta ancora l'app. – openfrog
apis privati non sono no con la mela. Probabilità che la tua app venga catturata e rifiutata a causa di quella alta. la risposta di azamsharp è corretta. Mi sono imbattuto in questo problema solo pochi giorni fa. –