web-dev-qa-db-fra.com

Xcode 9 GM - La prise en charge de WKWebView NSCoding était interrompue dans les versions précédentes.

Est-ce que quelqu'un sait comment corriger cette erreur avec Xcode 9 GM? Je travaille sur une application créée avec Xcode 8.3, la cible de déploiement est pour iOS 9.3 et je n'avais jamais eu ce problème auparavant. Je ne trouve aucune information ici ni sur Apple forums :(

Edit: cette erreur survient lorsque je mets un WKWebView dans le générateur d’interface, pas si je l’utilise par programme.

See picture WKWebView Error

Edit 2: Eh bien, ce n'est finalement pas un bug, voir la réponse de Quinn ci-dessous pour avoir plus d'informations sur ce comportement. Merci à lui pour les explications fournies.

130
Mehdi Chennoufi

L'erreur est un comportement correct et non un bogue dans Xcode 9. Bien que WKWebView ait été introduit dans iOS 8, il y avait un bogue dans -[WKWebView initWithCoder:] qui n'était corrigé que dans iOS 11, qui se bloquait toujours à l'exécution et empêchait donc la configuration d'un dans Interface Builder.

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

Plutôt que de permettre aux développeurs de créer quelque chose dans IB qui serait cassé au moment de l'exécution, il s'agit d'une erreur de construction. C'est une limitation gênante puisque iOS 11 n'a été publié que récemment, mais il n'y a vraiment aucune autre bonne option.

La solution de contournement pour les anciennes cibles de déploiement consiste à continuer à ajouter le code WKWebView dans le code, comme @ fahad-ashraf l'a déjà décrit dans sa réponse:

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

130
Quinn Taylor

Cela semble être un bug dans Xcode 9 et était également présent dans les bêtas. Vous n'obtiendrez l'erreur de construction que si vous créez un WKWebView via le storyboard. Si vous créez progressivement le WKWebView dans le fichier de classe ViewController correspondant, vous devriez pouvoir créer sur des versions iOS inférieures à iOS 11. Voici l'approche indiquée sur le site Web d'Apple pour y parvenir:

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

Vous devriez alors pouvoir implémenter les fonctionnalités de WKWebView comme vous le feriez normalement.

Source: https://developer.Apple.com/documentation/webkit/wkwebview

79
Fahad Ashraf

Si vous voulez réaliser un custom UIViewController avec d'autres composants, vous pouvez créer un "conteneur" dans le storyboard appelé par exemple 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)
    }
50
Alessandro Ornano

Si vous êtes déplacé d'une ancienne cible vers iOS 11.0 et que vous obtenez toujours cette erreur, utilisez la solution ci-dessous.

  1. Allez dans Storyboard (Main.storyboard), cliquez sur n’importe quelle scène.
  2. Sélectionnez 'Inspecteur de fichier' qui est la fenêtre de propriétés de droite de Xcode
  3. Changer ' Construit pour ' valeur en ' iOS 11.0 et versions ultérieures '
  4. Compiler et compiler

enter image description here

28
Kampai

J'ai fait face au même problème, mais cela peut être résolu si nous ajoutons WKWebView par programmation.

  1. Faites ce que vous voulez dans le storyboard, mais laissez la place à WKWebView, dans cette zone, faites glisser et déposez une vue et nommez-la webViewContainer et déclarez ces deux propriétés,

    @property (weak, nonatomic) IBOutlet UIView *webViewContainer;
    @property(nonatomic, strong)WKWebView *webView;
    
  2. Maintenant, créez et ajoutez webView comme ceci:

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

    la fonction createWebView est déclarée comme,

    -(WKWebView *)createWebView
    {
         WKWebViewConfiguration *configuration = 
                   [[WKWebViewConfiguration alloc] init];
         return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
    }
    
  3. Ajoutez maintenant cette webView nouvellement créée à votre containerView, comme ceci:

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
    
  4. Enfin, chargez votre URL comme ceci,

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

Merci d'avoir lu ceci.

12
Najam