Подтвердить что ты не робот

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.

4b9b3361

Ответ 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*, а во время выполнения выберите в соответствии с версии операционной системы.