我在Swift 2中使用SFSafariViewController在带有ios 9.1(13B143)的iPad Air 2上显示网页.每个网页都需要用户提供的凭据.但是,当用户按下注销按钮时,我需要清除这些凭据.我尝试过使用以下内容:
let allCreds = NSURLCredentialStorage.sharedCredentialStorage().allCredentials
for (protectionSpace, userCredsDict) in allCreds {
for (_, cred) in userCredsDict {
print("DELETING CREDENTIAL")
NSURLCredentialStorage.sharedCredentialStorage().removeCredential(cred, forProtectionSpace: protectionSpace, options: ["NSURLCredentialStorageRemoveSynchronizableCredentials" : true])
}
}
// Clear cookies
if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies {
for (cookie) in cookies {
print("DELETING COOKIE")
NSHTTPCookieStorage.sharedHTTPCookieStorage().deleteCookie(cookie)
}
}
// Clear history
print("CLEARING URL HISTORY")
NSURLCache.sharedURLCache().removeAllCachedResponses()
NSUserDefaults.standardUserDefaults().synchronize()
Run Code Online (Sandbox Code Playgroud)
但它不起作用.实际上,"DELETING CREDENTIAL"和"DELETING COOKIE"永远不会被打印出来.此外,我可以完全删除iPad上的应用程序并重新安装它,当我导航回网址时,凭据仍然被缓存.我发现清除凭据的唯一方法是关闭iPad并重新启动它.
问题:如何以编程方式清除凭据?
从文档和所有示例中我发现,必须以特定URL作为设置参数以编程方式实例化SFSafariViewController.是否可以使用SFSafariViewController作为UISplitViewController的Detail Controller?我能想到的唯一方法是在故事板中设置segue,但在这种情况下,SFSafariViewController将没有显示其内容所需的URL.如果可能的话,任何关于如何以编程方式完成此任务的建议将不胜感激.
detailsview master-detail uisplitviewcontroller ios sfsafariviewcontroller
如果我们使用的话,我没有正确理解使用SFSafariViewController的主要优点 [[UIApplication sharedApplication] openUrl: strUrl];
两者有什么区别?
使用LoginManagerFacebook iOS SDK进行登录,如下所示:
let loginManager = LoginManager()
loginManager.logIn([.publicProfile, .email], viewController: self) { (loginResult) in
Run Code Online (Sandbox Code Playgroud)
登录对话框通过Safari打开facebook.com,它有一个按钮供我使用
使用Facebook App登录
当我点击Facebook应用程序中的"继续"时,我将返回到我的应用程序,但是即使loginResult返回,登录对话框也不会被解雇.success.
唯一的选择是我点击"取消".它似乎是Login Dialog SFAuthenticationViewController,目前在Google搜索中包含0个结果.
似乎其他人过去遇到的问题是,AppDelegate他们没有调用适当的授权流处理,application:openURL:options:但成功地被调用如下:
@available(iOS 9.0, *)
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
print("application open url\n\(url)\noptions \(options)")
if url.absoluteString.hasPrefix("fb") {
print("Finishing Facebook log in flow")
return SDKApplicationDelegate.shared.application(application, open: url, options: options)
} else {
print("Finishing Google sign in flow")
return GIDSignIn.sharedInstance().handle(url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] …Run Code Online (Sandbox Code Playgroud) facebook-login facebook-ios-sdk swift firebase-authentication sfsafariviewcontroller
我能够让我的应用程序通过SFSafariViewController按照这篇文章自动加载一个URL ,并且效果很好,唯一的缺点就是导航栏.
当以这种方式使用时,SFSafariViewController导航栏是无用的,因为url是只读的,并且'done'链接除了重新加载页面之外什么都不做.因此,我想完全隐藏导航栏.
根据附加到已接受答案的注释,建议将我的根视图控制器设置为SFSafariViewController,这是我无法工作的.设置很简单,因为有一个视图控制器,代码包含在上述帖子中.
如何隐藏导航栏但仍然保留SFSafariViewController的好处?或者,如果我无法隐藏导航栏,至少隐藏"完成"链接?
代码段:
import UIKit
import SafariServices
class ViewController: UIViewController
{
private var urlString:String = "https://example.com"
override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(animated: Bool)
{
super.viewDidAppear(animated)
let svc = SFSafariViewController(URL: NSURL(string: self.urlString)!)
self.presentViewController(svc, animated: true, completion: nil)
self.navigationItem.rightBarButtonItem = nil
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Run Code Online (Sandbox Code Playgroud)
-----工作.Navbar是"隐藏的"-----
import UIKit …Run Code Online (Sandbox Code Playgroud) 我正在我的应用程序中实现 SoundCloud 登录流程。该应用程序将https://soundcloud.com/connect在 a 中SFSafariViewController打开,redirect_uri该应用程序使用我的应用程序的自定义 URL 方案来接收响应。它适用于直接 SoundCloud 登录,但在尝试使用“使用 Google 登录”按钮时失败。
在 Safari 中,该按钮会打开一个带有 Google 登录页面的新选项卡(在桌面上弹出),然后通过 与 SoundCloud 选项卡进行通信postMessage。如果您使用 iOS Safari 应用程序,此登录流程可以正常工作,但会失败SFSafariViewController(单击按钮会转到带有 Google url 的白页:)https://accounts.google.com/o/oauth2/auth?...。
现在我的解决方法是建议使用 Google 的用户点击 Safari 图标来SFSafariViewController完成 Safari 应用程序中的登录流程,但我想知道是否有一种方法可以在不离开我的应用程序的情况下处理此问题。
我在指定从 SFSafariViewController 访问时遇到问题,因为它具有与 Safari 浏览器完全相同的用户代理。
我想要做的是仅在 webview 中显示图片,如果在普通浏览器上查看,则将其删除。
尝试查看是否可以使用 document.refferer,我在 twitter 上尝试过,因为最新更新将其 webview 更改为 SFSafariViewController。几乎可以正常工作,但如果直接从 SFSafariViewController 打开,推荐人信息也会传递给 safari。
真的很感激任何想法......谢谢!
我有一个具有用户名和密码的应用程序,以便用户登录到该应用程序。一些(不太重要的)功能仍然是网页。
但为了用户友好,用户已经登录后再次登录很烦人。
我正在查看 SFSafariViewController,它看起来很有前途,但我试图在调用 URL 时设置授权标头。我已经知道用户令牌,但需要将其设置为授权标头。
所以流程是:
User log in inside App -> get token -> set this token as Authorization header -> call my web app url
Run Code Online (Sandbox Code Playgroud)
这个控制器可以实现吗?
如何设置规则,以便当我的用户单击我的应用程序中的任何 Web 链接时,它会在应用程序内浏览器而不是 Safari 中打开?
上下文:我正在构建一个应用程序,其中有几个地方的链接要么是我嵌入的,要么是通过各种用户交互加载的,例如,一个链接指向包含另一个链接的页面。我想确保用户很少离开我的应用程序,因此想在已经开发的应用程序内浏览器中打开所有外部网络链接
目标版本:iOS 11。环境/语言:Swift 4
我正在验证我们的 Web 服务ASWebAuthenticationSession,出于某种原因,最终重定向后的唯一选项是Cancel。我之前有过这个工作,即使我确实按下了取消,回调 Url 也是通过完成处理程序发送的,我能够在那里解析令牌形式。但现在我得到了错误ASWebAuthenticationSessionErrorCodeCanceledLogin。
如何ASWebAuthenticationSession显示“完成”按钮并使用回调 Url 完成处理程序?上次 iOS 更新中有什么变化或中断吗?
if (@available(iOS 12.0, *)) {
self.session = [[ASWebAuthenticationSession alloc]
initWithURL:@"http://service.com"
callbackURLScheme:@"http://website.com"
completionHandler:_sessionHandler];
[self.session start];
}
Run Code Online (Sandbox Code Playgroud)
_sessionHandler = ^(NSURL * _Nullable callbackURL, NSError * _Nullable error) {
NSLog(@"Callback Url: %@, Error: %@", callbackURL, error);
if ( callbackURL != nil ) {
__block NSString * token = [weakSelf webToken:@"token" fromUrl:callbackURL];
weakSelf.completionHandler([weakSelf parseWebToken:token], error);
}
else
weakSelf.completionHandler(nil, error);
};
Run Code Online (Sandbox Code Playgroud)
回调 …
single-sign-on sfsafariviewcontroller sfauthenticationsession aswebauthenticationsession
ios ×6
swift ×4
safari ×2
detailsview ×1
inappbrowser ×1
ipad ×1
javascript ×1
jwt ×1
objective-c ×1
soundcloud ×1
token ×1
user-agent ×1