2014-09-17 3 views
11

Sto usando WKWebView del framework WebKit e quando si tenta di inviare ad App Store, ottengo questo errore:Compreso quadro WebKit per iOS 8 non riesce la convalida

Your app contains non-public API usage. Please review the errors, correct them, and resubmit your application. 
The app links to non-public libraries in Payload...: /System/Library/PrivateFrameworks/WebKit.framework/WebKit 

Se ho impostato la destinazione di distribuzione a 8,0, quindi il l'errore va via, ma mi piacerebbe anche supportare iOS 7. L'errore sembra essere il risultato di iOS7 che ha anche il framework WebKit, ma era privato allora.

Vorrei quindi collegarmi dinamicamente alla libreria WebKit. Come posso farlo in XCode?

+0

È necessario ricorrere a UIWebView quando gli utenti sono su iOS 7 (non è chiaro che lo stavate provando). Questo dovrebbe funzionare: http://stackoverflow.com/q/25341238/1580288 – EthanB

+0

eseguo controlli di runtime per iOS7 e utilizzo UIWebView. Funziona bene sui miei dispositivi di sviluppo. Il problema che sto provando è di passare la convalida. Grazie! – weiyin

+0

Ho lo stesso problema. Uso WebKit solo su iOS 8, ma la mia app viene distribuita su iOS 7 –

risposta

16

Bene, finalmente ha funzionato dopo molte ore di frustrazione.

Fino a quando Apple non risolve la convalida, la chiave è di collegarsi dinamicamente al framework WebKit in fase di runtime. Il progetto dovrebbe già utilizzare i controlli di runtime per tornare agevolmente a UIWebView per iOS7 e versioni precedenti, ovvero per verificare la [classe WKWebView].

Passaggio 1: Rimuovere il framework WebKit dalle impostazioni del progetto. Vai al tuo obiettivo -> Generale -> Framework e librerie collegate e rimuovi WebKit. A questo punto, il tuo codice verrà compilato ma non riuscirà a collegarsi perché non può risolvere WKWebView e i simboli associati.

Fase 2: Modificare il file main.m di caricare la libreria in modo dinamico:

#import <UIKit/UIKit.h> 
#import <TargetConditionals.h> 
#import <dlfcn.h> 
#import "MyAppDelegate.h" 

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

int main(int argc, char * argv[]) 
{ 
    @autoreleasepool { 
     // Dynamically load WebKit if iOS version >= 8 
     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { 
#if TARGET_IPHONE_SIMULATOR 
      NSString *frameworkPath = [[NSProcessInfo processInfo] environment][@"DYLD_FALLBACK_FRAMEWORK_PATH"]; 
      if (frameworkPath) { 
       NSString webkitLibraryPath = [NSString pathWithComponents:@[frameworkPath, @"WebKit.framework", @"WebKit"]]; 
       dlopen([webkitLibraryPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_LAZY); 
      } 
#else 
      dlopen("/System/Library/Frameworks/WebKit.framework/WebKit", RTLD_LAZY); 
#endif 
     } 

     return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class])); 
    } 
} 

Io uso un controllo runtime versione del sistema operativo perché Apple permette solo libreria di caricamento dinamico a partire dal iOS 8. La posizione della libreria è diverso per il simulatore rispetto ai dispositivi reali, quindi uso la compilazione condizionale per verificarlo.

Passaggio 3: Poiché la libreria viene caricata in modo dinamico, la chiamata [classe WKWebView] e [allocazione WKWebView] non funzioneranno. Passare attraverso il codice, che cambia ogni istanza di

[WKWebView class] 
// change to: 
NSClassFromString(@"WKWebView") 

e cambiare ogni volta che si assegna un WKWebView:

[WKWebView alloc] 
// change to: 
[NSClassFromString(@"WKWebView") alloc] 

È inoltre necessario fare questo per le classi associate, tra cui WKWebViewConfiguration, WKProcessPool, WKUserScript, e qualsiasi altra cosa stai usando. Controlla gli errori del linker per qualsiasi cosa tu abbia perso.

Passaggio 4: Ora il codice deve essere compilato correttamente. Imballa, invia all'app store e festeggia.

+0

Per il passaggio 2, un metodo alternativo consiste nell'aggiungere la libreria come facoltativa, anziché necessaria se necessario per supportare iOS7. – jianhua

+0

L'errore di convalida ritorna quando aggiungo WebKit.framework come facoltativo. Ma risulta che se hai spostato tutto in NSClassFromString, allora il linker sulle classi non è affatto necessario! Sto aggiornando per rimuovere il passaggio non necessario. – weiyin

+0

Ho incontrato lo stesso problema. Grazie per l'[email protected] Poiché la libreria è caricata in modo dinamico, non è così comodo utilizzare WKWebView e le classi associate. Ho scritto una classe di chiamata per eseguire selettori con qualsiasi tipo di parametri. Spero di aiutare gli altri. [collegamento] [1] [1]: https://github.com/jnuhwb/WBInvocation –