Xcode 9 GM - การสนับสนุน WKWebView NSCoding นั้นใช้งานไม่ได้ในเวอร์ชันก่อนหน้า


155

ไม่มีใครรู้วิธีแก้ไขข้อผิดพลาดนี้ด้วย Xcode 9 GM หรือไม่ ฉันกำลังทำงานกับแอพที่ทำด้วย Xcode 8.3 เป้าหมายการปรับใช้สำหรับ iOS 9.3 และฉันไม่เคยมีปัญหานี้มาก่อน ฉันยังไม่พบข้อมูลใด ๆ ที่นี่หรือในฟอรัมของ Apple :(

แก้ไข: ข้อผิดพลาดนี้เกิดขึ้นเมื่อฉันวาง WKWebView ลงในตัวสร้างส่วนต่อประสานไม่ใช่ถ้าฉันใช้โดยทางโปรแกรม

ดูรูปภาพข้อผิดพลาด WKWebView

แก้ไข 2: ในที่สุดก็ไม่ใช่ข้อผิดพลาดให้ดูคำตอบของ Quinn ด้านล่างเพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับพฤติกรรมนี้ ขอบคุณเขาสำหรับคำอธิบาย


1
ดูคำตอบของฉันด้านล่าง นี่ไม่ใช่ข้อผิดพลาดใน Xcode 9; หากไม่มีข้อผิดพลาดในการสร้างนี้คุณจะได้รับความเสียหายใน -initWithCoder: ที่รันไทม์ก่อน iOS 11
Quinn Taylor

1
ฉันเพิ่งเปลี่ยนเป้าหมายการปรับใช้เป็น 11
wei

คำตอบ:


160

ข้อผิดพลาดคือพฤติกรรมที่ถูกต้องและไม่ใช่ข้อผิดพลาดใน Xcode 9 แม้ว่า WKWebView ถูกนำมาใช้ใน iOS 8 มีข้อผิดพลาด-[WKWebView initWithCoder:]ที่ได้รับการแก้ไขใน iOS 11 เท่านั้นซึ่งจะล้มเหลวเสมอในรันไทม์และทำให้การกำหนดค่าภายในอินเทอร์เฟซ

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

แทนที่จะอนุญาตให้นักพัฒนาสร้างบางสิ่งใน IB ที่จะใช้งานไม่ได้ในขณะรันไทม์มันเป็นข้อผิดพลาดในการสร้าง มันเป็นข้อ จำกัด ที่ไม่สะดวกตั้งแต่ iOS 11 เพิ่งเปิดตัว แต่ไม่มีตัวเลือกอื่นที่ดี

วิธีแก้ปัญหาสำหรับเป้าหมายการปรับใช้รุ่นเก่าคือการเพิ่ม WKWebView ในรหัสต่อไปเนื่องจาก @ fahad-ashraf ได้อธิบายไว้แล้วในคำตอบของเขา:

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


3
สวัสดีควินน์ฉันเชื่อว่าคนที่ทำงานกับ Apple :-) ฉันยังพบรายงานข้อผิดพลาดของคุณเกี่ยวกับเรื่องนี้: lists.webkit.org/pipermail/webkit-unassigned/2014- กันยายน /ขอบคุณสำหรับคำตอบของคุณมันน่าแปลกใจจริงๆสำหรับคนใหม่ นักพัฒนาอย่างฉันเมื่อเราเผชิญกับพฤติกรรมเช่นนั้น ขอบคุณอีกครั้ง.
Mehdi Chennoufi

ขอบคุณ! มันมีประโยชน์
ssowri1

2
ถ้าเราต้องการสนับสนุนใน ios10 ด้วยล่ะ ในแอพของฉันฉันต้องรองรับ iOS 10 ด้วยเราจะแก้ไขปัญหานี้ได้อย่างไร?
Kalikanth040494

แค่อยากรู้ว่าทำไมมันถึงใช้ Apple จนถึง iOS 11 เพื่อหาทางแก้ไข?
Eman

96

นี่ดูเหมือนจะเป็นข้อผิดพลาดใน Xcode 9 และก็มีอยู่ใน betas คุณจะได้รับข้อผิดพลาดในการสร้างเท่านั้นหากคุณสร้าง 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


5
อย่าลืมsuper.loadView()
albirrojo7

super.loadView()จะต้องมีการเริ่มต้น ก็ไม่มีอะไรแสดงให้เห็น
Makalele

สวัสดี :) คุณรู้วิธีที่ฉันสามารถตั้งข้อ จำกัด ของสิ่งนี้webviewไปที่ NavigationBar ของฉันได้อย่างไร วิธีแก้ปัญหาของคุณใช้งานได้ แต่ครอบคลุมทั้งหน้าจอ
Abed Naseri

