7

我正在使用 SFSafariViewController 在我的应用程序中获取用户的 cookie。这是我的代码:

SFSafariViewController *safari = [[SFSafariViewController alloc]initWithURL:[NSURL URLWithString:referrerUrl] entersReaderIfAvailable:NO];
    safari.delegate = self;
    safari.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    safari.view.alpha = 0.0;
    safari.view.hidden = true;
    [self dismissViewControllerAnimated:false completion:nil];
    NSLog(@"[referrerService - StoreViewController] presenting safari VC");
    [self presentViewController:safari animated:false completion:nil];

这在 iOS 9 上运行良好。但在 iOS 10 上,SF 控制器似乎不起作用(它也阻止了我当前的上下文 - 这恰好是另一个 UIWebView)。

任何人都可以建议隐藏 SFSafariViewController 的替代方法吗?

4

4 回答 4

12

更新的答案:

Apple 在最新版本的审查指南中禁止使用这种 SafariViewController :

必须使用 SafariViewContoller 以可视方式向用户呈现信息;控制器不能被其他视图或层隐藏或遮挡。此外,应用不得在未经用户知情和同意的情况下使用 SafariViewController 跟踪用户。

老答案:

在 iOS 10 中有一些额外的要求来呈现SFSafariViewController

1)您的视图不应隐藏,因此hidden应设置为NO

2) 的最小值alpha0.05

3)您需要使用addChildViewController:/手动添加控制器didMoveToParentViewController:(否则不会调用回调)。

4)UIApplication.keyWindow.frame并且SFSafariViewController.view.frame应该有非空交叉点(在适当的坐标空间中),这意味着:

  • Safari 视图大小应大于CGSizeZero

  • 您不能将 Safari 视图从屏幕上移开

  • 但您可以在自己的视图下隐藏 Safari 视图

代码示例:

self.safariVC = [[SFSafariViewController alloc] initWithURL:referrerUrl];
self.safariVC.delegate = self;
self.safariVC.view.alpha = 0.05;
[self addChildViewController:self.safariVC];
self.safariVC.view.frame = CGRectMake(0.0, 0.0, 0.5, 0.5);
[self.view insertSubview:self.safariVC.view atIndex:0];
[self.safariVC didMoveToParentViewController:self];

另外,不要忘记safariVC在使用结束后正确删除:

[self.safariVC willMoveToParentViewController:nil];
[self.safariVC.view removeFromSuperview];
[self.safariVC removeFromParentViewController];
于 2016-08-29T23:42:37.797 回答
2

新信息:不要这样做。修订后的 App Store 指南禁止这种做法。

https://developer.apple.com/app-store/review/guidelines/

我将把它留给后代:我从我的应用程序委托的 didFinishLaunchingWithOptions 调用以下代码。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self checkCookie];
}

- (void)checkCookie
{
    NSURL *url = [NSURL URLWithString:@"http://domainToCheck.com"];
    SFSafariViewController *vc = [[SFSafariViewController alloc] initWithURL:url];
    vc.delegate = self;

    UIViewController *windowRootController = [[UIViewController alloc] init];

    self.secondWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.secondWindow.rootViewController = windowRootController;
    [self.secondWindow makeKeyAndVisible];
    [self.secondWindow setAlpha:0.1];

    [windowRootController presentViewController:vc animated:NO completion:nil];
    self.window.windowLevel = 10;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options
{
    [self.secondWindow.rootViewController dismissViewControllerAnimated:NO completion:nil];
    self.secondWindow = nil;
    self.window.windowLevel = 0;

    return YES;
}
于 2016-08-29T23:38:56.900 回答
0

我能够使用不可见的子视图控制器来实现这种效果:

_safariViewController = [[SFSafariViewController alloc] initWithURL:_requestURL];
_safariViewController.delegate = self;
_safariViewController.view.userInteractionEnabled = NO;
_safariViewController.view.alpha = 0.0;
[_containerViewController addChildViewController:_safariViewController];
[_containerViewController.view addSubview:_safariViewController.view];
[_safariViewController didMoveToParentViewController:_containerViewController];
_safariViewController.view.frame = CGRectZero;
于 2016-08-24T01:14:29.697 回答
-1

它可以在 swift 3 for xcode 8.3.2 上使用它,因为我得到了我所有的委托和正确使用,但我有这个错误

[12:05] 2017-04-25 12:05:03.680 pruebaslibrary[7476:136239] 警告:尝试呈现不在窗口层次结构中的视图!

于 2017-04-26T14:13:52.817 回答