Question

I'm an iOS newb (.NET professional), so this may be a simple issue but I couldn't find anything through the SO search or Google (and maybe not looking for the right terms).

I'm writing an app that displays information from a DD-WRT router through it's web interface. I have no problem displaying the initial page and navigating through any of the other pages, but if I make any change on a form (and it redirects to apply.cgi or applyuser.cgi), the UIWebView is blank - it's supposed to display the same page, with the form submission changes. The site works fine in Mobile Safari, which I find intriguing, but I guess UIWebView isn't totally the same.

I think the iOS code is pretty standard for display a webpage, but I'll list it below. I can't give you access to my router because, well, that's not a good idea :) Hopefully someone with a DD-WRT router can help (or know what my issue is anyway).

- (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 ;

}

And I'm doing a few things with Javascript in the webViewDidFinishLoad method, but I know that's not the culprit because it still happens when I comment it out.

Was it helpful?

Solution

Well I figured out the problem on my own. I think part of it was putting the username & password in the URL (which was just a temporary measure) because I found that method provided the same results in mobile Safari and desktop Chrome. So I added MKNetworkKit to my project that provided a simple way to add authentication to my request, and found I had to make a specific request to POST the data, then reloaded the page the to see the changes.

In the (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType method, I check if ([request.HTTPMethod isEqualToString:@"POST"]) and do this:

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top