对于某些背景信息,我正在尝试显示的网页是目前正在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.
”当我正确配置异常域时(删除允许任意加载)它也不会给我消息。只有当我使用异常域更改设置时(再次,删除允许任意加载)我才能得到此输出。
我开始认为这个问题超出了安全性,我将非常感谢您尝试解决此问题的任何建议或步骤,谢谢!
答案 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
等等。很多这可能取决于你加载的网站以及它需要得到什么。