SafariView 只加载一个 url,似乎无法加载另一个

Posted

技术标签:

【中文标题】SafariView 只加载一个 url,似乎无法加载另一个【英文标题】:SafariView only loads a single url, can't seem to load another 【发布时间】:2020-11-07 15:00:10 【问题描述】:

我想在应用程序内部的 Safari 浏览器中加载特定网页(即不进入应用程序之外),并且它应该存在于同一个 safari 环境中,即没有常规的 webviews。

我有这个 SafariView 在 SwiftUI 中启用它。

现在我想从同一个场景加载不同的 url(数量不同,可以是 0 到 20-ish)。

当我打开 SafariViews 时,虽然只打开了第一个 url。当我点击第二个按钮时,第一个 url 再次加载。

import SwiftUI
import SafariServices

struct ContentView: View 
  @State private var showSafari = false
  
  var body: some View 
    VStack 
      Button(action: 
        showSafari = true
      ) 
        Text("Apple")
          .padding()
      
      .fullScreenCover(isPresented: $showSafari) 
        SafariView(url: URL(string: "http://www.apple.com")!)
      
      
      Button(action: 
        showSafari = true
      ) 
        Text("Google")
          .padding()
      
      .fullScreenCover(isPresented: $showSafari) 
        SafariView(url: URL(string: "http://www.google.com")!)
      
    
  


struct SafariView: UIViewControllerRepresentable 
  var url: URL
  
  func makeUIViewController(
    context: UIViewControllerRepresentableContext<SafariView>
  ) -> SFSafariViewController 
    return SFSafariViewController(url: url)
  
  
  func updateUIViewController(
    _ uiViewController: SFSafariViewController,
    context: UIViewControllerRepresentableContext<SafariView>
  ) 

我在另一个场景中所做的是创建 2 个单独的 showSafari 变量,它似乎可以工作,但在这种情况下,它只会显示 2 个硬编码的 url。

在这个 safari 实现中我是否缺少某些东西,或者我可能需要通过创建一个 showSafari 布尔值数组来解决这个问题?

【问题讨论】:

【参考方案1】:

尝试使用.fullScreenCover(item:content:)

struct ContentView: View 
    @State private var safariURL: String?

    var body: some View 
        VStack 
            Button(action: 
                safariURL = "http://www.apple.com"
            ) 
                Text("Apple")
                    .padding()
            

            Button(action: 
                safariURL = "http://www.google.com"
            ) 
                Text("Google")
                    .padding()
            
        
        .fullScreenCover(item: $safariURL) 
            if let url = URL(string: $0) 
                SafariView(url: url)
            
        
    

请注意,您需要在item 中传递一些Identifiable 变量。一种可能的解决方案是使 String 符合 Identifiable:

extension String: Identifiable 
    public var id: Self  self 

【讨论】:

以上是关于SafariView 只加载一个 url,似乎无法加载另一个的主要内容,如果未能解决你的问题,请参考以下文章

页面加载特定URL时的Jquery addClass

从URL加载下一组结果 - PHP cURL

Fetch API 无法加载 URL 方案对于 CORS 请求必须是“http”或“https”

引导图像库,无法加载自己的 Flickr 图像

无法在 BlackBerry Cascades 中通过 https 加载 JSON 数据源

AVPlayer 永远无法播放