2017-09-27 115 views
0

我在UIActionSheet內點擊按鈕一開SFSafariViewController。它一直在正常工作,並且在iOS 11以外的所有iOS版本上仍然正常工作。有沒有更改過iOS 11或Xcode 9.0中可能導致此問題的SFSafariViewController?SFSafariViewController空白iOS的11/9.0的Xcode

UPDATE - 所以它看起來像它的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. 
} 

}

+1

你能證明你試過代碼什麼的,ios11已經修改 –

+0

@ Anbu.Karthik添加的代碼 – genaks

回答

0

非常相似,https://openradar.appspot.com/29108332

要修復它,你可以禁用的觀點的延遲加載:

SFSafariViewController *viewController = [[SFSafariViewController alloc] init...]; 
(void)viewController.view; 
... 
[controller presentViewController:viewController animated:YES completion:nil]; 
+0

我不工作 – genaks

+0

順便說一句 - (void)viewController.view; - 做? – genaks

+0

這導致視圖加載:[「如果您訪問此屬性,其值爲零,視圖控制器自動調用 loadView() 方法並返回結果視圖。」](https://developer.apple .com/documentation/uikit/uiviewcontroller/1621460-view) –

0

更新

原來的答案並沒有工作,它只是因爲我把斷點工作。如果我添加了一個線程睡眠似乎它在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是真實的,似乎導致我的空白SafariView之一。希望這可以解決你太

+0

工程但是像你說的不是一個好的解決方案。順便說一下0.5的神奇之處,因爲我試圖減少它,它不起作用。 – genaks

+1

工作一次後,這也停止了工作。 SafariViewController仍然是空白的 – genaks

0

到目前爲止,我是讓SafariViewController的RootViewController的以下列方式已經工作的唯一的事 -

((XYZAppDelegate *)[UIApplication sharedApplication].delegate).window.rootViewController = self.svc; 
    [((XYZAppDelegate *)[UIApplication sharedApplication].delegate).window makeKeyAndVisible]; 
1

我已經成功在我的代碼來解決這個問題。我希望這可以幫助其他有類似問題的人。

我有完全相同的問題,因爲這裏描述。我嘗試了以上的一切,不幸的是沒有工作

在我的應用程序中有不同的窗口。解決方法是確保在展示之前顯示SFSafariViewController的窗口是「關鍵」。例如:

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,所以也許它的缺陷是關係到安全性的更高級別https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller

+0

這解決了我的問題!謝謝! PS:你可以很容易地通過使用'UIApplication.shared.windows [0]'獲得根窗口(也許這會幫助某人) –