4

我有一个显示一些链接的 UIWebview。当我点击链接时,它会向我发送一些 JSON。为了显示发送给我的数据,我需要:

1)检测何时调用链接

2)获取json

对于 2),我尝试过 [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];返回我:

<pre style="word-wrap: break-word; white-space: pre-wrap;">{some JSON}</pre>

[webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName(\"pre\")"];返回我一个空对象。我还有什么其他方法可以获取我的 JSON ?

对于 1) 是否有 UIWebView 委托方法来检测何时调用链接?

4

2 回答 2

4

我有同样的问题。我通过这段代码解决了

    NSString *jsonString = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName(\"pre\")[0].innerHTML"];
于 2015-12-31T08:40:34.430 回答
0

iOS 开发者库是你最好的朋友。事实证明 UIWebView 确实有一个您可以订阅的协议。这是委托回调的链接:http: //developer.apple.com/library/ios/#documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UIWebViewDelegate

你想要的是

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

实现这个协议方法,你可以自省NSURLRequest它的对象,NSURL然后剩下的就看你了……

编辑:为了完整起见,我应该提到对象的- (NSData *)HTTPBody实例方法NSURLRequest。您很可能会在那段 NSData 中找到 JSON。Foundation 框架中有一个NSJSONSerialization类,您可以使用它来创建NSObjectJSON 数据。这是你到目前为止所拥有的......

// UIWebView delegate method
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
  NSData *jsonData = request.HTTPBody;
  id jsonObj = [NSJSONSerialization JSONObjectWithData: jsonData options: NSJSONReadingMutableContainers error: nil];
  // do stuff with the object...
  ...
  // the webview shouldn't load the request since it's going to be raw json data (or is it)
  return NO;
}

理论上,此代码应该可以工作,但前提是您收到的 JSON 数据是纯 JSON。从您的问题来看,JSON 数据似乎附加了一些 HTML,因此您必须实现一种方法来剥离其 HTML 部分的数据。当涉及到以这种方式转换数据结构时,请注意有很多细则。查看NSJSONSerialization文档以获取更多具体信息:http: //developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html

快乐编码!

于 2013-07-11T10:31:12.927 回答