包括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步:现在你的代码应该成功编译。 打包,提交到应用程序商店,并庆祝。
- 如何在app delegate(obj-c)中添加UIAlertController
- 代码签名错误每当我尝试更换新的SceneKit应用程序中的股票文件
- 如何仅在用户默认密钥不存在时才显示login屏幕?
- CoreAnimation,在iOS 5 Xcode 4中移动带有animation阴影的UIImageView
- 我可以从NSHTTPURLResponse中的HTTP状态行访问“Reason Phrase”(原因短语)吗?
- WWCodeDFW iOS工作区入门
- 在iOS中检测iTunes Store的国家
- NSP预先消除了SQL的GROUP BY等价物
- 问题加载子实体mangedobject在coredata