使用AJAX/XMLHttpRequest时不调用shouldStartLoadWithRequest

el_*_*_el 8 iphone iphone-sdk-3.0

我正在尝试将方法调用从JavaScript发送到Objective-C,反之亦然.一切都适用于window.location触发的url,这是由shouldStartLoadWithRequest捕获的.现在,如果我尝试使用AJAX调用,则不会调用shouldStartLoadWithRequest.有没有办法做到这一点?主要是我不希望限制在可以从JavaScript传递给Objective-C的数据的最大URL大小.

我的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;
 }
}
Run Code Online (Sandbox Code Playgroud)

我的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();
Run Code Online (Sandbox Code Playgroud)

oha*_*dpr 10

如果您希望有一种更简洁的方法将数据从JavaScript传输到Objective-C,您可以按照以下步骤操作:

  1. 一旦你有了想要发送回Objective-C的JS数据,那么在JS中将它存储在一些全局可访问的变量中,例如 var myTempData = ...
  2. 使用上述技术 document.location = 'myapp://fire-some-event'
  3. 一旦进入Objective-C代码执行[myWebView stringByEvaluatingJavaScriptFromString:@"myTempData"].
  4. 我认为你已经完成了,请注意线程/对象到字符串通过json编码.


el_*_*_el 2

虽然我找不到为什么 AJAX 请求不被 shouldStartLoadWithRequest 拦截的答案,但我找到了两个解决方法。我假设 JavaScript 请求不会被拦截,但只有 HTML 关联/发起的请求才会被拦截。如果有人可以验证或更正这一点,我会很高兴。

这两种解决方法很简单。一方面,URL 中 256 个字符的限制似乎不会影响 MobileSafari,或者至少不会影响该状态下的 url。我读到Safari 允许 80'000 个字符。然而我对此感觉不太好。因此,解决方法 #2 是使用使用 POST 方法的 html 表单,并将操作设置为您的方案。数据可以作为输入字段的值等存储在表单中。使用 JavaScript 提交表单后,shouldStartLoadWithRequest 被触发,并且可以从 HTTPBody 检索数据。