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

我们正在iOS 8 SDK上使用Xcode 6 beta 5 + Swift创build应用程序。 我们也想部署到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) 

我相信那是因为我们使用的是WKWebKitWKWebKit支持iOS 8+。 我们可以使用iOS 7的WKWebKit ,但iOS的WKWebKit 8.我们如何定义?

我们的class级定义看起来像这样…

 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 )看截图:

在这里输入图像说明

至于我的WebViewController类。 它仍然导入UIKitWebKit 。 但是viewDidLoad()根据kkoltzau的例子设置视图。 然后,无论何时我需要加载/重新加载网页,它检查存在的wkWebView

您需要检查WKWebView是否可用,如果不是,则返回到UIWebView。

确保你的弱链接WebKit.framework(设置为可选)

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

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

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

如果您需要支持iOS7,则无法使用WebKit2( WK* )类,或者需要实现两次逻辑,一次是使用WK* UIWeb*UIWeb*一次是使用UIWeb* ,并且在运行时根据操作系统版本进行select。