WKWebView не загружает веб-страницу - отображает пустой экран в Swift - PullRequest
0 голосов
/ 11 мая 2018

Этот код должен загружать домашнюю страницу Apple, но вместо этого показывает пустой экран.
Это происходит с URL-адресами HTTP и HTTPS.

код:

import UIKit
import WebKit

class WebViewController: UIViewController, WKUIDelegate{

    var webView: WKWebView!

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView

    }
    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .red

        let myURL = URL(string: "https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
}

Я попытался изменить «Настройки безопасности транспорта приложения», чтобы разрешить произвольную загрузку. Ничего не изменилось.

Скриншоты:

Просмотр иерархии:

Captured view hierarchy Screenshot

Консоль отладки Safari для симулятора:

Safari debug console Screenshot

enter image description here

Ответы [ 6 ]

0 голосов
/ 08 марта 2019

Правильный способ с автоматической разметкой и константой 10 для всех устройств:

import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate {

let webView = WKWebView()

override func viewDidLoad() {
    super.viewDidLoad()
    setupWebView()
}

fileprivate func setupWebView() {
    webView.uiDelegate = self
    webView.translatesAutoresizingMaskIntoConstraints = false
    DispatchQueue.main.async {
        guard let url = URL(string: "http://www.apple.com") else { return }
        self.webView.load(URLRequest(url: url))
    }
    view.addSubview(webView)
    webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10).isActive = true
    webView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10).isActive = true
    webView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -10).isActive = true
    webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 10).isActive = true
}}

в info.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
0 голосов
/ 09 декабря 2018

Создание приложения для Mac?

Если вы создаете приложение для Mac, обязательно включите App Sandbox ON в своей цели и отметьте Networks Исходящие подключения.

enter image description here


Обновление: если вы предпочитаете длинный путь, добавьте следующее к YourAppName.entitlements

<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
0 голосов
/ 11 мая 2018

Я нашел решение. Проблема была вызвана веб-щитом AVG AntiVirus. По какой-то причине AVG webshield рассматривает все сетевые коммуникации с симулятора как мошеннические. На следующем снимке экрана показано приложение safari, запущенное на симуляторе. В нем говорится, что www.apple.com не является безопасным или любой другой веб-сайт.

Safari screenshot

Следующий снимок экрана от system.log показывает ошибки с webkit.

System log

Вы можете повторить эту проблему, установив антивирус AVG и включив веб-щит. WKWebview в вашем приложении (на симуляторе) ничего не загрузит.

Я не понимаю, почему это не работает на реальном устройстве, хотя. Это могло быть еще одна проблема с устройством. Я также удалил папку с производными данными, само приложение и перезапустил устройство.

Спасибо всем за ответы и помощь.

0 голосов
/ 11 мая 2018
Your code is working fine
//
//  ViewController.swift
//  StackOverflow
//
//  Created by Vivek Kumar on 5/11/18.
//  Copyright © 2018 Vivek. All rights reserved.
//

import UIKit
import WebKit
class ViewController: UIViewController ,WKUIDelegate{

    var webView: WKWebView!

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .red
        let myURL = URL(string: "https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }

}
[![Simulator screenshot by running your code][1]][1]


  [1]: https://i.stack.imgur.com/dxx0X.png
0 голосов
/ 11 мая 2018

Следующий код прекрасно работает для меня в Xcode 9.3:

import UIKit
import WebKit

class ViewController: UIViewController {

    var webView: WKWebView!

    override func loadView() {
        webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
        self.view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        webView.load(URLRequest(url: URL(string: "https://www.apple.com")!))
    }

}

Вот результат:

WKWebView in iOS Simulator.

0 голосов
/ 11 мая 2018

Вы можете попробовать ниже код

import UIKit
import WebKit

class WebViewController: UIViewController {

var wkWebview: WKWebView!

 override func viewDidLoad() {

   super.viewDidLoad()

    var Ycord : CGFloat = 0.0 // for top space 
    if UIScreen.main.bounds.height == 812 { //Check for iPhone-x
        Ycord = 44.0
    }
    else {
        Ycord = 20.0
    }

    let frame = CGRect(x: 0.0, y: Ycord, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height-Ycord)

    self.wkWebview = WKWebView(frame: frame, configuration: WKWebViewConfiguration())
    self.wkWebview.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.wkWebview.uiDelegate = self
    self.view.addSubview(self.wkWebview)

    DispatchQueue.main.async {

        self.wkWebview.load(URLRequest(url:URL(string: "https://www.apple.com")!))
    }        
 }
}

Выход

enter image description here

...