UIWebView отображает пустую страницу при отправке формы

Я новичок в iOS (профессионал .NET), так что это может быть простой проблемой, но я ничего не смог найти с помощью поиска SO или Google (и, возможно, не искал правильных терминов).

Я пишу приложение, которое отображает информацию с маршрутизатора DD-WRT через его веб-интерфейс. У меня нет проблем с отображением начальной страницы и навигацией по любым другим страницам, но если я внесу какие-либо изменения в форму (и она перенаправит на apply.cgi или applyuser.cgi), UIWebView будет пустым — он должен отображать та же страница с изменениями отправки формы. Сайт отлично работает в Mobile Safari, что меня заинтриговало, но я думаю, что UIWebView не совсем то же самое.

Я думаю, что код iOS довольно стандартный для отображения веб-страницы, но я перечислю его ниже. Я не могу дать вам доступ к моему маршрутизатору, потому что это не очень хорошая идея :) Надеюсь, кто-то с маршрутизатором DD-WRT может помочь (или в любом случае знает, в чем моя проблема).

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *sURL = @"http://user:[email protected]";
    NSURL *url = [NSURL URLWithString:sURL];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [self.webView loadRequest:request];

    self.webView.delegate = self ;

}

И я делаю несколько вещей с Javascript в методе webViewDidFinishLoad, но я знаю, что это не виновник, потому что это все еще происходит, когда я его комментирую.


person Dave Bry    schedule 24.09.2013    source источник


Ответы (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
person Dave Bry    schedule 28.09.2013