UIWebView无法显示我的网页

时间:2016-07-08 14:29:17

标签: ios swift amazon-web-services uiwebview

对于某些背景信息,我正在尝试显示的网页是目前正在AWS的EC2上托管的网络应用。后端是Python w / Flask,前端只是简单的HTML / CSS。该URL具有HTTP,因为它尚未使用HTTPS保护。当打开此网页的网址时,浏览器要求的第一件事就是登录凭据(浏览器要求,而不是网站)。此页 在我的iPhone上的移动版Safari中加载,Safari确实成功要求提供凭据。如果我输入正确,它将正确加载页面。

所以我尝试使用App Transport Security Settings下的Allow Arbitrary Loads以及带有以下键的自定义Exception Domain:

App Transport Security Settings                         Dictionary
Exception Domains                                       Dictionary
    my website URL                                      Dictionary
        NSIncludesSubdomains                            Boolean (YES)
        NSExceptionAllowsInsecureHTTPLoads              Boolean (YES)
        NSThirdPartyExceptionAllowsInsecureHTTPLoads    Boolean (YES)
        NSExceptionMinimumTLSVersion                    String (TLSv1.0)
        NSExceptionRequiresForwardSecrecy               Boolean (YES)

然而,每当我在模拟器上启动应用程序时,我所回复的都是白色屏幕(如果需要可以发布屏幕截图)。

这是我在ViewController.swift中的代码:

import UIKit

class ViewController: UIViewController {

     @IBOutlet var WebView: UIWebView!

     override func viewDidLoad() {
         super.viewDidLoad()
         let url = NSURL(string: "My URL inserted here")
         let request = NSURLRequest(URL: url!)
         WebView.loadRequest(request)
     }
     override func didReceiveMemoryWarning() {
         super.didReceiveMemoryWarning()
     }
 }

如果我使用允许任意负载,当我查看输出框时, 说“App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.”当我正确配置异常域时(删除允许任意加载)它也不会给我消息。只有当我使用异常域更改设置时(再次,删除允许任意加载)我才能得到此输出。

我开始认为这个问题超出了安全性,我将非常感谢您尝试解决此问题的任何建议或步骤,谢谢!

1 个答案:

答案 0 :(得分:2)

白色屏幕有点奇怪,假设401会导致标准错误页面,但可能服务器为此设置了白页。 我的猜测是直接在网址中设置用户名和密码不起作用,你不应该这样做,而是依靠WKWebView的{​​{1}}委托方法。

以下是一些希望工作/帮助的示例代码:

webView:didReceiveAuthenticationChallenge:

这基本上是简单#import "ViewController.h" @import WebKit; @interface ViewController () <WKNavigationDelegate> @property (nonatomic, strong) WKWebView *webView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:[WKWebViewConfiguration new]]; self.webView.navigationDelegate = self; [self.view addSubview:self.webView]; [self.webView setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_webView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_webView)]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_webView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_webView)]]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSURL *target = [NSURL URLWithString:@"http://yourhost.com/possiblePage.html"]; NSURLRequest *request = [NSURLRequest requestWithURL:target]; [self.webView loadRequest:request]; } - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler { NSURLCredential *creds = [[NSURLCredential alloc] initWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession]; completionHandler(NSURLSessionAuthChallengeUseCredential, creds); } @end 的实现文件(类似于XCode的单视图模板)。它还会向您展示如何添加ViewController。一定要确保查看所有委托方法等,这样你才能知道这件事能为你做些什么。

显然,必须以某种方式设置密码和用户名,我猜你可以使用简单的警报弹出窗口让用户输入此信息(原则上这类似于Safari)。对于第一个测试,您只需对其进行硬编码即可。另请注意,我在那里设置了一个示例子页面,只需使用您通常在桌面浏览器上使用的完全相同的URL。哦,由于服务器没有SSL,你需要允许任意负载

修改

RPM下面给出了一个很好的相关评论(谢谢),我原本没想过。该方法可能(实际上很可能)被多次调用。这最终还取决于您加载的网站。 RPM对于网站可能呈现纯白色的原因的解释就是现实。

无论如何,上面的WKWebView方法只是一个简单的例子,假设您知道PW和用户名。通常它会更复杂,每次调用用户输入凭据时都不应该只打开输入对话框。事实上,提供的webView:didReceiveAuthenticationChallenge:completionHandler:提供了将此委托方法的特定调用设置为与先前调用相关的方法。例如,它具有可能已设置的challenge属性。 (无论是加载我不知道的多种资源的情况,只需尝试一下。)另外,检查它的proposedCredential等等。很多这可能取决于你加载的网站以及它需要得到什么。