UIWebView’den WKWebView’e Geçiş

Apple’dan yakın dönemde bir bildirim aldım. Derki;

ITMS-90809: Deprecated API Usage – Apple will stop accepting submissions of app updates that use UIWebView APIs starting from December 2020. See https://developer.apple.com/documentation/uikit/uiwebview for more information.

Evet 2020 Aralıktan itibaren UIWebView kullanılan app’ler için update’leri kabul etmeyeceğim, bilesiniz. Ne yapcaz peki, app içerisinde kullanılan tüm UIWebView‘leri WKWebView‘e dönüştürmemiş gerekecek.

Bu dönüşüm sürecinde yaşayabileceğiniz birkaç sorun için çözümlerimi paylaşmak istiyorum sizlerle.

  • UIWebView’i StoryBoard üzerine eklediyseniz, aynı şekilde WKWebView nesnesini de Storyboard’a eklemek isteyebilirsiniz. Bu durumda aşağıdaki uyarılarımı lütfen dikkate alınız.

WKWebView iOS8 için duyurulduktan sonra bir bug’ı olduğu farkedilir, initWithCoder constructor’ı ile ilgili. Ve bu bug iOS 11’de düzeltilir. Bu sebeple şayet uygulamanız iOS11’den daha düşük versiyonları da desteklesin istiyorsanız, Storyboard’dan değil sadece kod ile ekleme yapabilirsiniz. Storyboard’a eklemekte ısrarcı olursanız şu şekilde bir derleme hatası alırsınız. WKWebView before iOS 11.0 (NSCoding Support was broken in the previous version)

*** iOS11 ve sonrasını destekliyorsanız sizin için önemsiz bir detay, boşverin.

Kod ile aşağıdaki şekilde ekranınıza bir WKWebView ekleyebilirsiniz. Burada karşılaşabileceğiz bir durum’da şudur. Şayet ekranınızda WebView dışında başka component’ler varsa ve bunlar AutoLayout vb. bir şekilde birbirleriyle karmaşık bir ilişkili halindeyse, aradan WebView’i çıkarıp koddan eklemekte zorlanabilirsiniz. Bunun için Storyboard’dan WebView yerine aynı constraint’lerle bir UIView ekleyip, bunu container olarak kullanmanızı tavsiye ederim. WKWebView’i de bu container UIView içerisine koddan ekleyebilirsiniz.

 
        webView = WKWebView()
        webView.navigationDelegate = self
        webView.uiDelegate = self
        webView.backgroundColor = UIColor.white
        webView.isOpaque = true
        
        webViewContainer.addSubview(webView)
       
        // Burada snapkit kullanıldı. 
        webView.snp.makeConstraints { make in
            make.top.leading.trailing.bottom.equalToSuperview()
        }
        
        webView.loadHTMLString(htmlContent, baseURL: nil)
}

Burada şöyle bir sıkıntı yaşayabilirsiniz. WKWebView font büyüklüğü ile UIWebView’in render ettiği birbirinden farklı. Bu sebeple geçiş sonrasında content’in çok çok kalması gibi sorun yaşayabilirsiniz. Bunu çözmek için viewport ayarlayacak şekilde bir javascript execute edebilirsiniz. Ben sizin için bir extension hazırladım, UIWebView’de olup WKWebview’de olmayan scalesPageToFit’in eşdeğeri olarak kullanılabilir.

extension WKWebView {
    public static func instanceWithConfig() -> WKWebView {
        let jScript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
        let wkUScript = WKUserScript.init(source: jScript, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: true)
        let wkUController = WKUserContentController.init()
        wkUController.addUserScript(wkUScript)
        
        let wkWebConfig = WKWebViewConfiguration.init()
        wkWebConfig.userContentController = wkUController;
        
        let webView = WKWebView(frame: CGRect.zero, configuration: wkWebConfig)
        return webView
    }
}
let webView =  WKWebView.instanceWithConfig() 

Son bir konuya değinerek bu bölümü tamamlamak istiyorum. Siz projenizden tüm UIWebView’leri temizlemiş olmanıza rağmen, AppStore’a upload ettikten sonra halen uyarı almaya devam edebilirsiniz. Kullandığınız bir library içerisinde kullanıyor olabileceği aklınızda olmalı. Fakat hangi library’nin kullandığını search yaparak falan bulma imkanınız olmayabilir. Mesela cocoapod kullanıyorsanız, podları incelediğiniz zaman elinizde sadece interface class’ların olduğunu görebilirsiniz. Bu sebeple yine hayat kurtaracak bir yöntem paylaşmak isterim.

Terminal’i açarak projenizin root dosyasına kadar ilerleyin. Ve sonra aşağıdaki komutu çalıştırın. UIWebView’den sonra gelen noktayı da eklemeyi unutmayın. Bunu çalıştırdıktan sonra matches olan library’lerin güncellemerine göz atın. Umarım UIWebView’i çıkardıkları güncel bir versiyonlarına erişebilirsiniz.

grep -r “UIWebView” .

Umarım faydalı olmuştur bu yazdıklarım, kendi projelerimde karşıma çıkan ve birkaç günümüde alan bazı sorunları umarım siz daha kolay aşarsınız bu bilgileri sonrasında. Yorumlarınızla katkı sunarsanız memnun olurum. Hoşçakalın.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn
Bu yazıyı beğendiyseniz daha fazla kişiye ulaşmasını sağlamak için paylaşabilirsiniz.