在某个 url 上关闭 SFSafariViewController
Posted
技术标签:
【中文标题】在某个 url 上关闭 SFSafariViewController【英文标题】:Closes SFSafariViewController on a certain url 【发布时间】:2017-11-13 08:12:12 【问题描述】:当我到达某个页面时,我试图关闭 SFSafariViewController。
但在明确按下“完成”按钮之前,我无法执行此操作 由用户。
我想要的是在到达某个页面后立即获取 URL,然后关闭视图控制器。 然后我可以用这个来挑选其余的
func safariViewControllerDidFinish(_ controller: SFSafariViewController)
// do work here
注意:以前有人问过这个问题,但我找不到任何 满意的答案
【问题讨论】:
您在任何其他应用程序中看到过类似的功能吗?我怀疑这是可能的。 我在一些自定义 API 中看到过,它们使用回调 url 在应用程序委托 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [ :]) -> Bool 以及他们调用dismiss的地方 检查这个问题***.com/questions/41349184/… 那么你就有了 :) 我认为这是唯一的方法 请问有人能告诉我这件事吗?如何在 SFSafariViewController 中获取特定的 URL? 【参考方案1】:如果您为您的应用注册了一个 URI 方案,您可以在页面上有一个链接,将您带回您的应用。到时候你就在
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
你的 AppDelegate,你可以做任何你想做的事情。
“因为 Safari View Controller 可以访问用户的 凭据,通过 iCloud 钥匙串在他们的所有设备上同步, 登录将变得轻而易举。[…] 需要两个步骤。首先 是您使用自己的应用内浏览器的地方,只需提供一个 SFSafariViewController 的实例。
一旦用户完成登录和第三方网络 服务使用您的自定义 URL 方案重定向回您的应用 喂它,你可以在你的 AppDelegate 的 handleOpenURL 中接受它 方法。
您可以从那里检查响应并关闭实例 SFSafariViewController 因为你知道认证是 完成。
就是这样。两步。”
来源:http://asciiwwdc.com/2015/sessions/504#t=1558.026
请注意,handleOpenURL
方法已弃用,取而代之的是 application:openURL:options:
。
【讨论】:
这个方法没有被调用 @Vyachaslav - 我添加了更多信息。为什么说方法没有被调用? 问题是例如在我的情况下是 instagram api 允许使用 http/https URL 方案。同时,这种方法似乎是为自定义方案调用的,而不是为 http/https 调用的。在公共资源中几乎没有关于它的信息。 对。那将是一个问题。您需要使用自定义方案才能返回应用程序,例如myapp://
。如果你有一个网站,你仍然可以做到这一点。让 instagram api 将用户发送到您的网站/页面,该网站/页面具有卸载重定向到您的应用程序使用的自定义方案。这是一个额外的反弹,但这会有效地将您带回您的应用程序。
问题是 instagram 使用 URL 中的令牌重定向到该网站。所以我不能直接将它重定向到我的应用程序 - 似乎我应该手动对其进行编码解码(因为app:openURL:...
方法仅适用于 URL,不适用于请求正文【参考方案2】:
也许已经晚了,但我认为它会帮助任何人搜索相同的问题 监听 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)
【讨论】:
嘿,谢谢。但这是一个有效的功能吗?如果我们在我们的 ios 应用程序上进行身份验证,这是否违反任何应用商店规则? 不,它不违反任何 App Store 规则我发布了 2 个具有该功能的应用程序 这不起作用。即使从移动 Safari 重定向时,它也不会接收。【参考方案3】:SFSafariViewController
无法做到这一点。改用WKWebView
并实现WKNavigationDelegate
方法,如optional func webView(_ webView: WKWebView,
didFinish navigation: WKNavigation!)
,然后读取当前URL。在此基础上定义您的操作。
您可以使用它来关闭包含您的 Web 视图的视图控制器。不幸的是,如果您想允许用户访问这些按钮,您将不得不构建自己的导航按钮(SFSafariViewController
拥有的那些)。您不必提供它们。
【讨论】:
以上是关于在某个 url 上关闭 SFSafariViewController的主要内容,如果未能解决你的问题,请参考以下文章