2014-09-17 4 views
11

Ich bin mit dem WKWebView WebKit-Framework und wenn auf den App Store einreichen versucht, bekomme ich diesen Fehler:Inklusive WebKit Rahmen für iOS8 versagt Validierung

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 

Wenn ich das Implementierungsziel auf 8,0 eingestellt, dann dem der Fehler verschwindet, aber ich möchte auch iOS 7 unterstützen. Der Fehler scheint das Ergebnis zu sein, dass iOS7 auch das WebKit-Framework hatte, aber es war damals privat.

Ich möchte daher dynamisch auf die WebKit-Bibliothek verlinken. Wie kann ich das in XCode tun?

+0

Sie müssen auf UIWebView zurückgreifen, wenn Ihre Benutzer auf iOS 7 sind (es ist nicht klar, dass Sie das versucht haben). Das sollte funktionieren: http://stackoverflow.com/q/25341238/1580288 – EthanB

+0

Ich überprüfe die Laufzeit für ios7 und benutze UIWebView. Es läuft gut auf meinen Entwicklungsgeräten. Das Problem, das ich habe, versucht, die Validierung zu bestehen. Vielen Dank! – weiyin

+0

Ich habe das gleiche Problem. Ich verwende nur WebKit für iOS 8, aber meine App wird für iOS 7 bereitgestellt –

Antwort

16

Nun, endlich funktioniert das nach vielen Stunden der Frustration.

Bis Apple die Validierung behebt, besteht der Schlüssel darin, zur Laufzeit dynamisch mit dem WebKit-Framework zu verknüpfen. Ihr Projekt sollte bereits Laufzeitüberprüfungen verwenden, um problemlos auf UIWebView für iOS7 und früher zurückzugreifen, d. H. Nach [WKWebView-Klasse] zu suchen.

Schritt 1: Entfernen Sie das WebKit-Framework aus den Projekteinstellungen. Gehe zu deinem Ziel -> Allgemein -> Verknüpfte Frameworks und Bibliotheken und entferne WebKit. An diesem Punkt wird der Code zwar kompiliert, aber nicht gelinkt, da WKWebView und die zugehörigen Symbole nicht aufgelöst werden können.

Schritt 2: Bearbeiten Sie Ihre main.m Datei dynamisch die Bibliothek zu laden:

#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])); 
    } 
} 

Ich benutze eine Runtime-O Versionsprüfung weil Apple nur die dynamischen Laden in iOS Ausgangsbibliothek ermöglicht 8. Die Bibliothek Lage ist für den Simulator anders als tatsächliche Geräte, so dass ich bedingte Kompilierung verwenden, um dies zu überprüfen.

Schritt 3: Da die Bibliothek dynamisch geladen wird, funktioniert der Aufruf von [WKWebView class] und [WKWebView alloc] nicht. Gehen Sie durch Ihren Code, ändert jede Instanz

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

Und jedes Mal, ändern Sie teilen einen WKWebView:

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

Sie müssen auch tun dies für die zugehörigen Klassen, einschließlich WKWebViewConfiguration, WKProcessPool, WKUserScript, und was auch immer du benutzt. Überprüfen Sie Ihre Linker-Fehler für alles, was Sie möglicherweise verpasst haben.

Schritt 4: Jetzt sollte Ihr Code erfolgreich kompilieren. Paket, senden Sie an den App Store und feiern Sie.

+0

Für Schritt 2 ist eine alternative Methode, die Bibliothek als optional hinzuzufügen, anstatt erforderlich, um iOS7 zu unterstützen. – jianhua

+0

Der Validierungsfehler kommt zurück, wenn ich WebKit.framework als optional hinzufüge. Aber es stellt sich heraus, wenn Sie alles auf NSClassFromString verschoben haben und dann den Linker über die Klassen zu informieren, ist überhaupt nicht notwendig! Ich aktualisiere, um den unnötigen Schritt zu entfernen. – weiyin

+0

Ich treffe dasselbe Problem. Danke für den [email protected] Da die Bibliothek dynamisch geladen wird, ist es nicht so bequem, WKWebView und die zugehörigen Klassen zu verwenden. Ich habe eine Aufrufklasse geschrieben, um Selektoren mit beliebigen Parametern auszuführen. Hoffnung, anderen zu helfen. [link] [1] [1]: https://github.com/jnuhwb/WBInvocation –