首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在SwiftUI iOS中获得openurl后,如何关闭SFSafariviewcontroller?

在SwiftUI iOS中获得openURL后,关闭SFSafariViewController可以通过以下步骤实现:

  1. 首先,确保你的视图控制器(ViewController)遵循SFSafariViewControllerDelegate协议。在视图控制器类的声明中添加SFSafariViewControllerDelegate
  2. 在打开SFSafariViewController之前,设置视图控制器为SFSafariViewController的代理。可以在打开SFSafariViewController之前的代码中添加以下行:
代码语言:txt
复制
safariViewController.delegate = self
  1. 实现SFSafariViewControllerDelegate协议中的方法safariViewControllerDidFinish。在该方法中,你可以执行关闭SFSafariViewController的操作。例如:
代码语言:txt
复制
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
    controller.dismiss(animated: true, completion: nil)
}

完整的代码示例:

代码语言:txt
复制
import SwiftUI
import SafariServices

struct ContentView: View {
    @State private var showSafari = false
    
    var body: some View {
        Button(action: {
            showSafari = true
        }) {
            Text("打开Safari")
        }
        .sheet(isPresented: $showSafari) {
            SafariView(url: URL(string: "https://www.example.com")!)
        }
    }
}

struct SafariView: UIViewControllerRepresentable {
    let url: URL
    
    func makeUIViewController(context: Context) -> SFSafariViewController {
        let safariViewController = SFSafariViewController(url: url)
        safariViewController.delegate = context.coordinator
        return safariViewController
    }
    
    func updateUIViewController(_ uiViewController: SFSafariViewController, context: Context) {
        // 更新视图控制器
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, SFSafariViewControllerDelegate {
        let parent: SafariView
        
        init(_ parent: SafariView) {
            self.parent = parent
        }
        
        func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
            controller.dismiss(animated: true, completion: nil)
        }
    }
}

这样,当用户在SFSafariViewController中完成操作后,点击"Done"按钮或者滑动返回即可关闭SFSafariViewController。

注意:以上代码示例使用了SwiftUI的sheet来呈现SFSafariViewController,如果你使用的是UIKit,可以将相应的代码适配到你的项目中。

推荐的腾讯云相关产品:腾讯云移动应用分析(MTA),它是一款提供移动应用数据分析服务的产品,可以帮助开发者深入了解用户行为、应用性能等信息,优化移动应用的开发和运营。了解更多信息,请访问腾讯云移动应用分析(MTA)产品介绍页面:腾讯云移动应用分析(MTA)

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SwiftUI 视图中打开 URL 的若干方法

访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验 本文将介绍 SwiftUI 视图中打开 URL 的若干种方式,其他的内容还包括如何自动识别文本的内容并为其转换为可点击链接...image-20220520182722773 SwiftUI 1.0( iOS 13、Catalina ) 视图中,开发者通常需要处理两种不同的打开 URL 的情况: 点击一个按钮( 或类似的部件...)打开指定的 URL 将文本的部分内容变成可点击区域,点击打开指定的 URL 遗憾的是,1.0 时代的 SwiftUI 还相当稚嫩,没有提供任何原生的方法来应对上述两种场景。...此时 Button ,我们可以直接通过 openURL 来完成 SwiftUI 1.0 版本通过调用其他框架 API 才能完成的工作。...3.0 时代,随着 Text 功能的增强和 AttributedString 的出现,SwiftUI 终于补上了另一个短板 —— 将文本的部分内容变成可点击区域,点击打开指定的 URL。

