首页
学习
活动
专区
工具
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.8K31
  • iOS多渠道来源追踪怎么做,多种方案可选择

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

    5.1K11

    掌握 TipKit :基础

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

    27210

    酷我音乐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.4K30

    酷我音乐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.1K21

    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

    UIApplication

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

    55430

    掌握 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

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

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

    37710

    备受乔布斯推崇的 PWA,为什么还没有杀死原生应用?

    iOS 推送通知 macOS Ventura 的 Safari 16 将带来 Web 推送功能。即使 Safari 被关闭,也会发送通知。...在我的个人愿望清单中,我希望 PWA 在安装后拥有比普通网站更高的权限(但不像原生应用那样多)。人们安装你的 PWA 说明他们信任它——他们不是偶然才发现你的网站的。 以下是一些赋予较高权限的例子。...需要注意的是,许多应用内浏览器使用了 SFSafariViewController,如 Twitter 的 iOS 应用。 结果,开发者别无选择,只能显示自定义指令。...更好的安装后 Manifest 更新 如果开发者能够在安装 App 后更新 Manifest 的关键细节(图标、名称、启动画面等),那么 PWA 也会变得更具竞争力。...在 Android 上,打开第三方 App 中的链接将打开已安装的 PWA。然而,在 iOS 上,它却打开了 Safari 浏览器。

    1.5K10

    掌握 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

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

    在 SwiftUI 4.0 中,contextMenu 的功能获得了不小的提高。例如一个上下文菜单中可以有多个选项、支持 primaryAction、以及可定制预览视图。...阅读 SwiftUI 的动画机制[8] 一文,了解更多有关动画的内容。自适应高度 SheetQ:如何在 iOS16 中呈现与动态内容高度相匹配的 Sheet?...A:你永远不会看到 @ToolbarBuilder 了,因为 @ToolbarContentBuilder 在 iOS 16 中得到了功能增强。...SwiftUI 4.0 中,WindowGroup 获得了相当大的更新,真正具备了开发 macOS 应用的能力。...除了使用习惯外,还应考虑偏移后的视图是否需要会对周边的视图产生影响( 布局层面 )。详情请阅读 在 SwiftUI 中实现视图居中的若干种方法[14] 。

    12.3K20
    领券