ios - objective c - iOS 11/Xcode 9.0中的SFSafariViewController空白

我在UIActionSheet中点击按钮时打开了一个SFSafariViewController窗口。 它工作正常,除了 iOS 11以外的所有版本的iOS仍然工作良好。 iOS 11或 Xcode 9.0中的SFSafariViewController是否有导致这个问题的更改 ?

更新- 似乎是Xcode 9.0导致了这个问题。 我尝试在不同的iOS版本上运行它,它们似乎都有这个问题。 当我使用 Xcode 8.3.3运行它时它曾经工作得很好,但这是我不再拥有的东西: (

这是代码-


- (void)presentWebView:(NSString *)url {


url = [url stringByReplacingOccurrencesOfString:@"" withString:@"+"];


url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


NSURL *URL = [NSURL URLWithString:url];



if (URL) {


 if ([SFSafariViewController class]!= nil) {


 SFSafariViewController *sfvc = [[SFSafariViewController alloc] initWithURL:URL];


 sfvc.delegate = self;


 [self.tabBarController presentViewController:sfvc animated:YES completion:nil];


 } else {


 if (![[UIApplication sharedApplication] openURL:URL]) {


 NSLog(@"%@%@",@"Failed to open url:",[url description]);


 }


 }


} else {


//will have a nice alert displaying soon.


}



}

时间:

我已经在我的代码中修复了这个问题。 我希望这可以帮助其他有类似问题的人。

我的问题跟这里描述的完全一样。 我尝试了上面的一切,不幸的是没有任何效果,

在我的应用程序中有不同的窗口。 修复是为了确保在呈现之前显示SFSafariViewController 的窗口是"key"。 例如:


class MyViewController: UIViewcontroller {


 func showSafariViewController() {


//imagine we have 2 windows, one for 'normal' content (key window) and one for 'other' content. lets say we're showing the 'other' content window, and have hidden the 'normal' window. you can see the 'other' content window in the app, but it won't be the key window!


 let window =//get the 'other' content window



//make sure we make it the key window before presenting safari


 window.makeKey()



//now present safari and celebrate victory by triumphantly slurping on your hot black coffee


 let mySafariViewController = SFSafariViewController(...)


 self.present(mySafariViewController.. .)


 }


}



我怀疑苹果正在 UIApplication.shared.keyWindow 窗口中搜索SFSafariViewController的 实例。 也许他们正在从其他地方添加一个子视图。 在它所述的文件中 The user's activity and interaction with SFSafariViewController are not visible to your app ,也许Bug是因为增加的安全级别有关 https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller

更新

事实证明旧的答案没有用,它只是起作用,因为我提出了断点。 如果我增加了睡眠线程,似乎它在XCode9中工作,但这不是最好的解决方案。 任何人都有更好的解决方案?


SFSafariViewController *sfcontroller = [[SFSafariViewController alloc] initWithURL:url];


if (@available(iOS 11.0, *)) {


 [NSThread sleepForTimeInterval:0.5f];


}


sfcontroller.delegate = self;


[controller presentViewController:sfcontroller animated:NO completion:nil];



旧答案

我与genaks有同样的问题,并在SFViewController中。

这段代码适合我


SFSafariViewController *sfcontroller = [[SFSafariViewController alloc] initWithURL:url];


if (@available(iOS 11.0, *)) {


 SFSafariViewControllerConfiguration *config = [[SFSafariViewControllerConfiguration alloc] init];


 config.barCollapsingEnabled = NO;


 sfcontroller = [[SFSafariViewController alloc] initWithURL:url configuration: config];


} else {


//Fallback on earlier versions


}



sfcontroller.delegate = self;



[controller presentViewController:sfcontroller animated:YES completion:nil];



在 ios 11中它们引入了SFSafariViewControllerConfiguration默认情况下barCollapsingEnabled是 true 它似乎是导致我的空白SafariView的原因 。 希望这也能解决你的问题

...