UIWebView在表单提交上显示空白页面

时间:2013-09-24 01:36:21

标签: ios uiwebview dd-wrt

我是iOS新手(.NET专业版),所以这可能是一个简单的问题,但我无法通过SO搜索或Google找到任何东西(也许找不到正确的术语)。

我正在编写一个应用程序,通过它的Web界面显示来自DD-WRT路由器的信息。我没有问题显示初始页面并浏览任何其他页面,但如果我对表单进行任何更改(并重定向到apply.cgi或applyuser.cgi),UIWebView是空白的 - 它应该显示同一页面,表单提交更改。该网站在Mobile Safari中运行良好,我觉得很有趣,但我猜UIWebView并不完全相同。

我认为iOS代码非常适合显示网页,但我会在下面列出。我不能让你访问我的路由器,因为,这不是一个好主意:)希望有DD-WRT路由器的人可以提供帮助(或者知道我的问题是什么)。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *sURL = @"http://user:pass@XXX.XXX.X.X";
    NSURL *url = [NSURL URLWithString:sURL];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [self.webView loadRequest:request];

    self.webView.delegate = self ;

}

我在webViewDidFinishLoad方法中使用Javascript做了一些事情,但我知道这不是罪魁祸首,因为当我发表评论时它仍然会发生。

1 个答案:

答案 0 :(得分:1)

我自己想出了问题。我认为其中一部分是用户名& URL中的密码(这只是一个临时措施)因为我发现该方法在移动版Safari和桌面版Chrome中提供了相同的结果。 所以我在我的项目中添加了MKNetworkKit,它提供了一种向我的请求添加身份验证的简单方法,并发现我必须发出一个特定的POST数据请求,然后重新加载页面以查看更改。

(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType方法中,我检查是否([request.HTTPMethod isEqualToString:@"POST"])并执行此操作:

NSString *sPostData = [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding];

NSArray *aPostData = [sPostData componentsSeparatedByString:@"&"];

NSMutableDictionary *dPostData = [[NSMutableDictionary alloc] init];

//i don't know if this is the best way to set a dictionary, but it works
for (id apd in aPostData)
{
    NSString *key = [apd componentsSeparatedByString:@"="][0];
    NSString *val = [apd componentsSeparatedByString:@"="][1];
    [dPostData setValue:val forKey:key];
}

MKNetworkEngine *engine = [[MKNetworkEngine alloc] init];

MKNetworkOperation *op = [engine operationWithURLString:[request.URL description] params:dPostData httpMethod:@"POST"];

[op setUsername:@"myUserName" password:@"myPassword" basicAuth:YES];

self.postedRequest = TRUE; //a bool I set so, when it comes to webViewDidFinishLoad, I reload the current page

[op start]; //send POST operation