Swift编程中的UIWebView窗口身份验证

3

我有一个关于UIWebView的问题。我无法使用Windows身份验证打开网站...在Safari浏览器中会出现一个弹窗,但在WebView控件中没有反应。

有人能帮我解决这个问题吗?

以下是我的代码:

class MainViewController: UIViewController, UIWebViewDelegate, MFMailComposeViewControllerDelegate {

    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad();

        webView.delegate = self;

        let url = NSURL (string: "http://test.raphaels.com/mobile/");
        let requestObj = NSURLRequest(URL: url);
        webView.loadRequest(requestObj);
    }
}

这段代码在iOS模拟器上的非安全服务器URL上运行得非常好,即在Xcode上的iPhone模拟器/仿真器上。但是当我使用上述URL(只能从内部网络访问)时,在浏览器中会要求输入用户名/密码并在iPhone模拟器中停止。请帮助我,如何提供用户名和密码。我在互联网上搜索了很多例子,但不幸的是没有一种是用Swift编程的。

我尝试编写一个失败的解决方案,因此下面是失败的代码:

override func viewDidLoad() {
    super.viewDidLoad();

    webView.delegate = self;


    let username = "username11";
    let password = "password22";
    let loginString = NSString(format: "%@:%@", username, password);
    let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!;
    let base64LoginString = loginData.base64EncodedStringWithOptions(nil);

    // create the request
    let url = NSURL (string: "http://test.raphaels.com/mobile/");
    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")




    webView.loadRequest(request);
}

你的意思是URL里面有两个http吗?另外,NSURL(string:_)返回一个可选的NSURL,你在使用它来创建NSMutableURLRequest之前应该先对其进行解包。 - Ethan
两个 https?其实只有一个 URL。你见过这种情况吗,当你浏览一些安全的 URL 时,会出现用户名/密码 JavaScript 弹窗,如果填写不正确或者未填写,那么就会被拒绝访问,并出现 401 错误代码。 - Sandra
当然可以。但是我从来没有见过一个包含两个“http://”子字符串的URL。您的代码如下: let url = NSURL(string: "http://"+"http://...") //抱歉,stackoverflow会对看起来像URL的内容进行一些格式化处理。 - Ethan
我该如何解包?我是Swift和iOS的新手。我用Java编写了一个应用程序,并使用现有的代码库将其指向我的Web应用程序。 - Sandra
哦,你的编译器是否警告你“可选类型'NSURL?'的值未解包;你是想使用'!'还是'?'”在NSMutableURLRequest行上? - Ethan
编译器要求加上!,但实际上是两个https的笔误。 - Sandra
3个回答

6

它成功了 :-) 以下是代码。

override func viewDidLoad() {
        super.viewDidLoad();

        webView.delegate = self;

        let urlComponents = NSURLComponents(string: "http://test.raphaels.com/mobile/");
        urlComponents.user = "username11";
        urlComponents.password = "password22";

        let url = urlComponents.URL;

        let requestObj = NSURLRequest(URL: url!);
        webView.loadRequest(requestObj);
    }

0

Objective C 版本

NSURLComponents *urlComponents = [NSURLComponents componentsWithString:@"http://test.raphaels.com/mobile/"];

[urlComponents setUser:@"username11"];
[urlComponents setPassword:@"password22"];

NSURL *url = [urlComponents URL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];

0
一个快速简便的解决方案是:使用 URL。
http://username:password@test.raphaels.com/mobile/

不需要任何特殊的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接