7.7K31
  • iOS多渠道来源追踪怎么做,多种方案可选择

    iOS的“渠道”通常是指那些在其它 App 或者网页内部,提供到达 App Store 的链接的页面。因此, iOS 追踪发行渠道,主要是追踪进入 App Store 相关页面的渠道信息。...或者在此基础上,实现场景还原,帮助用户首次打开 App 直接跳转进指定页面,而不是首页。...,营销活动才会在“App 分析”显示; 无法兼容 Android 和 iOS企业签名,采用不同的统计方法可能会让数据统一性较差; iOS 8.0 及以上版本的用户可以选择是否将自己的应用使用情况的数据发送给...方案二:使用 SFSafariViewController 传递参数 SFSafariViewControlleriOS 9.0 出现的,可以通过 Safari 对应的 cookier 传递参数,...弊端在于,用户重置系统,或者关闭广告跟踪的话,这种方法就会失效。

    4.8K11

    掌握 TipKit :基础

    如何定义一个 Tip TipKit ,定义一个 Tip 就是声明一个遵循 Tip 协议的结构体。Tip 协议定义了用于 Tip 显示的标题、图像、信息以及用于判断是否满足出现条件的规则。...iOS 下,弹出窗口将以模态视图的方式呈现,只有关闭或隐藏 Tip 才能与其他元素进行交互。....popoverTip(tip){ action in // .... } 本例,由于需要使用视图环境值提供的 openURL ,因此对 Action 的操作实现是视图中进行的。...下面规则的含义是,只有 didTriggerControlEvent 这个事件触发了至少三次才显示 EventRuleTip。...在下篇文章,我们将探讨更多关于 TipKit 的内容,包括 TipKit 的数据保存机制、 UIKit 中使用 TipKit、将 TipKit 作为非提示领域的统计工具使用,以及如何实现完全的自定义视图

    24810

    酷我音乐iOS小组件适配开发实践

    小组件开发遇到的问题 iOS17适配容器视图问题 swiftUI中支持的Button Extension的widget无法正常使用 使用AppIntent Button 的 widget和host...(我们不推荐这样实现,因为这样做可能一个组件只能适配iOS,却不能适配其它 例如watchOS、等系统,就造成兼容性下降等问题.) 2.SwiftUI中支持的Button widget无法正常使用...可以简单理解为 可以通过siri语音控制 的指令 放在手机指令app中用于提供类似脚本一样的命令,这个之前的框架AppIntents库, iOS17之前的app都是手动配置各种选项来开发类似指令的功能...笔者肤浅的认知认为,实现Extension和app通讯有几种方式 NSUserDefault 共享数据 openURL类似的widgetURL方式通过专用的scheme协议跳转app传递参数 这两种有使用限制和场景约束...使用的时候请注意.systemSmall样式的小组件. 6.如何实现歌词动画 先来看下酷我这边实现的效果. 双行歌词动效实现非常简单全部基于SwiftUI系统提供的API实现.

    84221

    酷我音乐iOS小组件适配开发实践

    小组件开发遇到的问题 iOS17适配容器视图问题 swiftUI中支持的Button Extension的widget无法正常使用 使用AppIntent Button 的 widget和host...(我们不推荐这样实现,因为这样做可能一个组件只能适配iOS,却不能适配其它 例如watchOS、等系统,就造成兼容性下降等问题.) 2.SwiftUI中支持的Button widget无法正常使用...可以简单理解为 可以通过siri语音控制 的指令 放在手机指令app中用于提供类似脚本一样的命令,这个之前的框架AppIntents库, iOS17之前的app都是手动配置各种选项来开发类似指令的功能...笔者肤浅的认知认为,实现Extension和app通讯有几种方式 NSUserDefault 共享数据 openURL类似的widgetURL方式通过专用的scheme协议跳转app传递参数 这两种有使用限制和场景约束...使用的时候请注意.systemSmall样式的小组件. 6.如何实现歌词动画 先来看下酷我这边实现的效果. 双行歌词动效实现非常简单全部基于SwiftUI系统提供的API实现.

    1.1K30

    Ask Apple 2022 与 SwiftUI 有关的问答(下)

    SwiftUI 布局 —— 尺寸( 上 )[8] 一文,对建议尺寸的几种模式都进行了介绍。如何减少主线程的负担Q:如何避免所有操作都被放置主线上?...我采用了常见的解决方案,即旋转滚动视图和里面的每个单元格,以获得预期的倒置列表, iOS 上,这很有效。但在 macOS 上,它使 CPU 使用率保持 100%。...macOS APIQ:对于运行 Monterey 的 Mac,能否如何SwiftUI 实现下面需求的建议:打开一个窗口该窗口中初始化数据找到所有打开的窗口确定一个窗口是否打开从不在该窗口的视图中关闭一个窗口...连锁动画Q: SwiftUI 如何实现连锁动画?例如,我想先给一个视图做动画,当动画完成立即启动另一个动画。A:不幸的是,目前不可能实现连锁动画。...这是一个多个版本中都出现过的奇怪问题。 SwiftUI 早期版本,当在 iOS 中使用系统中文输入法时,很容易触发这种情况。但后期逐步得到了修复。

    14.8K30

    SheetKit——SwiftUI模态视图扩展库

    请参阅我之前的文章——SwiftUI,根据需求弹出不同的Sheet[3]。•新的半高模态视图WWDC 2021,苹果为大家带来了期待已久的半高模态视图。...interactiveDismissDisabled SwiftUI 3.0的interactiveDismissDisabled加强版,通过代码控制是否允许手势取消的基础上,增加了当用户使用手势取消时可以获得通知的能力...更多信息请参阅如何SwiftUI实现interactiveDismissDisabled[5] SheetKit的interactiveDismissDisabled为了兼容bottomSheet...SwiftUI3.0,已经可以使用原生API生成各种毛玻璃效果了。但只有将模态视图的背景设置为透明,毛玻璃效果才能显现出来。.../posts/swiftui-multiSheet/ [4] 源地址: https://github.com/fatbobman/SheetKit.git [5] 如何SwiftUI实现interactiveDismissDisabled

    2.9K20

    Text 实现基于关键字的搜索和定位

    欢迎大家 Discord 频道[2] 中进行更多地交流前些日子,一位网友聊天室中就如下的 问题[3] 与大家进行了交流与探讨 —— 如何通过 Text + AttributedString 实现类似文章关键字检索的功能...去年增加了 AttributedString 和 FormatStyle ,今年又增加了 Swift 版本的正则表达式实现 —— Regex。...View 添加显式标识符( 使用 id 修饰器),视图刷新时,List 将会为 ForEach 的所有视图创建实例( 并非渲染 )用以比对视图类型的构造参数是否发生变化,但仍然只会渲染屏幕上显示部分的...请阅读 优化 SwiftUI List 显示大数据集的响应效率[6] 以及 避免 SwiftUI 视图的重复计算[7] 两篇文章,了解更多有关性能优化方面的内容通过 currentPostion 获取需要滚动到的..._25_53搜索条出现时,让 TextField 获得焦点通过 @FocusState ,让 TextField 搜索条出现时,自动获得焦点,从而自动开启键盘。

    4.2K30

    基础篇-UIApplication、UIWindow以及程序的启动流程看我就够了

    一个iOS程序启动创建的第一个对象就是UIApplication对象,且只有一个(通过代码获取两个UIApplication对象,打印地址可以看出地址是相同的)。...的状态栏设置(iOS9 中跟状态栏有关的已经过期,状态栏交给控制器UIViewController管理了) 应用界别的跳转 (openURL) 一 、设置应用程序图标右上角的红色提醒数字(如QQ消息的时候...设置状态栏是白色的,后续可以单个VC通过 UIApplication 随意修改状态栏状态。...应用程序的生命周期事件(启动,关闭,进入后台) 应用级跳转(openURL的接收) 注册通知、推送等 内存警告 # 当应用程序启动完毕的时候就会调用(系统自动调用) - (BOOL)application...iOS程序启动完毕,创建的第一个视图控件就是UIWindow,接着创建控制器的View,最后将控制器的View添加到UIWindow上,于是控制器的View就显示屏幕上了。

    1.6K20

    掌握 SwiftUI 的 task 修饰器

    以下是 task 修饰器更加完整的定义( 从 swiftinterface 文件获得 ):@inlinable public func task(priority: _Concurrency.TaskPriority...SwiftUI 对 @State 做了特别的处理,我们可以在任意线程对其进行安全的修改。...使用 task 替换 onReceive 可以获得两个好处:减少视图不必要的刷新( 避免重复计算 )在后台线程响应消息,减少主线程的负荷为老版本的 SwiftUI 添加 task 修饰器当前,Swift...已经将 async/await 特性向后移植至 iOS 13,但并没有低版本的 SwiftUI 中提供 task 修饰器( 原生的 task 修饰器最低要求 iOS 15 )。...了解了两个版本的 task 修饰器的工作原理和调用机制,为老版本的 SwiftUI 添加 task 修饰器将不再有任何困难。

    2.2K30

    UIApplication

    程序启动创建的第一个对象就是UIApplication对象 4、UIApplication的常见属性: //设置应用程序图标右上角的红色提醒数字 @property(nonatomic) NSInteger...开始,系统提供了2管理状态栏的方式     1)通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏)          ios7,默认情况下...    1)移动操作系统,app很容易收到打扰。...这时候就需要UIApplication来通知delegate对象,来处理这些事件   2)delegate可以处理的事件有:应用程序的生命周期事件(如程序启动和关闭);        系统事件(如来电)...属性; 接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕调用delegate对象的application: didFinishLaunchWithOptions

    54630

    探讨 SwiftUI 的几个关键属性包装器

    在这篇文章,我们将探讨几个 SwiftUI 开发中经常使用且至关重要的属性包装器。本文旨在提供对这些属性包装器的主要功能和使用注意事项的概述,而非详尽的使用指南。...访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...注意事项 iOS 13 ,由于没有提供 @StateObject ,此时 @ObservedObject 是唯一选择,可能会因为无法保证实例的存续期而产生 意想不到的结果[12],为了避免类似问题...一个视图层次,同一个类型的环境对象只有一个实例有效。... iOS 17+ 的环境,如果应用主要依赖于 Observation 和 SwiftData 框架,那么这三个属性包装器的使用频率可能会相对较低。

    31410

    掌握 SwiftUI 的 task 修饰器

    图片 我们的本意是通过按钮来开启和关闭计时器的显示以控制任务的生命周期( 关闭时结束任务 ),但在点击 Hide Timer 按钮,app 出现了无法响应且控制台仍在持续输出( 不按照原定的间隔时间...以下是 task 修饰器更加完整的定义( 从 swiftinterface 文件获得 ): @inlinable public func task(priority: _Concurrency.TaskPriority...使用 task 替换 onReceive 可以获得两个好处: 减少视图不必要的刷新( 避免重复计算 ) 在后台线程响应消息,减少主线程的负荷 为老版本的 SwiftUI 添加 task 修饰器 当前,Swift...已经将 async/await 特性向后移植至 iOS 13,但并没有低版本的 SwiftUI 中提供 task 修饰器( 原生的 task 修饰器最低要求 iOS 15 )。...了解了两个版本的 task 修饰器的工作原理和调用机制,为老版本的 SwiftUI 添加 task 修饰器将不再有任何困难。

    3.6K60
    领券