2013-06-04 12 views
19

In Xcode, posso impostare un framework su "Opzionale" invece di "Richiesto", il che significa che il framework è debole.Che cosa significa "collegare debole" un framework?

Ciò significa che il framework è incluso nel pacchetto solo quando viene importato da qualche parte?

Voglio debole-link alcuni quadri di debug che utilizzano API private, e non voglio che vengano visualizzati nello Store costruzione App.

risposta

3

Ho riscontrato un collegamento debole durante l'utilizzo di iAds. Il problema era se io collegavo fortemente il framework iAds ed eseguivo l'app su un dispositivo con SDK che non supportava iAds, quindi si bloccherebbe semplicemente. I collegamenti deboli hanno permesso di evitare gli arresti anomali. Continuo a credere che anche con collegamenti deboli devi ancora verificare il codice se il framework è disponibile o meno.

+0

Ok, quindi il collegamento debole include ancora il framework di debug che utilizza API private e pertanto Apple rifiuta ancora l'app. – openfrog

+0

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. –

2

Ciò significa che il framework è incluso nel pacchetto solo quando viene importato da qualche parte?

Questo dipende da come sono stati configurati i vostri schemi o obiettivi.

È possibile utilizzare uno schema solo per il debug e includere solo il framework opzionale. Usa un altro schema senza il framework opzionale per il rilascio.

Scheme Example

UPDATE

A tale scopo, basare il nuovo schema su una configurazione di progetto e impostare OTHER_LDFLAGS come descritto in hagi's answer.

Project Configurations and Schemes

+0

Uno schema, o devo creare un intero nuovo obiettivo per escludere in sicurezza il framework? – openfrog

+0

E come posso ottenere questo con un semplice schema? La sezione dei framework collegati è legata al target/progetto? – openfrog

+0

È possibile basare uno schema su una configurazione di progetto e utilizzare la spiegazione di @ hagi per impostare "OTHER_LDFLAGS" di conseguenza. – mkalmes

16

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:

Adding framework via linker flags

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.

+0

La domanda dell'OP indica che usa un framework non Apple. Quindi il framework deve essere aggiunto al pacchetto. – mkalmes

+0

Non sono sicuro se esistono framework che è possibile, ma non devono collegarsi in modo dinamico perché sono privati? Se il framework è collegato staticamente, il weak-linking non si applica/ha senso dopo tutto. – hagi

+0

Apple non fornisce un modo ufficiale per costruire un framework, ma non è impossibile. Google fornisce un framework per il loro [Google+ iOS SDK] (https://developers.google.com/+/downloads/). Il titolo della domanda dell'OP e la descrizione non corrispondono molto bene.Presumo che sia più interessato a omettere il framework di debugging che a "weak-linking". – mkalmes