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.
È 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
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
Ho lo stesso problema. Uso WebKit solo su iOS 8, ma la mia app viene distribuita su iOS 7 –