【问题标题】:Webview, different behavior in simulator compared to deviceWebview,模拟器中的不同行为与设备相比
【发布时间】:2022-01-01 15:32:57
【问题描述】:

早安,

我发现了一个我无法理解的有趣行为。

我有一个具有 WKWebView 的应用程序。我使用本地保存的 html 文件呈现在 webview 中。为了呈现每个视图,我为每个 html 文件设置了一个按钮。在模拟器中,当我点击每个按钮时,我可以在视图之间切换。但在实际设备中,我可以看到两个视图一次,然后卡在第二个视图上,不会变回第一个视图。

我已将此问题转移到一个新项目中,我可以在其中使用它而不会弄乱应用程序的其余部分。我在测试项目中遇到了同样的问题。

@IBOutlet weak var wec: WKWebView!

override func viewDidLoad() {
    super.viewDidLoad()
    wec.uiDelegate = self
    // Do any additional setup after loading the view.
}

@IBAction func one() {
    show_web(str: "one")
}

@IBAction func two() {
    show_web(str: "two")
}

func show_web(str: String) {
    var dir_name: String!
    switch str {
    case "one":
        dir_name = "one"
    case "two":
        dir_name = "two"
    default:
        return
    }
    
    let documentDirectory = create_directory_if_needed(directory: dir_name)
    let index_html_url = documentDirectory!.appendingPathComponent("index.html")
         
    print("--------------- LOADING WEB VIEW ------------------/n",
          index_html_url.path,
          "--------------- LOADING WEB VIEW END ------------------/n")
    let request = URLRequest(url: index_html_url)
    print("???????", request)
    self.wec.load(request)
}

func create_directory_if_needed(directory: String) -> URL? {
    let fm = FileManager.default
    let documentDirectory = fm.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let new_folder = documentDirectory.appendingPathComponent(directory)
    if !fm.fileExists(atPath: new_folder.path) {
        do {
            try fm.createDirectory(at: new_folder, withIntermediateDirectories: true, attributes: nil)
        }catch {
            print("*********** ERROR create directory ***************")
            print(error)
            print("*********** ERROR End ***************")
            return nil
        }
    }
    
    return new_folder
}

当我打印请求时,它总是显示我想要呈现的正确路径,但它没有加载正确的路径。

--------------- 加载网络视图 ------------------/n /Users/jonasrafnsson/Library/Developer/ CoreSimulator/Devices/189C901B-CD20-4636-B176-0DCE7AED456D/data/Containers/Data/Application/CB8A2C28-3406-4162-9A6E-6C0B924F6874/Documents/two/index.html --------------- 加载网络视图结束 ------------------/n

??????? file:///Users/jonasrafnsson/Library/Developer/CoreSimulator/Devices/189C901B-CD20-4636-B176-0DCE7AED456D/data/Containers/Data/Application/CB8A2C28-3406-4162-9A6E-6C0B924F6874/Documents/two/index .html

--------------- 加载网络视图 ------------------/n /Users/jonasrafnsson/Library/Developer/ CoreSimulator/Devices/189C901B-CD20-4636-B176-0DCE7AED456D/data/Containers/Data/Application/CB8A2C28-3406-4162-9A6E-6C0B924F6874/Documents/one/index.html --------------- 加载网络视图结束 ------------------/n

??????? file:///Users/jonasrafnsson/Library/Developer/CoreSimulator/Devices/189C901B-CD20-4636-B176-0DCE7AED456D/data/Containers/Data/Application/CB8A2C28-3406-4162-9A6E-6C0B924F6874/Documents/one/index .html

以前有人见过这种行为吗?

问候, 乔纳斯

【问题讨论】:

  • 什么时候复制目录中的内容,尤其是 index.html ?
  • 既可以在启动时使用,也可以通过按钮按要求获取它们。这些文件从服务器下载并放置在正确的目录中。我知道它们在那里,因为当我按下按钮显示它们时它们都会出现一次。在模拟器中,每次我点击按钮时它们都会亮起。
  • 我在您的代码中看到的只是您创建目录的位置(如果它不存在)。在这种情况下,没有 index.html 下载。在打开网页视图之前尝试检查 index.html 文件是否存在。您还必须假设下载文件可能需要不确定的时间。

标签: ios swift wkwebview urlrequest


【解决方案1】:

我想到的解决方案是以编程方式添加 Web 视图,并在每次更改视图时创建一个新的 Web 视图。

import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate {

  @IBOutlet weak var web_view: UIView!
  var web: WKWebView!

  override func viewDidLoad() {
      super.viewDidLoad()
    
      // Do any additional setup after loading the view.
  }

  override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
      setup_web()
  }

  @IBAction func copyD() {
      let fm = FileManager.default
      let urls = [create_directory_if_needed(directory: "one"), create_directory_if_needed(directory: "two")]
    
      let files = [Bundle.main.url(forResource: "index_1", withExtension: "html"), Bundle.main.url(forResource: "index_2", withExtension: "html")]
    
      for f in 0..<files.count {
          do {
              try fm.copyItem(atPath: files[f]!.path,
                            toPath: urls[f]!.appendingPathComponent("index.html").path)
          }catch {
              print("*********** ERROR Copying Single file **************")
              print(error)
              print("*********** ERROR End **************")
          }
      }
  }

  @IBAction func one() {
      reset_webview()
      show_web(str: "one")
  }

  @IBAction func two() {
      reset_webview()
      show_web(str: "two")
  }

  func setup_web() {
      web = WKWebView(frame: CGRect(x: 0, y: 0, width: web_view.frame.width, height: web_view.frame.height))
      web.uiDelegate = self
      web_view.addSubview(web)
  }

  func reset_webview() {
      web.removeFromSuperview()
      web = nil
      setup_web()
  }

  func show_web(str: String) {
      var dir_name: String!
      switch str {
      case "one":
          dir_name = "one"
      case "two":
          dir_name = "two"
      default:
          return
      }
    
      let documentDirectory = create_directory_if_needed(directory: dir_name)

      let index_html_url = documentDirectory!.appendingPathComponent("index.html")
         
      print("--------------- LOADING WEB VIEW ------------------/n",
            index_html_url.path,
            "--------------- LOADING WEB VIEW END ------------------/n")
      let request = URLRequest(url: index_html_url)
      print("???????", request)
      self.web.load(request)
  }

  func create_directory_if_needed(directory: String) -> URL? {
      let fm = FileManager.default
      let documentDirectory = fm.urls(for: .documentDirectory, in: .userDomainMask)[0]
      let new_folder = documentDirectory.appendingPathComponent(directory)
      if !fm.fileExists(atPath: new_folder.path) {
          do {
              try fm.createDirectory(at: new_folder, withIntermediateDirectories: true, attributes: nil)
          }catch {
              print("*********** ERROR create directory ***************")
              print(error)
              print("*********** ERROR End ***************")
              return nil
          }
      }
    
      return new_folder
  }

  func check_if_file_exists(url: URL) -> URL? {
      let fm = FileManager.default
      // Check if the file exists, in case it doesnt we stop here.
      let path = url.path
      guard fm.fileExists(atPath: path) else {
          return nil
      }
      return url
  }
}

这些按预期工作。也许不是最简单的方法,但我管理的唯一方法。

乔纳斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2010-12-16
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2023-04-06
    相关资源
    最近更新 更多