Xcode 6+;iOS 8 SDK,但部署在iOS 7上(UIWebKit和WKWebKit)
我们正在iOS 8 SDK上使用Xcode 6 beta 5+Swift创建一个应用程序。我们也希望部署到iOS 7。可能吗?当我们将项目的部署目标设置为7.0时,会出现如下编译时错误:Xcode 6+;iOS 8 SDK,但部署在iOS 7上(UIWebKit和WKWebKit),ios,xcode,ios7,swift,ios8,Ios,Xcode,Ios7,Swift,Ios8,我们正在iOS 8 SDK上使用Xcode 6 beta 5+Swift创建一个应用程序。我们也希望部署到iOS 7。可能吗?当我们将项目的部署目标设置为7.0时,会出现如下编译时错误: Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_WKPreferences", referenced from: __TMaCSo13WKPreferences in WebViewController.o "_OBJC_C
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_WKPreferences", referenced from:
__TMaCSo13WKPreferences in WebViewController.o
"_OBJC_CLASS_$_WKWebView", referenced from:
__TMaCSo9WKWebView in WebViewController.o
"_OBJC_CLASS_$_WKWebViewConfiguration", referenced from:
__TMaCSo22WKWebViewConfiguration in WebViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我相信这是因为我们使用的是仅iOS 8+支持的WKWebKit
。对于iOS 7,我们可以使用UIWebKit
,但是对于iOS 8,我们可以使用WKWebKit
。我们如何定义它
我们的类定义如下所示
import WebKit
class WebViewController: UIViewController, WKNavigationDelegate {
...
}
它被称为:
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let destinationVC = mainStoryboard.instantiateViewControllerWithIdentifier("WebViewController") as WebViewController
presentViewController(destinationVC, animated: true, completion: nil)
我曾考虑使用此片段调用presentViewController
,但这并不能解决编译时问题。(NSFoundationVersionNumber
也不能解决编译时问题)
更新:kkoltzau有正确的答案。我正在为其他人添加更多信息。
首先,转到您的项目
,单击常规
,向下滚动到链接的框架和库
,然后添加WebKit.framework
,作为可选项。(我也为UIKit.framework
)参见屏幕截图:
至于我的
WebViewController
课程。它仍然导入UIKit
和WebKit
。但是viewDidLoad()
根据kkoltzau的示例设置视图。然后,每当我需要加载/重新加载网页时,它都会检查是否存在wkWebView
如果需要支持iOS7,就不能使用WebKit2(WK*
)类,或者需要实现两次逻辑,一次用于iOS8使用WK*
,一次使用UIWeb*
,在运行时,根据操作系统版本进行选择。您需要检查WKWebView是否可用,如果不可用,请返回UIWebView
确保您的弱链接WebKit.framework(设置为可选)
目标C:
WKWebView *wkWebView = nil;
UIWebView *uiWebView = nil;
Class wkWebViewClass = NSClassFromString(@"WKWebView");
if(wkWebViewClass) {
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// ...
wkWebView = [[wkWebViewClass alloc] initWithFrame:frame configuration:config];
[self.view addSubview:wkWebView];
}
else {
uiWebView = [[UIWebView alloc] initWithFrame:frame];
[self.view addSubview:uiWebView];
}
if(wkWebView) {
// WKWebView specific code
}
else {
// UIWebView specific code
}
斯威夫特:
var wkWebView : WKWebView?
var uiWebView : UIWebView?
if NSClassFromString("WKWebView") {
let config = WKWebViewConfiguration()
// ...
wkWebView = WKWebView(frame: frame, configuration: config)
self.view.addSubview(wkWebView)
}
else {
uiWebView = UIWebView(frame: frame)
self.view.addSubview(uiWebView)
}
if let w=wkWebView {
// WKWebView specific code
}
else if let w=uiWebView {
// UIWebView specific code
}
然后在代码的其他地方:
目标C:
WKWebView *wkWebView = nil;
UIWebView *uiWebView = nil;
Class wkWebViewClass = NSClassFromString(@"WKWebView");
if(wkWebViewClass) {
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// ...
wkWebView = [[wkWebViewClass alloc] initWithFrame:frame configuration:config];
[self.view addSubview:wkWebView];
}
else {
uiWebView = [[UIWebView alloc] initWithFrame:frame];
[self.view addSubview:uiWebView];
}
if(wkWebView) {
// WKWebView specific code
}
else {
// UIWebView specific code
}
斯威夫特:
var wkWebView : WKWebView?
var uiWebView : UIWebView?
if NSClassFromString("WKWebView") {
let config = WKWebViewConfiguration()
// ...
wkWebView = WKWebView(frame: frame, configuration: config)
self.view.addSubview(wkWebView)
}
else {
uiWebView = UIWebView(frame: frame)
self.view.addSubview(uiWebView)
}
if let w=wkWebView {
// WKWebView specific code
}
else if let w=uiWebView {
// UIWebView specific code
}
这些是链接器错误,而不是编译器错误。您是从Xcode 6还是Xcode 5获取这些信息?顺便说一句-不要检查iOS版本来决定要做什么。相反,请检查是否存在给定类或方法的副本。所有这些的副本都不能解决有关链接器错误的问题。感谢kkoltzau,让我尝试并报告。有趣的是,您可以通过第二句中提到的“NSClassFromString”@rmaddy弱链接到WebKit.framework来设置类,这涵盖了链接器错误。感谢kkoltzau将WebKit.framework设置为可选。我不能粘贴屏幕截图,但我会这样做作为对其他人的回答。我的类还实现了
WKNavigationDelegate
,包括“func webView(webView:WKWebView,didStartProvisionalNavigation:WKNavigation)”和func webView(webView:WKWebView,didscommitNavigation:WKNavigation)
。如何将它们包括在本例中?关于“确保弱链接WebKit.framework(设置为可选)”的第2句话非常重要。实际上我甚至没有列出WebKit.Framework,所以我需要添加它并设置为可选。