development

Xcode 9 GM-이전 버전에서 WKWebView NSCoding 지원이 중단되었습니다.

big-blog 2020. 7. 1. 07:37
반응형

Xcode 9 GM-이전 버전에서 WKWebView NSCoding 지원이 중단되었습니다.


누구든지 Xcode 9 GM 으로이 오류를 해결하는 방법을 알고 있습니까? Xcode 8.3으로 만든 앱을 개발 중이며 배포 대상은 iOS 9.3이며 이전에는이 ​​문제가 없었습니다. 여기 또는 Apple 포럼에서 정보를 찾지 못했습니다 :(

편집 :이 오류는 프로그래밍 방식으로 사용하지 않고 WKWebView를 인터페이스 빌더에 넣을 때 발생했습니다.

그림 WKWebView 오류 참조

편집 2 : 마침내 버그는 아닙니다.이 동작에 대한 자세한 내용은 아래 Quinn의 답변을 참조하십시오. 설명해 주셔서 감사합니다.


오류는 올바른 동작이며 Xcode 9의 버그는 아닙니다. iOS 8에서는 WKWebView가 도입되었지만 -[WKWebView initWithCoder:]iOS 11에서만 수정 된 버그가있었습니다. 버그 는 런타임시 항상 충돌하여 Interface Builder 내 에서 버그를 구성 할 수 없었습니다.

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

개발자가 런타임에 깨질 IB에서 무언가를 빌드 할 수있게하는 것이 아니라 빌드 오류입니다. iOS 11이 최근에 출시 된 이래로 불편한 한계가 있지만 실제로 다른 좋은 옵션은 없습니다.

이전 배포 대상의 해결 방법은 @ fahad-ashraf가 이미 그의 답변에서 설명했듯이 코드에 WKWebView를 계속 추가하는 것입니다.

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


이것은 Xcode 9의 버그로 보이며 베타에도 존재했습니다. 스토리 보드를 통해 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


다른 컴포넌트로 사용자 정의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)
    }

이전 대상에서 iOS 11.0으로 이동했지만 여전히이 오류가 발생하면 아래 해결책을 사용하십시오.

  1. 스토리 보드 (Main.storyboard)로 이동하여 장면을 클릭하십시오.
  2. Xcode의 오른쪽 속성 창인 'File Inspector'를 선택하십시오.
  3. ' Builds for '값을 ' iOS 11.0 이상 '으로 변경
  4. 컴파일 및 빌드

여기에 이미지 설명을 입력하십시오


I have faced the same issue but it can be tackle if we add WKWebView programmatically.

  1. Do whatever design you want to make in storyboard but leave the room for WKWebView, in that area drag & drop a view and name it as webViewContainer and declare these two properties,

    @property (weak, nonatomic) IBOutlet UIView *webViewContainer;
    @property(nonatomic, strong)WKWebView *webView;
    
  2. Now create and add webView like this:

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

    createWebView function is declared as,

    -(WKWebView *)createWebView
    {
         WKWebViewConfiguration *configuration = 
                   [[WKWebViewConfiguration alloc] init];
         return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
    }
    
  3. Now add this newly created webView to your containerView, like this, :

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
    
  4. Finally, just load your Url like this,

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

Thanks for reading this.


WebKit was introduced in iOS 8 but it was released with an error which caused in a runtime crash, If you are using Xcode 9/10, your project configuration support less than iOS 11 and if you are trying to add WKWebView using interface builder. Xcode immediately shows a compile-time error.

WKWebView before iOS 11.0 (NSCoding Support was broken in the previous version)

Although WKWebView was introduced in iOS 8, there was a bug in –[WKWebView initWithCoder:] that was only fixed in iOS 11.

여기에 이미지 설명을 입력하십시오

Resolution is you must add WKWebView through code (Only if you are supporting below iOS 11). That actually sounds strange.

다른 해결책 은 옵션에 대한 인터페이스 빌더 문서 빌드를 iOS 11 이상으로 변경하는 것입니다 (이전 대상에서 iOS 11로 마이그레이션하고 여전히 동일한 오류가 발생하는 경우).


나는이 문제도 가지고 있지만 개발 목표를 11.0으로 설정하면 프로젝트는 실행될 수 있지만 여전히 오류가 발생합니다.


UIWebView는 iOS11에서 더 이상 사용되지 않으며 WKWebView는 iOS11에서만 작동합니다. 이는 Xcode GM의 버그처럼 들립니다.

참고 URL : https://stackoverflow.com/questions/46221577/xcode-9-gm-wkwebview-nscoding-support-was-broken-in-previous-versions

반응형