包括iOS8的WebKit框架未通过validation

我正在使用WebKit框架的WKWebView,当试图提交到app store,我得到这个错误:

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 

如果我将部署目标设置为8.0,那么错误消失,但我也想支持iOS 7。 这个错误似乎是iOS7也有WebKit框架的结果,但当时它是私有的。

我想因此dynamic链接到WebKit库。 我怎样才能在XCode中做到这一点?

那么,在经历了几个小时的挫折之后终于有了这个工作。

在Apple修复validation之前,关键是在运行时dynamic链接到WebKit框架。 您的项目应该已经使用运行时检查来正常回退到iOS7和更早版本的UIWebView,即检查[WKWebView类]。

第1步:从项目设置中删除WebKit框架。 转到您的目标 – >常规 – >链接框架和库,并删除WebKit。 在这一点上,您的代码将编译但无法链接,因为它无法parsingWKWebView和相关的符号。

第2步:编辑您的main.m文件以dynamic加载库:

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

我使用运行时操作系统版本检查,因为苹果只允许从iOS 8开始dynamic库加载。模拟器与实际设备的库位置是不同的,所以我使用条件编译来检查。

步骤3:由于库是dynamic加载的,因此调用[WKWebView类]和[WKWebView alloc]将不起作用。 浏览你的代码,改变每个实例

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

每当你分配一个WKWebView:

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

您还必须为关联的类执行此操作,包括WKWebViewConfiguration,WKProcessPool,WKUserScript以及您正在使用的任何其他类。 检查你的链接器错误,你可能错过了任何东西。

第4步:现在你的代码应该成功编译。 打包,提交到应用程序商店,并庆祝。