Xcode 9 GM - WKWebView NSCoding समर्थन पिछले संस्करणों में टूट गया था


155

क्या किसी को पता है कि Xcode 9 GM के साथ इस त्रुटि को कैसे ठीक किया जाए? मैं Xcode 8.3 के साथ बने ऐप पर काम कर रहा हूं, तैनाती लक्ष्य iOS 9.3 के लिए है और मुझे इससे पहले कभी यह समस्या नहीं हुई थी। मुझे यहाँ या Apple मंचों पर अभी तक कोई जानकारी नहीं मिली है :(

संपादित करें: यह त्रुटि आई जब मैंने WKWebView को इंटरफ़ेस बिल्डर में रखा, न कि अगर मैं इसे प्रोग्रामेटिक रूप से उपयोग करता हूं।

चित्र देखें WKWebView त्रुटि

संपादित करें 2: खैर, यह अंत में बग नहीं है, इस व्यवहार के बारे में अधिक जानकारी के लिए नीचे क्विन का उत्तर देखें। स्पष्टीकरण के लिए उनका धन्यवाद।


1
नीचे मेरा जवाब देखें। यह Xcode 9 में एक बग नहीं है; इस बिल्ड त्रुटि के बिना, आपको इसके बजाय एक क्रैश मिलेगा -initWithCoder: iOS 11 से पहले रनटाइम पर
क्विन टेलर

1
मैं सिर्फ अपना तैनाती लक्ष्य 11
वी

जवाबों:


160

त्रुटि सही व्यवहार है, और Xcode 9 में बग नहीं है। हालांकि WKWebView को iOS 8 में पेश किया गया था, इसमें एक बग था -[WKWebView initWithCoder:]जो केवल iOS 11 में तय किया गया था, जो हमेशा रनटाइम पर क्रैश हो जाता था और इस तरह इंटरफ़ेस बिल्डर के भीतर एक को कॉन्फ़िगर करने से रोकता था।

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

डेवलपर्स को आईबी में कुछ बनाने की अनुमति देने के बजाय जो रनटाइम में टूट जाएगा, यह एक बिल्ड त्रुटि है। आईओएस 11 केवल हाल ही में जारी किया गया था, लेकिन यह एक असुविधाजनक सीमा है, लेकिन वास्तव में कोई अन्य अच्छा विकल्प नहीं है।

पुराने तैनाती लक्ष्य के लिए समाधान को कोड में WKWebView जोड़ना जारी रखना है, क्योंकि @ fahad-ashraf ने पहले ही अपने उत्तर में वर्णित किया है:

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


3
हाय क्विन, मुझे विश्वास है कि जो आदमी Apple पर काम करता है :-) मुझे उस बारे में आपकी बग रिपोर्ट भी मिल गई: lists.webkit.org/pipermail/webkit-unassigned/2014-Seture/… आपके जवाब के लिए धन्यवाद, यह वास्तव में नए के लिए आश्चर्यजनक है मेरे जैसे डेवलपर्स जब हमारे साथ ऐसा व्यवहार होता है। एक बार फिर धन्यवाद।
मेहदी चेन्नेउफी

धन्यवाद! यह उपयोगी था।
ssowri1

2
क्या होगा अगर हम ios10 में भी समर्थन करना चाहते हैं ?. मेरे ऐप में मुझे ios 10 का भी समर्थन करने की आवश्यकता है। हम इस मुद्दे को कैसे हल कर सकते हैं?
कालिकांथ ०४०४

बस जिज्ञासु ने इसे ठीक करने के लिए iOS 11 तक Apple को क्यों लिया?
एमन

96

यह Xcode 9 में एक बग प्रतीत होता है और यह betas में भी मौजूद था। यदि आप स्टोरीबोर्ड के माध्यम से WKWebView बना रहे हैं तो आपको केवल बिल्ड त्रुटि मिलेगी। यदि आप व्यावहारिक रूप से संबंधित ViewController वर्ग फ़ाइल में WKWebView बनाते हैं, तो आपको iOS 11 के नीचे iOS संस्करणों पर निर्माण करने में सक्षम होना चाहिए। यहां यह पूरा करने के लिए 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


