我试图在到达某个页面时关闭SFSafariViewController。但我无法做到这一点,直到“完成”按钮是由用户明确按下。我想要的是在URL到达某个页面后立即获取URL,然后关闭视图控制器。
func safariViewControllerDidFinish(_ controller: SFSafariViewController){ // do work here }
注:这个问题以前也有人问过,但我找不到满意的答案
ldioqlga1#
如果你为你的应用注册了一个URI方案,你可以在一个页面上有一个链接,它可以把你带回到你的应用。
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
你的AppDelegate,你可以做任何你想做的事情。“因为Safari View Controller可以访问用户的凭据,并通过iCloud Keychain在所有设备上同步,登录将变得轻而易举。[...]这需要两个步骤。第一个步骤是使用自己的应用内浏览器,只需呈现SFSafariViewController的示例。一旦用户完成登录,第三方Web服务使用您提供的自定义URL方案重定向回您的应用,您可以在AppDelegate的handleOpenURL方法中接受该方案。从那里您可以检查响应并关闭SFSafariViewController的示例,因为您知道身份验证已经完成。就这样,两步。”来源:http://asciiwwdc.com/2015/sessions/504#t=1558.026请注意,handleOpenURL方法已被弃用,转而支持application:openURL:options:。
handleOpenURL
application:openURL:options:
pgccezyw2#
编辑:
也许已经晚了,但我认为这将有助于任何人搜索相同的问题听SFSafariViewControllerDelegate委托,你可以在里面使用这个方法
func safariViewController(_ controller: SFSafariViewController, initialLoadDidRedirectTo URL: URL) {}
在它里面,你可以在你的某个页面上设置条件,你需要采取行动……例如,如果我想在到达某个页面时关闭它,我会这样做
func safariViewController(_ controller: SFSafariViewController, initialLoadDidRedirectTo URL: URL) { if URL.absoluteString == "WHATEVER YOUR LINK IS"{ controller.dismiss(animated: true, completion: nil) } }
iezvtpos3#
使用SFSafariViewController无法做到这一点。请使用WKWebView并实现WKNavigationDelegate方法(如optional func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)),然后读取当前URL。基于此定义您的操作。你可以使用这个来关闭包含你的web视图的视图控制器。不幸的是,如果你想允许用户访问这些按钮,你将不得不构建自己的导航按钮(SFSafariViewController拥有的那些)。你不必提供它们。
SFSafariViewController
WKWebView
WKNavigationDelegate
optional func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
3条答案
按热度按时间ldioqlga1#
如果你为你的应用注册了一个URI方案,你可以在一个页面上有一个链接,它可以把你带回到你的应用。
你的AppDelegate,你可以做任何你想做的事情。
“因为Safari View Controller可以访问用户的凭据,并通过iCloud Keychain在所有设备上同步,登录将变得轻而易举。[...]这需要两个步骤。第一个步骤是使用自己的应用内浏览器,只需呈现SFSafariViewController的示例。
一旦用户完成登录,第三方Web服务使用您提供的自定义URL方案重定向回您的应用,您可以在AppDelegate的handleOpenURL方法中接受该方案。
从那里您可以检查响应并关闭SFSafariViewController的示例,因为您知道身份验证已经完成。
就这样,两步。”
来源:http://asciiwwdc.com/2015/sessions/504#t=1558.026
请注意,
handleOpenURL
方法已被弃用,转而支持application:openURL:options:
。pgccezyw2#
编辑:
答案变得无效…现在要这样做,你必须实现wkwebview组件
也许已经晚了,但我认为这将有助于任何人搜索相同的问题听SFSafariViewControllerDelegate委托,你可以在里面使用这个方法
在它里面,你可以在你的某个页面上设置条件,你需要采取行动……例如,如果我想在到达某个页面时关闭它,我会这样做
iezvtpos3#
使用
SFSafariViewController
无法做到这一点。请使用WKWebView
并实现WKNavigationDelegate
方法(如optional func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
),然后读取当前URL。基于此定义您的操作。你可以使用这个来关闭包含你的web视图的视图控制器。不幸的是,如果你想允许用户访问这些按钮,你将不得不构建自己的导航按钮(
SFSafariViewController
拥有的那些)。你不必提供它们。