Xcode 9 GM - WKWebView NSCoding desteği önceki sürümlerde bozuldu


155

Xcode 9 GM ile bu hatayı nasıl düzeltebileceğiniz var mı? Xcode 8.3 ile yapılan bir uygulama üzerinde çalışıyorum, dağıtım hedefi iOS 9.3 için ve daha önce hiç bu problemi yaşamadım. Burada veya Apple forumlarında henüz hiçbir bilgi bulamıyorum :(

Düzenleme: Bu hata, ben programlı olarak kullanmak değil, bir WKWebView arabirim oluşturucu içine koymak geldi.

Resme bakın WKWebView Hatası

Edit 2: Sonunda bir hata değil, bu davranış hakkında daha fazla bilgi için aşağıdaki Quinn'in cevabına bakınız. Açıklama için ona teşekkürler.


1
Cevabımı aşağıda görebilirsiniz. Bu Xcode 9'da bir hata değil; Bu derleme hatası olmadan, bunun yerine -initWithCoder'de bir çökme elde edersiniz: iOS 11'den önce çalışma zamanında
Quinn Taylor

1
Dağıtım hedefimi 11 olarak değiştirdim
wei

Yanıtlar:


160

Hata, doğru davranış ve Xcode 9'daki bir hata değil. WKWebView, iOS 8'de kullanılmasına rağmen -[WKWebView initWithCoder:], yalnızca iOS 11'de düzeltilen ve her zaman çalışma zamanında çöken ve böylece Arayüz Oluşturucu'da bir yapılandırmayı engelleyen bir hata vardı .

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

Geliştiricilerin IB'de çalışma zamanında bozulacak bir şey oluşturmasına izin vermek yerine, bir derleme hatasıdır. İOS 11 henüz yeni piyasaya sürüldüğünden bu rahatsız edici bir sınırlama, ancak gerçekten iyi bir seçenek yok.

Eski dağıtım hedefleri için geçici çözüm WKWebView koduna eklemeye devam etmektir, çünkü @ fahad-ashraf yanıtında daha önce açıklanmıştır:

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


3
Merhaba Quinn, Apple'da çalışan adama inanıyorum :-) Ayrıca bununla ilgili hata raporunu da buldum: lists.webkit.org/pipermail/webkit-unassigned/2014-Eylül/… Cevabınız için teşekkürler yeni için gerçekten şaşırtıcı böyle bir davranışla karşılaştığımızda benim gibi geliştiriciler. Tekrar teşekkürler.
Mehdi Chennoufi

Teşekkür ederim! Yararlı oldu.
ssowri1

2
ios10'da da desteklemek istiyorsak? benim app ios 10 da desteklenmesi gerekir.Bu sorunu nasıl çözebiliriz?
Kalikanth040494

sadece bir düzeltmeyi anlamak için Apple'ı iOS 11'e kadar neden aldı?
Eman

96

Bu Xcode 9'da bir hata gibi görünüyor ve betalarda da mevcuttu. Derleme hatasını yalnızca film şeridi aracılığıyla bir WKWebView oluşturuyorsanız alırsınız. WKWebView öğesini karşılık gelen ViewController sınıf dosyasında progmatik olarak oluşturursanız, iOS 11'in altındaki iOS sürümlerini oluşturabilmeniz gerekir. İşte bunun için Apple'ın web sitesinde verilen yaklaşım:

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

Daha sonra normalde yaptığınız gibi WKWebView işlevini uygulayabilmeniz gerekir.

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


5
unutmasuper.loadView()
albirrojo7

super.loadView()başında olmak zorunda. Onsuz hiçbir şey göstermez.
Makalele

merhaba :), bunun kısıtlamalarını webviewNavigationBar'ım altına nasıl ayarlayabileceğimi biliyor musunuz ? Bu çözümünüz çalışıyor ancak tüm ekranı kaplıyor.
Abed Naseri

@AbedNaseri kısıtlamalar koymanız gerekmediğini düşünüyorum ... storyboard ve sonra self.navigationController?
xhinoda

58

Buna ek olarak, diğer bileşenlerle birlikte bir özel işlemUIViewController gerçekleştirmek istiyorsanız, örneğin adı verilen film şeridi aracılığıyla bir "kapsayıcı" yapabilirsiniz 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)
    }

Çok teşekkür ederim, gerçekten yardım ediyor. Apple tarafından bilinen bir hata
Sébastien REMY

1
Yaradı! iOS 11 ve hızlı 4.1'de test edildi
Alwin

2
Eğer hata [LayoutConstraints] Unable to simultaneously satisfy constraintsalıyorsanız, hattı unutmayın webView.translatesAutoresizingMaskIntoConstraints = false. Bunu true olarak ayarlı bırakırsanız, webViewotomatik olarak programınız için eklediğiniz kısıtlamalarla çakışacak bir dizi kısıtlama oluşturur . Apple Dokümanlar .
mogelbuster

51

