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

时间:2014-08-16 14:42:22

标签: 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_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)

我相信这是因为我们使用的是WKWebKit,仅受iOS 8+支持。我们可以在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也不解决编译时间问题)

    if ((UIDevice.currentDevice().systemVersion as NSString).floatValue >= 8.0) {

    } else {

    }

更新:kkoltzau有正确的答案。我正在为其他人添加更多信息。

首先,转到Project,点击General,向下滚动到Linked Frameworks and Libraries,然后将WebKit.framework添加为可选。 (我也是为UIKit.framework做的)见截图:

enter image description here

至于我的WebViewController课程。它仍会导入UIKitWebKit。但viewDidLoad()根据kkoltzau的例子设置了视图。然后,每当我需要加载/重新加载网页时,它都会检查是否存在wkWebView

2 个答案:

答案 0 :(得分:17)

您需要检查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];
}

夫特:

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)
}

然后在你的代码的其他地方:

目标-C:

if(wkWebView) {
    // WKWebView specific code
}
else {
    // UIWebView specific code
}

夫特:

if let w=wkWebView {
    // WKWebView specific code
}
else if let w=uiWebView {
    // UIWebView specific code
}

答案 1 :(得分:2)

如果您需要支持iOS7,则不能使用WebKit2(WK*)类,或者您需要实现两倍的逻辑,一次使用WK*进行iOS8,一次使用UIWeb*,并在运行时根据操作系统版本进行选择。