如何从Objective C方法传递包含JSON的NSString到Javascript方法

4
我有一个需求,需要让Objective C代码调用WebService,并将以JSON格式接收到的响应作为参数传递给Javascript方法进行进一步处理。我正在使用UIWebView,它将在处理JSON响应后显示适当的结果。 问题出现在当我尝试将JSON字符串传递给Javascript方法时。Javascript方法不会简单地接受输入。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    NSString *responseString = [[NSString alloc] initWithBytes:[resultData bytes] length:[resultData length] encoding:NSUTF8StringEncoding];
    NSLog(@"%@",responseString);
    [self returnResponseToJavaScriptMethods:responseString];
}


-(void)returnResponseToJavaScriptMethods:(NSString*)theResponse{
    [viewMainWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"retrieveServerResponse('%@')",theResponse]];
}

我有什么遗漏的吗?使用相同的方法可以正确传递简单的字符串。

更新: 将 responseData 编码为 UTF8StringEncoding 就解决了问题。

[theResponse stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]
2个回答

3

在将JSON字符串发布到JavaScript之前,您可能需要对其进行URL转义。

尝试更改为:

-(void)returnResponseToJavaScriptMethods:(NSString*)theResponse{
  [viewMainWebView stringByEvaluatingJavaScriptFromString:
  [NSString stringWithFormat:@"retrieveServerResponse('%@')",theResponse]];
}

to

-(void)returnResponseToJavaScriptMethods:(NSString*)theResponse{
  [viewMainWebView stringByEvaluatingJavaScriptFromString:
  [NSString stringWithFormat:@"retrieveServerResponse('%@')",
 [theResponse stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
} 

看看这是否有帮助。但请注意,有更好(或更可靠)的方法来转义字符串,例如在此答案中提供的方法:如何对字符串进行URL编码


非常感谢您的建议,它非常有效。但现在我们需要清理使用转义字符填充的字符串,以便将其转换为正确的JSON响应。这又让我头疼了。如果您知道在JavaScript中完美地反转编码,请在评论中提及。 - Mayank Sharma
我不知道它是否“完美”,但你尝试过unescape()函数了吗?它应该可以工作,只需使用unescape(your_escaped_json_string) - uvesten
我改变了我的编码方式。我现在使用Base64编码来进行编码/解码。 - Mayank Sharma

0

在 JavaScript 中不需要使用 retrieveServerResponse(),只需在 iOS 中对字符串进行百分号转义后使用 unescape(percentEscapedStringFromiOS) 即可。

NSString *encodedString = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// CAVEAT: unescape(\"%@\") is important since "'" (single quote) isn't excaped by the above function!
NSString *jsString = [NSString stringWithFormat:@"myJSstring = unescape(\"%@\")", encodedString]];

NSString *jsResult = [self.webView stringByEvaluatingJavaScriptFromString:jsString];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接