Xcode 9 GM – WKWebView NSCoding-ondersteuning was verbroken in eerdere versies

Weet iemand hoe deze fout kan worden opgelost met Xcode 9 GM? Ik werk aan een app gemaakt met Xcode 8.3, het implementatiedoel is voor iOS 9.3 en ik heb dit probleem nooit eerder gehad. Ik vind hier of op Apple-forums nog geen informatie 🙁

Bewerken: deze fout deed zich voor toen ik een WKWebView in interfacebuilder plaatste, niet als ik het programmatisch gebruik.

Zie afbeelding WKWebView-fout

Bewerken 2: Nou, het is eindelijk geen bug, zie het antwoord van Quinn hieronder voor meer informatie over dit gedrag. Dank aan hem voor de uitleg.


Antwoord 1, autoriteit 100%

De fout is correct gedrag en geen fout in Xcode 9. Hoewel WKWebView werd geïntroduceerd in iOS 8, was er een fout in -[WKWebView initWithCoder:]die alleen werd opgelost in iOS 11 , die altijd crashte tijdens runtime en dus verhinderde om er een te configureren binnen Interface Builder.

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

In plaats van ontwikkelaars toe te staan ​​iets in IB te bouwen dat tijdens runtime kapot zou gaan, is het een bouwfout. Het is een lastige beperking aangezien iOS 11 pas onlangs is uitgebracht, maar er is echt geen andere goede optie.

De oplossing voor oudere implementatiedoelen is om de WKWebView in code toe te voegen, zoals @fahad-ashraf al beschreef in zijn antwoord:

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


Antwoord 2, autoriteit 58%

Dit lijkt een bug te zijn in Xcode 9 en was ook aanwezig in de bèta’s. U krijgt alleen de build-fout als u een WKWebView maakt via het storyboard. Als u de WKWebView progmatisch maakt in het bijbehorende ViewController-klassebestand, zou u in staat moeten zijn om te bouwen op iOS-versies onder iOS 11.
Hier is de benadering die op de website van Apple wordt gegeven om dit te bereiken:

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

U zou dan de WKWebView-functionaliteit moeten kunnen implementeren zoals u dat normaal zou doen.

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


Antwoord 3, autoriteit 36%

Als je een custom UIViewControllerwilt realiseren met daarnaast nog andere componenten kun je een “container” maken via het storyboard genaamd bijvoorbeeld 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: self.webViewContainer.frame.size.width, 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)
    }

Antwoord 4, autoriteit 35%

Als je van het oudere doel naar iOS 11.0 bent verhuisd en nog steeds deze foutmelding krijgt, gebruik dan onderstaande oplossing.

  1. Ga naar Storyboard (Main.storyboard), klik op een scène.
  2. Selecteer ‘File Inspector’, dit is het eigenschappenvenster aan de rechterkant van Xcode
  3. Wijzig de waarde ‘Builds for‘ in ‘iOS 11.0 en later
  4. Compileren en bouwen

voer hier de afbeeldingsbeschrijving in


Antwoord 5, autoriteit 10%

Ik heb hetzelfde probleem ondervonden, maar het kan worden aangepakt als we WKWebViewprogrammatisch toevoegen.

  1. Doe welk ontwerp je ook wilt maken in storyboard, maar laat ruimte over voor WKWebView, sleep in dat gebied & zet een weergave neer en noem deze webViewContaineren declareer deze twee eigenschappen,

    @property (weak, nonatomic) IBOutlet UIView *webViewContainer;
    @property(nonatomic, strong)WKWebView *webView;
    
  2. Maak webView nu als volgt aan en voeg het toe:

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

    createWebView-functie is gedeclareerd als,

    -(WKWebView *)createWebView
    {
         WKWebViewConfiguration *configuration = 
                   [[WKWebViewConfiguration alloc] init];
         return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
    }
    
  3. Voeg nu deze nieuw gemaakte webView toe aan uw containerView, als volgt, :

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
    
  4. Eindelijk, laad je URL gewoon op deze manier,

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

Bedankt voor het lezen hiervan.


Antwoord 6, autoriteit 2%

//Voor Swift

import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
// MARK:- WebView Configure
override func loadView() {
    let webConfig = WKWebViewConfiguration()
    webView = WKWebView(frame: .zero, configuration: webConfig)
    view = webView
}
override func viewDidLoad() {
    super.viewDidLoad()
    // call urlrequest fun
    loadURLRequest()
}
//MARK:- Webview URLRequest
func loadURLRequest()  {
    let urlString = "https://www.google.com"
    let url = URL(string: urlString)
    let urlRequest = URLRequest(url: url!)
    webView.load(urlRequest)
}
}

// Voor doelstelling C

#import <WebKit/WebKit.h>
@interface ViewController ()<WKNavigationDelegate,WKUIDelegate>{
WKWebView *webView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [[NSURL alloc] initWithString: @"https://www.google.com"];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL: url];
    [webView loadRequest: request];
}
- (void)loadView {
[super loadView];
WKWebViewConfiguration *configu = [[WKWebViewConfiguration alloc] init];
webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configu];
webView.UIDelegate = self;
self.view = webView;
}
@end

voer hier de afbeeldingsbeschrijving in


Antwoord 7

import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
    @IBOutlet weak var webViewContainer: UIView!
    private var webView: WKWebView?
    override func viewDidLoad() {
        super.viewDidLoad()
        addWebView()
        let myURL = URL(string: "https://www.apple.com")
        if let myURL = myURL {
            let myRequest = URLRequest(url: myURL)
            webView?.load(myRequest)
        }
    }
    private func addWebView() {
        let webConfiguration = WKWebViewConfiguration()
        let size = CGSize.init(width: 0.0, height: self.webViewContainer.frame.size.height)
        let customFrame = CGRect.init(origin: CGPoint.zero, size: size)
        self.webView = WKWebView (frame: customFrame, configuration: webConfiguration)
        if let webView = self.webView {
            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
        }
    }
}

Antwoord 8

Je kunt gewoon IPHONEOS_DEPLOYMENT_TARGET>= 11

instellen

[Deployment Target]


Antwoord 9

UIWebView is verouderd in iOS11 en WKWebView werkt alleen in iOS11 – dit klinkt als een bug in Xcode GM.

Other episodes