[ios] 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. 컴파일 및 빌드

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


답변

같은 문제에 직면했지만 프로그래밍 방식으로 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];
    }

읽어 주셔서 감사합니다.


답변

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로 마이그레이션하고 여전히 동일한 오류가 발생하는 경우).


답변

// 스위프트

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

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