5
मत भूलोsuper.loadView()
अल्बिरोज़ो 7

super.loadView()शुरुआत में होना चाहिए। इसके बिना, कुछ भी नहीं दिखाता है।
मकाले

हाय :), क्या आप जानते हैं कि मैं webviewअपने नेविगेशनबेर के नीचे की बाधाओं को कैसे सेट कर सकता हूं? आप का यह समाधान काम करता है लेकिन यह पूरी स्क्रीन को कवर करता है।
अबेद नासरी

@AbedNaseri मुझे लगता है कि आपको अड़चनें डालने की जरूरत नहीं है ... आप स्टोरीबोर्ड को इंस्टेंट कर सकते हैं और फिर self.navigationController ?pushViewController (youVC, एनिमेटेड: true)।
xhinoda

58

यदि आप अन्य घटकों के साथ एक रिवाज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)
    }

बहुत बहुत धन्यवाद, यह वास्तव में मदद है। यह एक बग है Apple
Sébastien REMY

1
काम किया! iOS 11 और स्विफ्ट 4.1 में परीक्षण किया गया
Alwin

2
यदि आपको त्रुटि मिल रही है [LayoutConstraints] Unable to simultaneously satisfy constraints, तो लाइन मत भूलना webView.translatesAutoresizingMaskIntoConstraints = false। यदि आप इसे सही पर सेट करते हैं, तो यह आपके लिए webViewस्वचालित रूप से बाधाओं का एक पूरा सेट बना देगा जो आपके द्वारा प्रोग्राम में जोड़े जाने वाले अवरोधों के साथ संघर्ष करेगा। Apple डॉक्स
मोगेलबस्टर

51

यदि आप पुराने लक्ष्य से iOS 11.0 में चले गए हैं और फिर भी आपको यह त्रुटि मिल रही है, तो नीचे दिए गए समाधान का उपयोग करें।

  1. स्टोरीबोर्ड पर जाएं (Main.storyboard), किसी भी दृश्य पर क्लिक करें।
  2. 'फाइल इंस्पेक्टर' चुनें जो Xcode की राइट साइड प्रॉपर्टी विंडो है
  3. ' IOS 11.0 और बाद में ' मान के लिए ' बिल्ड बनाता है ' बदलें
  4. संकलित करें और बनाएँ

यहाँ छवि विवरण दर्ज करें


2
@VyachaslavGerchicov: मैं आपके बारे में नहीं जानता, लेकिन उद्योग में, हमारे पास ऐसी पुरानी परियोजनाएँ हैं जिन्हें नए तकनीक में बदलने की आवश्यकता है। तो कई एक ही समस्या का सामना कर रहे हैं। मैंने पहले ही उत्तर में उल्लेख किया है कि "यदि आप पुराने लक्ष्य से चले गए हैं"। केवल एक ही मामले के बारे में मत सोचो।
कंपाई

1
इस कष्टप्रद आईबी सेटअप को इंगित करने के लिए यह मेरे लिए धन्यवाद का काम करता है। चेतावनी तुरंत चली गई है। वास्तव में, मुझे लगता है कि यह अधिक व्यावहारिक है और इसका उत्तर स्वीकार किया जाना चाहिए। @Kampai से सहमत हैं, वास्तव में, हम iOS के नए संस्करण में जाने के लिए मजबूर हैं, क्योंकि Apple अपने मूलभूत ढांचे को बदलते रहते हैं
infinity_coding7

आईओएस 10.x ऐप क्रैश होने के बाद सिम्युलेटर पर चलने के बाद।
रमीज

@ रामिस: मैं इसे iOS 10 के लिए कर रहा था, मुझे कभी ऐप क्रैश नहीं हुआ, क्रैश लॉग क्या था?
काम्पई

1
इस समस्या को हल करने के लिए सबसे सरल समाधान। धन्यवाद!
जेरी चोंग

18