Eski hedeften iOS 11.0'a taşındıysanız ve yine de bu hatayı alıyorsanız, aşağıdaki çözümü kullanın.

  1. Storyboard'a (Main.storyboard) gidin, herhangi bir Sahne'yi tıklayın.
  2. Xcode'un sağ taraftaki özellik penceresi olan 'Dosya Denetçisi'ni seçin
  3. Değişiklik ' Derlemeler için ' değerini ' iOS 11.0 ve Üstü ' olarak değiştirin
  4. Derleme ve Oluşturma

resim açıklamasını buraya girin


2
@VyachaslavGerchicov: Seni bilmiyorum, ama sektörde, daha yeni teknolojiye dönüştürülmesi gereken daha eski projelerimiz var. Birçoğu aynı problemle karşı karşıya. Daha önce "eski hedeften taşınırsanız" cevabından bahsettim. Sadece bir vaka düşünmeyin.
Kampai

1
Bu sinir bozucu IB kurulumunu işaret ettiğin için teşekkürler. Uyarı hemen gider. Aslında, bu daha pratik ve cevap kabul edilmelidir düşünüyorum. @Kampai ile hemfikiriz, aslında Apple temel çerçevelerini değiştirmeye devam ettiği için iOS'un yeni sürümüne geçmek zorundayız
infinity_coding7

İOS 10.x uygulaması ile simülatörde çalışırken bunu yaptıktan sonra çöküyor.
Ramis

@Ramis: iOS 10 için yapıyordum, uygulama çökmesi olmadı, çökme günlüğü neydi?
Kampai

1
Bu sorunu çözmek için en basit çözüm. Teşekkürler!
Jerry Chong

18

Aynı sorunla karşı karşıya kaldım ama programlı olarak WKWebView eklersek bu sorunla karşılaşılabilir .

  1. Film şeridinde yapmak istediğiniz tasarımı yapın, ancak WKWebView için yer bırakın , bu alanda bir görünümü sürükleyip bırakın ve webViewContainer olarak adlandırın ve bu iki özelliği bildirin ,

    @property (weak, nonatomic) IBOutlet UIView *webViewContainer;
    @property(nonatomic, strong)WKWebView *webView;
  2. Şimdi webView oluşturun ve ekleyin:

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

    createWebView işlevi,

    -(WKWebView *)createWebView
    {
         WKWebViewConfiguration *configuration = 
                   [[WKWebViewConfiguration alloc] init];
         return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
    }
  3. Şimdi bu yeni oluşturulan webView'ı containerView'a şu şekilde ekleyin:

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
  4. Son olarak, URL'nizi böyle yükleyin,

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

Bunu okuduğunuz için teşekkürler.


3

WebKit iOS 8'de tanıtıldı, ancak bir çalışma zamanı çökmesine neden olan bir hatayla yayınlandı, Xcode 9/10 kullanıyorsanız , proje yapılandırmanız iOS 11'den daha az destek veriyor ve arayüz oluşturucuyu kullanarak WKWebView eklemeye çalışıyorsanız. Xcode derleme derleme zamanı hatasını gösterir.

İOS 11.0'dan önceki WKWebView (önceki sürümde NSCoding Desteği bozuldu)

WKWebView, iOS 8'de kullanılmasına rağmen - [WKWebView initWithCoder:] içinde yalnızca iOS 11'de düzeltilen bir hata oluştu .

resim açıklamasını buraya girin

Çözüm, WKWebView koduyla eklemeniz gerektiğidir (Yalnızca iOS 11'in altında destekliyorsanız). Aslında garip geliyor.

Başka bir çözüm , seçenek için Arabirim Oluşturucu Belge Yapılarını iOS 11 ve sonraki bir sürüme değiştirmek (Eski hedefden iOS 11'e geçiyorsanız ve yine de aynı hatayı alıyorsanız).


1

// Swift için

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

// Amaç C için

#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

resim açıklamasını buraya girin


0

Bu Kampai'nin cevabı hakkında bir yorum olmalı, ancak yorum yapmak için yeterli itibar puanım yok.

Açık iOS sürümlerinin yanı sıra, 'Dosya İnceleyicisi'ndeki' Derlemeler için 'açılır menüsü de Dağıtım Hedefi (..) seçeneğini içerir. Mümkünse sürümleri tek bir yerden yönetmeyi tercih ediyorum ve yine de oluşturma hedefini değiştirmek istedim. Genel ayarlarda karşılık gelen girişi 11.0 olarak değiştirmeme rağmen , hala Dağıtım Hedefi (9.3) dediğini tamamen karıştırdım .

Her şeyin beklendiği gibi çalışması için XCode'un (11.3.1) yeniden başlatılması gerekiyordu, 'Dağıtım Hedefi (11.0)' seçeneği mevcuttu (ve 9.3 gitti). Seçimden sonra her şey beklendiği gibi çalıştı.


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'de kullanımdan kaldırıldı ve WKWebView yalnızca iOS11'de çalışıyor - bu Xcode GM'de bir hata gibi görünüyor.


Evet. İOS'un önceki sürümüne dağıtmak istiyorsanız bulduğum tek çözüm, WKWebView'ınızı programlı olarak eklemektir.
Mehdi Chennoufi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.