Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 6+;iOS 8 SDK,但部署在iOS 7上(UIWebKit和WKWebKit)_Ios_Xcode_Ios7_Swift_Ios8 - Fatal编程技术网

Xcode 6+;iOS 8 SDK,但部署在iOS 7上(UIWebKit和WKWebKit)

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

我们正在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_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,所以我需要添加它并设置为可选。