ios - 一旦我们在 SwiftUI iOS 中获得 openurl,如何关闭 SFSafariviewcontroller?
问题描述
我正在开发 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>) {
}
}
解决方案
这是一个基本示例,展示了如何将浏览器的状态存储在 中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
推荐阅读
- java - 如何从 Firestore 中检索我的 Geopoint 对象
- python - 用 sys.stdout 保存输出,但我想在控制台/终端上显示它
- android - Android Studio - 无法调试应用程序
- appcelerator - 在 WebView 中显示 PDF 文件不起作用 - Titanium
- c# - 在调用 Query 之前在 EntityFramework 上下文中执行 SET 语句
- php - 如何验证是否检查了 reCaptcha
- gradle - 如何修复“缺少分析所需的以下类”
- javascript - 显示从 JAVA 到 HTML href 的可点击链接及其 URL 图像/文本等
- python - 与复杂的架构相关,以刮取美丽的汤
- java - 有没有办法重用一个 observable 直到第二个将在 zip 中获得 onComplete() ?