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

Posted

技术标签:

【中文标题】SFSafariController 在模拟器中加载 URL 正常,但在设备上留下空白屏幕【英文标题】:SFSafariController loads URL fine in simulator but leaves a blank screen on device 【发布时间】:2017-08-12 06:07:33 【问题描述】:

所以我使用 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 并删除了我的浏览历史记录。

【问题讨论】:

任何链接有问题还是只是您的网站有问题?尝试打开google.com 即使google.com 在设备上也不起作用。 URL 取自从云套件接收的变量? 【参考方案1】:

刚刚创建了一个示例项目,它可以在模拟器和 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。

【讨论】:

您是否在 plist 中添加了任何信息? @jonpeter 不,只需创建新的单视图应用程序并通过我的回复中提供的替换 ViewController.swift 代码。没有其他额外的魔法。 Xcode 8.3.3 @jonpeter 在您的代码中只需在您需要显示此网站的地方调用“self.showLinksClicked()” - 按钮点击事件、任何处理程序或任何您需要的地方。 很遗憾,您的解决方案运行了一次,问题又出现了。 @jonpeter 重新启动应用程序只需轻按两次主页按钮(主页按钮 - iPhone 正面唯一的硬件按钮),然后向上滑动应用程序进程。然后再次打开应用程序并享受它的工作))这种行为的主要原因是我的应用程序是一次性应用程序,向您展示解决方案有效,我调用 viewDidLoad 方法呈现 safari。随意将其移动到 viewWillAppear 以更频繁地查看它或创建一个按钮并在每次点击该按钮时调用 safari。【参考方案2】:

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

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

而且效果很好

【讨论】:

您的 plist 有什么变化吗?

以上是关于SFSafariController 在模拟器中加载 URL 正常,但在设备上留下空白屏幕的主要内容,如果未能解决你的问题,请参考以下文章

网页在模拟器的 safari mac safari 中加载,但未在 webView iOS obj C 中加载

WebView 在模拟器中加载但不在设备中

GPX 文件不会在 Android 模拟器中加载

图像不会在 Xcode iOS 模拟器中加载

颤动 - WebViewController 中的 HTML 文件未按预期在 iOS 模拟器中加载

UIImageView 和 UIButton 背景图像在模拟器中加载时变黑