SFSafariController 在模拟器中加载 URL 正常,但在设备上留下空白屏幕

SFSafariController loads URL fine in simulator but leaves a blank screen on device

所以我正在使用 SFSafariController 加载从 cloudkit 下载的 URL,就像这样。

    if let yelpurl = detail.value(forKey: "Yelp") as? String
    {

        let url = URL(string:  (yelpurl))
        let safari = SFSafariViewController(url: url!, entersReaderIfAvailable: false)
        safari.delegate = self as? SFSafariViewControllerDelegate
        self.present(safari, animated: true, completion: {

        })
    } else {
    }

}

代码本身没问题 - 没有错误,调出 yelp 页面 URL 并将其加载到模拟器的 SFSafariController 中,但在我的设备上,我留下了空白屏幕。是什么导致了这种差异?我该如何在设备上纠正它?

补充一下,plist 仍然没有任何修改。

编辑 1: 我创建了一个新项目来纯粹测试下面提到的代码,以可能发现一个新错误。这就是我发现的 - 想知道如何解决。

更新: 我更新到 10.3.3 并删除了我的浏览历史。

刚刚创建了一个示例项目,它可以在模拟器和 iPhone 6S iOS 10.3.2 上运行,代码:

import UIKit
import SafariServices

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let deadlineTime = DispatchTime.now() + .seconds(1)
        DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
            self.showLinksClicked()
        }

    }

    func showLinksClicked() {

        let yelpurl = "https://google.com"
        let url = URL(string:  (yelpurl))
        let safari = SFSafariViewController(url: url!, entersReaderIfAvailable: false)
        safari.delegate = self as? SFSafariViewControllerDelegate
        self.present(safari, animated: true, completion: {
        })
    }
}

看来您的 URL 或您调用呈现 safari 的方法的方式有问题。将您的代码放到一个单独的方法中,并确保您传递正确 URL。

在我的应用程序中我这样做了:

import UIKit
import SafariServices

class ViewController: UIViewController, SFSafariViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()


        }

    }

    func linkIsClicked(){

       let safariVC = SFSafariViewController(url: NSURL(string: "your url")! as URL)
        self.present(safariVC, animated: true, completion: nil)
        safariVC.delegate = self
}

而且效果很好