मैंने एक ही मुद्दे का सामना किया है लेकिन अगर हम WKWebView को प्रोग्रामेटिक रूप से जोड़ते हैं तो इससे निपटा जा सकता है ।

  1. जो भी डिज़ाइन आप स्टोरीबोर्ड में बनाना चाहते हैं, लेकिन WKWebView के लिए कमरे को छोड़ दें , उस क्षेत्र में एक दृश्य को खींचें और छोड़ें और इसे webViewContainer नाम दें और इन दो गुणों की घोषणा करें

    @property (weak, nonatomic) IBOutlet UIView *webViewContainer;
    @property(nonatomic, strong)WKWebView *webView;
  2. अब इस तरह 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];
    }
  3. अब अपने कंटेनर व्यू में इस नए बनाए गए वेब व्यू को इस तरह जोड़ें:

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
  4. अंत में, बस अपने यूआरएल को इस तरह लोड करें,

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

इसे पढ़ने के लिए धन्यवाद।


3

WebKit को iOS 8 में पेश किया गया था, लेकिन यह एक त्रुटि के साथ जारी किया गया था जो एक रनटाइम क्रैश के कारण हुआ, यदि आप Xcode 9/10 का उपयोग कर रहे हैं , तो आपका प्रोजेक्ट कॉन्फ़िगरेशन iOS 11 से कम समर्थन करता है और यदि आप इंटरफ़ेस बिल्डर का उपयोग करके WKWebView को जोड़ने का प्रयास कर रहे हैं। Xcode तुरंत एक संकलन-समय त्रुटि दिखाता है।

IOS 11.0 से पहले WKWebView (NSCoding समर्थन पिछले संस्करण में टूट गया था)

हालाँकि WKWebView को iOS 8 में पेश किया गया था , लेकिन इसमें एक बग था - [WKWebView initWithCoder:] जो केवल iOS 11 में तय किया गया था ।

यहाँ छवि विवरण दर्ज करें

रिज़ॉल्यूशन यह है कि आपको WKWebView को कोड के माध्यम से जोड़ना होगा (केवल यदि आप iOS 11 से नीचे समर्थन कर रहे हैं)। यह वास्तव में अजीब लगता है।

एक अन्य उपाय इंटरफ़ेस बिल्डर डॉक्यूमेंट बिल्ड को iOS 11 और बाद के विकल्प के लिए बदलना है (यदि आप पुराने लक्ष्य से iOS 11 में माइग्रेट कर रहे हैं और अभी भी वही त्रुटि हो रही है)।


1

// स्विफ्ट के लिए

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

// ऑब्जेक्टिव सी के लिए

#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

यहाँ छवि विवरण दर्ज करें


0

यह कंपाई के उत्तर पर एक टिप्पणी होनी चाहिए, लेकिन मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा अंक नहीं हैं।

स्पष्ट आईओएस संस्करणों के अलावा 'फाइल इंस्पेक्टर में ड्रॉपडाउन के लिए बिल्ड' में तैनाती लक्ष्य (..) विकल्प भी शामिल है । यदि संभव हो तो मैं एक ही स्थान पर संस्करणों का प्रबंधन करना पसंद करता हूं और वैसे भी निर्माण लक्ष्य को बदलना चाहता हूं। मैं अभी भी पूरी तरह से भ्रमित था, फिर भी उसने कहा कि तैनाती लक्ष्य (9.3) हालांकि मैंने सामान्य सेटिंग्स में संबंधित प्रविष्टि को 11.0 में बदल दिया है ।

XCode (11.3.1) का पुनः आरंभ अपेक्षित रूप से सब कुछ करने के लिए आवश्यक था, विकल्प 'तैनाती लक्ष्य (11.0)' उपलब्ध था (और 9.3 चला गया था)। चयन के बाद सब कुछ तेज हो गया।


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

-5

UIWebView को iOS11 में चित्रित किया गया है और WKWebView केवल iOS11 में काम करता है - यह Xcode GM में एक बग जैसा लगता है।


हां। यदि आप iOS के पिछले संस्करण पर तैनाती करना चाहते हैं, तो मुझे केवल एक ही समाधान मिलेगा, वह है अपने WKWebView को प्रोग्रामेटिक रूप से जोड़ना।
मेहदी चेंनौफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.