【问题标题】:How to close SFSafariviewcontroller once we get openurl in SwiftUI iOS?一旦我们在 SwiftUI iOS 中获得 openurl,如何关闭 SFSafariviewcontroller?
【发布时间】:2021-09-30 06:42:19
【问题描述】:

我正在开发 SwiftUI 应用程序,我正在导航到 SFSafariviewcontroller(浏览器),一旦登录完成,我就会得到 openurl。

我想在获得 openurl 后自动关闭 SFSafariviewcontroller。

感谢您的帮助...以下是我的工作

//how I am calling Safari 
     .fullScreenCover(isPresented: $isButtonActive, content: {
                    if let url = loginAction() {
                        SafariView(url: url)
                        
                    }
                }


//how i am getting openurl
    @main
    struct MyApplication: App {
      var body: some Scene {
        WindowGroup {
          ContentView()
            .onOpenURL { url in
              // handle the URL that must be opened
            }
        }
      }
    }

我的 Safari 代码

import SafariServices

struct Myview: View {
    
    @EnvironmentObject var appConfiguration : AppConfiguration
    @State private var isButtonActive = true
    @State private var isLoginActive = true

    var body: some View {
        NavigationView {
                    Button( buttonTitle: "button" buttonCallback: {
                        self.isLoginActive = true
                    }, isActive: $isButtonActive)
                }
            }
            .afklPageView()
            .navigationBarTitle("title", displayMode: .inline)
            .fullScreenCover(isPresented: $isButtonActive, content: {
                if let url = loginAction() {
                    SafariView(url: url)

                }
            })
        
        }
            
    }

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

【问题讨论】:

  • 我认为你不可能知道你应该关闭SFSafariViewController,除非我们知道你一开始是如何打开它的。
  • 我更新了我如何调用 URL 来打开 SFSafariciewcontroller 的问题...这有帮助吗?
  • 一点。您需要将isButtonActive 设置为false。这可能意味着拥有某种状态,从应用程序的根级别一直共享到显示fullScreenCover 的任何视图。你知道如何使用environmentenvironmentObject 吗?或者如何通过视图传递状态?
  • 感谢您的指点。我需要检查如何使用它们,因为我现在不确定。如果你能有一些例子会很有帮助
  • @jnpdx 我理解概念,但我怀疑我没有看到任何关闭 safari 的方法,而不是手动单击完成按钮...但我想在 openurl 自动关闭 safari...你能帮忙?

标签: ios swiftui sfsafariviewcontroller


【解决方案1】:

这是一个基本示例,展示了如何将浏览器的状态存储在 EnvironmentObject 中:

class SafariState : ObservableObject {
    @Published var showSafari = false
}

@main struct StackOverflowApp: App {
    @StateObject var safariState = SafariState()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(safariState)
                .onOpenURL { url in
                    safariState.showSafari = false
                }
        }
    }
}

struct ContentView: View {
    @EnvironmentObject private var safariState : SafariState
    
    var body: some View {
        Button("Toggle safari") {
            safariState.showSafari.toggle()

            //include for testing to show how to dismiss it
            //DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            //    safariState.showSafari = false
            //}
        }.fullScreenCover(isPresented: $safariState.showSafari) {
            SafariView(url: URL(string: "https://google.com")!)
        }
    }
}

注意SafariState 是如何使用.environmentObject 传递到视图层次结构中的

【讨论】:

  • 非常感谢......这正是我正在寻找的......我从你那里学到了很多
  • 太好了——如果它有用,请随时为答案投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2016-10-18
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
相关资源
最近更新 更多