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:pass@XXX.XXX.X.X";
NSURL *url = [NSURL URLWithString:sURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
self.webView.delegate = self ;
}
И я делаю несколько вещей с Javascript в webViewDidFinishLoad
метод, но я знаю, что это не преступник, потому что это все еще происходит, когда я закомментирую это.
1 ответ
Ну, я решил проблему самостоятельно. Я думаю, что частью этого было добавление имени пользователя и пароля в URL (что было только временной мерой), потому что я обнаружил, что этот метод обеспечивает те же результаты в мобильных Safari и настольных Chrome. Поэтому я добавил MKNetworkKit в свой проект, который предоставил простой способ добавить аутентификацию к моему запросу, и обнаружил, что мне нужно было сделать специальный запрос для отправки данных, а затем перезагрузил страницу, чтобы увидеть изменения.
в (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