Я пытаюсь отправить вызовы метода от JavaScript до Objective C и наоборот. Все хорошо работает для инициированных URL window.location, которые пойманы shouldStartLoadWithRequest. Теперь, если я пытаюсь использовать вызов Ajax вместо этого, shouldStartLoadWithRequest не называют. Существует ли способ сделать это? Главным образом я не хочу быть ограниченным макс. размером URL на данных, которые могут быть переданы от JavaScript до Objective C.
Мои реализации UIWebViewDelegate:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *url = [[request URL] absoluteString];
NSRange urlrange = [url rangeOfString:@"myScheme://"];
if(urlrange.length > 0){
NSLog(@"this is an objective-c call, do not load link: %@", [url substringWithRange:NSMakeRange(urlrange.location, [url length])] );
return NO;
} else {
NSLog(@"not an objective-c call, load link: ", url );
return YES;
}
}
Мои вызовы JavaScript:
// works
window.location.href = "myScheme://readyHref";
// fails
var xmlHttpReq = false;
if (window.XMLHttpRequest) {
xmlHttpReq = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttpReq.open('GET', "myScheme://readyAJAX", false);
xmlHttpReq.send();
Хотя я не смог найти ответа, почему запросы AJAX не перехватываются shouldStartLoadWithRequest, я нашел два обходных пути. Я предполагаю, что Запросы JavaScript не перехватываются, а перехватываются только связанные с HTML / исходные запросы. Если бы кто-нибудь мог проверить или исправить это, я был бы счастлив.
Два обходных пути просты.С одной стороны, кажется, что ограничение в 256 символов в URL-адресе не влияет на MobileSafari или, по крайней мере, на URL-адрес в этом состоянии. Я читал, что Safari допускает 80 000 символов . Однако я не чувствовал себя хорошо с этим. Таким образом, обходной путь №2 - использовать html-форму, которая использует метод POST, и установить действие для вашей схемы. Данные могут быть сохранены в форме как значение поля ввода и т.п. После отправки формы с помощью JavaScript запускается shouldStartLoadWithRequest, и данные могут быть получены из HTTPBody.