当 alpha 设置为 0 时,iOS10 SFSafariViewController 不起作用
Posted
技术标签:
【中文标题】当 alpha 设置为 0 时,iOS10 SFSafariViewController 不起作用【英文标题】:iOS10 SFSafariViewController not working when alpha is set to 0 【发布时间】:2016-08-18 13:20:34 【问题描述】:我正在使用 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 的替代方法吗?
【问题讨论】:
您是否从 Safari 应用中获取用户的 cookie? 【参考方案1】:更新答案:
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 视图从屏幕上移开
但您可以在自己的视图下隐藏 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];
【讨论】:
这是否记录在某处? @Zaph0d42 不,这些知识来自测试和逆向工程。 我最终做了类似的事情。 (将 alpha 更改为 0.05)。该应用尚未在 AppStore 中。 @oriharel 仅供参考:Apple 在最新版本的review guidelines 中禁止使用这种 SafariViewController。 @RomanErmolov 我使用这种方法来安装引荐来源网址。关注这篇文章library.launchkit.io/…。您知道实现 Google 为 android SDK 提供的 INSTALL_REFERRER 的任何替代方法吗?【参考方案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;
【讨论】:
是的,这种方法在我尝试过的测试版中对我有用 什么是secondWindow
?
还有self.window
是什么?
顺便说一句,这将使您的应用程序被禁止。请参阅新的应用审核指南。 developer.apple.com/app-store/review/guidelines
self.window 是应用程序的主窗口。 secondWindow 是您为隐藏 SafariViewController 而创建的新窗口【参考方案3】:
我能够使用不可见的子视图控制器来实现这种效果:
_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;
【讨论】:
你能解释一下什么是_containerViewController吗?在我的例子中,'self' 是一个视图控制器。我可以用那个代替吗?我实际上尝试过,但我得到了例外。 _containerViewController 可以是当前可见的任何 VC。你能告诉我更多关于你的例外吗?【参考方案4】:可以在 swift 3 for xcode 8.3.2 上使用它,因为我得到了所有我委托和正确使用的东西,但是我有这个错误
[12:05] 2017-04-25 12:05:03.680 pruebaslibrary[7476:136239] 警告:尝试呈现不在窗口层次结构中的视图!
【讨论】:
这是一个问题还是一个答案? 这是一个答案?以上是关于当 alpha 设置为 0 时,iOS10 SFSafariViewController 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
iOS:为 UITableViewCell 设置选定突出显示颜色的 alpha