包括 iOS8 WebKit 框架验证失败

标签: Xcode ios
发布时间: 2017/3/27 20:15:24
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用 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 框架,但它当时是私人。

因此动态链接到 WebKit 图书馆 !在 XCode,如何能做这个?

解决方法 1:

好了,终于得到了这个工作经过许多小时的挫折。

直到苹果修复验证,关键是要对 WebKit 框架在运行时动态链接。您的项目应已经使用运行时检查以优雅地回落到 UIWebView 的 iOS7 以及更早的版本,即检查 [WKWebView 班]。

第 1 步︰从项目设置中移除 WebKit 框架。转到你的目标--链接框架和库,> 一般 > 并删除 WebKit。在这一点上,您的代码可以编译,但不能因为它不能解决的 WKWebView 和相关联的符号链接。

第 2 步︰编辑您的 main.m 文件来动态加载库︰

#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 中使用运行时 OS 版本检查。库位置是不同的模拟器与实际的设备,所以用于条件编译检查的。

第 3 步︰因为图书馆动态加载的调用 [WKWebView 班] 和 [WKWebView 分配] 不会工作。通过您的代码,更改的每个实例

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

和每次你分配 WKWebView 更改︰

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

为了关联的类,包括 WKWebViewConfiguration、 WKProcessPool、 WKUserScript,和不管,也必须这样做别人使用的。检查任何你可能已经错过了你的链接器错误。

第 4 步︰现在应当能够成功编译您的代码。包装,提交到应用程序商店,并庆祝。

赞助商