@AbedNaseri ฉันคิดว่าคุณไม่จำเป็นต้องใส่ข้อ จำกัด ... คุณสามารถสร้างอินสแตนซ์ของสตอรี่บอร์ดแล้ว self.navigationController? .pushViewController (youVC, animated: 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 และ swift 4.1
Alwin

2
หากคุณได้รับข้อผิดพลาดอย่าลืมสาย[LayoutConstraints] Unable to simultaneously satisfy constraints webView.translatesAutoresizingMaskIntoConstraints = falseหากคุณตั้งค่าเป็นจริงมันจะสร้างข้อ จำกัด ทั้งชุดwebViewโดยอัตโนมัติซึ่งจะขัดแย้งกับข้อ จำกัด ที่คุณเพิ่มโดยทางโปรแกรม แอปเปิ้ลเอกสาร
mogelbuster

51

หากคุณย้ายจากเป้าหมายเก่าไปเป็น iOS 11.0 และยังคงได้รับข้อผิดพลาดนี้ให้ใช้วิธีการแก้ปัญหาด้านล่าง

  1. ไปที่ Storyboard (Main.storyboard) คลิกที่ฉากใดก็ได้
  2. เลือก 'File Inspector' ซึ่งเป็นหน้าต่างคุณสมบัติด้านขวาของ Xcode
  3. เปลี่ยนค่า ' Builds สำหรับ ' เป็น ' iOS 11.0 และใหม่กว่า '
  4. รวบรวมและสร้าง

ป้อนคำอธิบายรูปภาพที่นี่


2
@VyachaslavGerchicov: ฉันไม่รู้เกี่ยวกับคุณ แต่ในอุตสาหกรรมเรามีโครงการเก่า ๆ ที่ต้องเปลี่ยนเป็นเทคโนโลยีที่ใหม่กว่า หลายคนประสบปัญหาเดียวกัน ฉันได้กล่าวถึงแล้วในคำตอบว่า "ถ้าคุณถูกย้ายจากเป้าหมายที่เก่ากว่า" อย่าคิดเพียงกรณีเดียว
Kampai

1
มันใช้งานได้สำหรับฉันขอบคุณสำหรับการชี้การตั้งค่า IB ที่น่ารำคาญนี้ คำเตือนหายไปทันที อันที่จริงฉันคิดว่านี่เป็นประโยชน์มากกว่าและควรได้รับคำตอบ เห็นด้วยกับ @Kampai จริง ๆ แล้วเราถูกบังคับให้ย้ายไปใช้ iOS เวอร์ชันใหม่เนื่องจาก Apple ทำการเปลี่ยนเฟรมพื้นฐานของพวกเขา
infinity_coding7

หลังจากทำมันเมื่อทำงานบนโปรแกรมจำลองด้วยแอพ iOS 10.x ขัดข้อง
Ramis

@Ramis: ฉันทำเพื่อ iOS 10 ฉันไม่เคยมีปัญหาแอพอะไรบันทึกความผิดพลาดคืออะไร?
Kampai

1
ทางออกที่ง่ายที่สุดสำหรับการแก้ไขปัญหานี้ ขอบคุณ!
Jerry Chong

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. ตอนนี้เพิ่ม webView ที่สร้างขึ้นใหม่นี้ใน containerView ของคุณเช่นนี้:

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
  4. ในที่สุดก็โหลด Url ของคุณแบบนี้

    -(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 แสดงข้อผิดพลาดในเวลารวบรวมทันที

WKWebView ก่อน iOS 11.0 (การสนับสนุน NSCoding นั้นใช้งานไม่ได้ในเวอร์ชั่นก่อนหน้า)

แม้ว่า WKWebView ถูกนำมาใช้ในiOS 8มีข้อผิดพลาดใน - [WKWebView initWithCoder:] ที่ได้รับการแก้ไขในiOS 11เท่านั้น

ป้อนคำอธิบายรูปภาพที่นี่

การแก้ไขคือคุณต้องเพิ่ม WKWebView ผ่านโค้ด (เฉพาะในกรณีที่คุณสนับสนุนด้านล่าง iOS 11) ฟังดูแปลก ๆ

ทางออกอื่นคือเปลี่ยน Build Builder Document Builds สำหรับตัวเลือกเป็น 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)
}
}

// สำหรับวัตถุประสงค์ 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

ป้อนคำอธิบายรูปภาพที่นี่


0

นี่ควรเป็นความเห็นต่อคำตอบของ Kampai แต่ฉันไม่มีคะแนนชื่อเสียงเพียงพอที่จะแสดงความคิดเห็น

นอกจากเวอร์ชัน iOS ชัดเจนแล้วดรอปดาวน์ 'Builds for' ใน 'File Inspector' ยังมีตัวเลือกDeployment Target (.. ) ฉันชอบการจัดการเวอร์ชันในที่เดียวถ้าเป็นไปได้และต้องการเปลี่ยนเป้าหมายการสร้างต่อไป ผมสับสนอย่างเต็มที่ก็ยังกล่าวว่าการจัดวางเป้าหมาย (9.3)ถึงแม้ว่าผมเปลี่ยนรายการที่สอดคล้องกันในการตั้งค่าทั่วไป11.0

จำเป็นต้องเริ่มการทำงานใหม่ของ XCode (11.3.1) เพื่อให้ทุกอย่างทำงานตามที่คาดไว้ตัวเลือก 'เป้าหมายการปรับใช้ (11.0)' พร้อมใช้งาน (และ 9.3 หายไป) หลังจากเลือกทุกอย่างทำงานเป็น expeected


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 ของคุณโดยทางโปรแกรม
Mehdi Chennoufi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.