web-dev-qa-db-ja.com

Xcode 9 GM - WKWebView NSCodingサポートは以前のバージョンでは壊れていました

誰もがXcode 9 GMでこのエラーを修正する方法を知っていますか?私はXcode 8.3で作られたアプリを開発しています。デプロイのターゲットはiOS 9.3です。これまでにこの問題に遭遇したことはありません。私はここまたはAppleフォーラムでまだ情報を見つけていません:(

編集:このエラーは、WKWebViewをインターフェイスビルダーに入れたときに発生しました。プログラム的に使用した場合ではありません。

See picture WKWebView Error

編集2:まあ、それはついにバグではありません。この振る舞いについての詳細は、以下のQuinnの回答を参照してください。説明してくれてありがとう。

126
Mehdi Chennoufi

このエラーは正しい動作であり、Xcode 9のバグではありません。WKWebViewはiOS 8で導入されましたが、iOS 11でのみ修正された-[WKWebView initWithCoder:]のバグがありました。

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

開発者が実行時に壊れる可能性のあるものをIBでビルドできるようにするのではなく、ビルドエラーです。 iOS 11が最近リリースされたばかりなので、これは不便な制限ですが、他に良い選択肢はありません。

@ fahad-ashrafが既に彼の答えで述べたように、古いデプロイメントターゲットのための回避策はWKWebViewをコードに追加し続けることです:

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

122
Quinn Taylor

これはXcode 9のバグのようであり、ベータ版にもありました。ストーリーボードからWKWebViewを作成している場合にのみビルドエラーが発生します。対応するViewControllerクラスファイルにWKWebViewを段階的に作成すると、iOS 11より下のiOSバージョンでビルドできるはずです。これを達成する方法について、AppleのWebサイトで示されているアプローチは次のとおりです。

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

75
Fahad Ashraf

他のコンポーネントとともに カスタム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)
    }
45

あなたが古いターゲットからiOS 11.0に移動し、それでもあなたがこのエラーを受けているならば、それから以下の解決策を使ってください。

  1. ストーリーボード(Main.storyboard)に移動し、任意のシーンをクリックしてください。
  2. Xcodeの右側のプロパティウィンドウである 'File Inspector'を選択してください。
  3. ''の値を ' iOS 11.0以降 'に変更
  4. コンパイルとビルド

enter image description here

20
Kampai

私は同じ問題に直面しましたが、 WKWebView をプログラム的に追加すればそれは取り組むことができます。

  1. ストーリーボードで作成したいデザインは何でもしますが、 WKWebView 用のスペースを残して、その領域にビューをドラッグ&ドロップして webViewContainer という名前を付け、これら2つのプロパティを宣言します

    @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];
    }
    

これを読んでくれてありがとう。

12
Najam