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)
我相信那是因为我们使用的是WKWebKit
, WKWebKit
支持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
类。 它仍然导入UIKit
和WebKit
。 但是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。