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

Поддержка Xcode 9 GM - WKWebView NSCoding была нарушена в предыдущих версиях

Кто-нибудь знает, как исправить эту ошибку с Xcode 9 GM? Я работаю над приложением, созданным с помощью Xcode 8.3, цель развертывания - для iOS 9.3, и у меня никогда не было этой проблемы раньше. Я пока не нахожу никакой информации здесь или на форумах Apple :(

Изменение: эта ошибка возникла, когда я поместил WKWebView в конструктор интерфейса, а не если я использую его программно.

See picture WKWebView Error

Изменить 2: Ну, это, наконец, не ошибка, см. ответ куинн ниже, чтобы получить больше информации об этом поведении. Спасибо ему за объяснение.

4b9b3361

Ответ 1

Ошибка - это правильное поведение, а не ошибка в Xcode 9. Хотя WKWebView был представлен в iOS 8, в -[WKWebView initWithCoder:] была ошибка, которая исправлялась только в iOS 11, которая всегда вылетала во время выполнения и, следовательно, препятствовала настройке в Интерфейсе. Builder.

https://bugs.webkit.org/show_bug.cgi?id=137160

Вместо того, чтобы позволять разработчикам создавать что-то в IB, которое будет сломано во время выполнения, это ошибка сборки. Это неудобное ограничение, поскольку iOS 11 была выпущена совсем недавно, но другого хорошего варианта нет.

Обходной путь для старых целей развертывания состоит в том, чтобы продолжать добавлять WKWebView в код, как @fahad-ashraf уже описал в своем ответе:

https://developer.apple.com/documentation/webkit/wkwebview

Ответ 2

Это, кажется, ошибка в Xcode 9 и также присутствовала в бета-версиях. Вы получите ошибку сборки, только если вы создаете WKWebView через раскадровку. Если вы постепенно создадите WKWebView в соответствующем файле класса ViewController, вы сможете использовать версии для iOS ниже iOS 11. Вот подход, предложенный на веб-сайте Apple, для достижения этой цели:

import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {

    var webView: WKWebView!

    override func loadView() {
        super.loadView()
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()

        let myURL = URL(string: "https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }}

После этого вы сможете реализовать функциональность WKWebView, как обычно.

Источник: https://developer.apple.com/documentation/webkit/wkwebview

Ответ 3

Если вы хотите реализовать пользовательский UIViewController с другими компонентами в дополнение, вы можете создать "контейнер" через раскадровку, называемую, например, webViewContainer:

import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
    @IBOutlet weak var webViewContainer: UIView!
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let webConfiguration = WKWebViewConfiguration()
        let customFrame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: 0.0, height: self.webViewContainer.frame.size.height))
        self.webView = WKWebView (frame: customFrame , configuration: webConfiguration)
        webView.translatesAutoresizingMaskIntoConstraints = false
        self.webViewContainer.addSubview(webView)
        webView.topAnchor.constraint(equalTo: webViewContainer.topAnchor).isActive = true
        webView.rightAnchor.constraint(equalTo: webViewContainer.rightAnchor).isActive = true
        webView.leftAnchor.constraint(equalTo: webViewContainer.leftAnchor).isActive = true
        webView.bottomAnchor.constraint(equalTo: webViewContainer.bottomAnchor).isActive = true
        webView.heightAnchor.constraint(equalTo: webViewContainer.heightAnchor).isActive = true
        webView.uiDelegate = self

        let myURL = URL(string: "https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }

Ответ 4

Если вы перешли со старой цели на iOS 11.0 и по-прежнему получаете эту ошибку, воспользуйтесь приведенным ниже решением.

  1. Перейдите в раскадровку (Main.storyboard), нажмите на любую сцену.
  2. Выберите "Инспектор файлов", который является правым окном свойств XCode
  3. Измените значение Builds для наiOS 11.0 и более поздние версии'
  4. . Компилировать и строить

enter image description here

Ответ 5

Я столкнулся с одной и той же проблемой, но ее можно решить, если мы добавим программный код WKWebView.

  • Сделайте любой дизайн, который вы хотите сделать в раскадровке, но оставите комнату для WKWebView, в этой области перетащите представление и назовите его как webViewContainer и объявите эти два свойства,

    @property (weak, nonatomic) IBOutlet UIView *webViewContainer;
    @property(nonatomic, strong)WKWebView *webView;
    
  • Теперь создайте и добавьте webView следующим образом:

    -(instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        self.webView = [self createWebView];
        self = [super initWithCoder:aDecoder];
        return self;
    }
    

    Функция createWebView объявляется как

    -(WKWebView *)createWebView
    {
         WKWebViewConfiguration *configuration = 
                   [[WKWebViewConfiguration alloc] init];
         return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
    }
    
  • Теперь добавьте этот вновь созданный webView в ваш контейнерный вид, например:

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
    
  • Наконец, просто загрузите свое Url, как это,

    -(void)webViewLoadUrl:(NSString *)stringUrl
    {
         NSURL *url = [NSURL URLWithString:stringUrl];
         NSURLRequest *request = [NSURLRequest requestWithURL:url];
         [self.webView loadRequest:request];
    }
    

Спасибо, что прочитали это.

Ответ 6

Этот метод работает только для некоторого веб-сайта. Я пробовал http://www.google.com и он не загружается.

Ответ 7

WebKit был представлен в iOS 8, но был выпущен с ошибкой, которая вызвала сбой во время выполнения. Если вы используете Xcode 9/10, поддержка конфигурации вашего проекта меньше, чем iOS 11 и если вы пытаетесь добавить WKWebView с помощью конструктора интерфейса. Xcode сразу показывает ошибку во время компиляции.

WKWebView до iOS 11.0 (поддержка NSCoding была прервана в предыдущей версии)

Хотя WKWebView был представлен в iOS 8, в [WKWebView initWithCoder:] была ошибка, которая была исправлена только в iOS 11.

enter image description here

Решение - вы должны добавить WKWebView через код (только если вы поддерживаете ниже iOS 11). Это на самом деле звучит странно.

Другое решение состоит в том, чтобы изменить сборки документов Interface Builder для этой опции на iOS 11 и более поздние версии (если вы переходите с более старой цели на iOS 11 и по-прежнему получаете ту же ошибку).

Ответ 8

У меня тоже возникла эта проблема, но когда я устанавливаю цель разработки на 11.0, проект может работать, но ошибка все еще существует.

Ответ 9

UIWebView устарел в iOS11, а WKWebView работает только в iOS11 - это звучит как ошибка в Xcode GM.