Xcode 6 + iOS 8 SDK, но развертывание на iOS 7 (UIWebKit & WKWebKit)
Мы создаем приложение, используя Xcode 6 beta 5 + Swift на iOS 8 SDK. Мы также хотели бы установить 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+. Мы в порядке с использованием UIWebKit
для iOS 7, но WKWebKit
для iOS 8. Как мы определяем это?
Определение нашего класса выглядит следующим образом:
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
. Он по-прежнему импортирует UIKit
и WebKit
. но viewDidLoad()
устанавливает представление, основанное на примере kkoltzau. Затем, когда мне нужно загрузить/перезагрузить веб-страницу, он проверяет существование wkWebView
.
Ответы
Ответ 1
Вам нужно будет проверить, доступен ли 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];
}
Swift:
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
}
Swift:
if let w=wkWebView {
// WKWebView specific code
}
else if let w=uiWebView {
// UIWebView specific code
}
Ответ 2
Если вам нужно поддерживать iOS7, вы не можете использовать классы WebKit2 (WK*
), или вам нужно дважды реализовать логику, один раз для iOS8 с помощью WK*
и один раз с помощью UIWeb*
, а во время выполнения выберите в соответствии с версии операционной системы.