我正在使用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的替代方法吗?
答案 0 :(得分:11)
更新回答:
Apple禁止在review guidelines的最新版本中使用这种SafariViewController:
必须使用SafariViewContoller向用户显示信息;控制器可能不被其他视图或层隐藏或遮挡。此外,应用程序可能无法在未经用户知情和同意的情况下使用SafariViewController跟踪用户。
旧回答:
在iOS 10中,对SFSafariViewController
提出了一些额外要求:
1)不应隐藏您的观点,因此hidden
应设为NO
2)alpha
的最小值为0.05
3)您需要使用addChildViewController:
/ didMoveToParentViewController:
手动添加控制器(回拨'否则不会调用)。
4)UIApplication.keyWindow.frame
和SFSafariViewController.view.frame
应该有非空交集(在适当的坐标空间中),这意味着:
safari视图大小应大于CGSizeZero
您无法在屏幕上显示狩猎视图
但您可以在自己的视图下隐藏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];
答案 1 :(得分:2)
新信息:不要这样做。 修订后的App Store指南禁止这种做法。
https://developer.apple.com/app-store/review/guidelines/
我将在下面留下以下代表: 我从我的app delegate的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;
}
答案 2 :(得分: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;
答案 3 :(得分:-1)
它可以在swift 3上使用这个xcode 8.3.2 becausa我得到所有我委托和使用正确,但我有这个错误
[12:05] 2017-04-25 12:05:03.680 pruebaslibrary [7476:136239]警告:尝试在窗口层次结构中显示其视图!