在我的应用程序中,我需要将一个数组从 Objective C 发送到 javascript。我在网上看到我可以使用这条指令:stringByEvaluatingJavaScriptFromString
,我也是这样做的:
Objective-C 片段
NSMutableArray *names = [[NSMutableArray alloc]init];
NSMutableArray *srcs = [[NSMutableArray alloc]init];
for (int i = 0; i < [site count]; i++) {
NSDictionary *dictData = [site objectAtIndex:i];
[names addObject:[dictData objectForKey:@"name"]];
[srcs addObject:[dictData objectForKey:@"src"]];
}
// UPDATE
NSData *jsonArray = [self arrayToJson:nameSrc];
NSString *jsonString = [[NSString alloc]initWithData:jsonArray encoding:NSUTF8StringEncoding];
NSString *econdedString = [self base64String:jsonString];
NSString *jsCall = [NSString stringWithFormat:@"dataFromObjC(\"%@\")", econdedString];
[self.webView stringByEvaluatingJavaScriptFromString:jsCall];
所以在 javascript 中,我创建了一个名为 dataFromObjC(names, srcs)
的函数,但它没有显示我发出的警报。
我将在这里发布我的 html 的完整代码,以便您可以帮助我解决这个问题。
HTML代码
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
<title>Lista coupon</title>
<script src="../js/jquery-1.9.1.min.js" type="text/javascript"></script>
<script src="../js/memoria.js" type="text/javascript"></script>
<script type="text/javascript" src="../js/base64.js"></script>
<script type="text/javascript">
function dataFromObjC(encodedArray) {
var jsonString = Base64.decode(encodedArray);
var arrayFromiOS = JSON.parse(jsonString);
alert(jsonString);
}
</script>
<style type="text/css">
body {
background-color: #000000;
width: 100%;
height: 100%;
padding: 0;
margin: 0;
}
ul {
list-style-type: none;
padding: 5px;
}
li {
color: #FFFFFF;
font-family: sans-serif;
padding-bottom: 5px;
}
p {
color: #FFFFFF;
font-family: sans-serif;
padding: 5px;
text-align: center;
}
a {
text-decoration: none;
color: #FFFFFF;
}
</style>
</head>
<body onload="loadJson();">
<div id="header">
</div>
<div id="content">
<p>Di seguito trovi tutte le promozioni salvate</p>
<div id="list">
</div>
</div>
<div id="footer">
</div>
</body>
</html>
我希望你能帮助我。
谢谢
最佳答案
首先,在将数据发送到 JS 之前,将您的数据编码为 JSON 字符串而不是普通字符串。你可以用 NSJSONSerialization 来做到这一点.
- (NSData *) arrayToJSON:(NSArray *) inputArray { NSError *error = nil; id result = [NSJSONSerialization dataWithJSONObject:inputArray options:kNilOptions error:&error]; if (error != nil) return nil; return result; }
使用
stringByEvaluatingJavaScriptFromString:
将其发送到 JS。或者,我建议您使用 Base64 对字符串进行编码, 以避免出现特殊字符问题。// Convert your array to JSON data NSData *jsonArray = [self arrayToJSON: yourArray]; // Pass the JSON to an UTF8 string NSString *jsonString = [[NSString alloc] initWithData:jsonArray encoding:NSUTF8StringEncoding]; // Base64 encode the string to avoid problems NSString *encodedString = [Base64 encode:jsonString]; // Evaluate your JavaScript function with the encoded string as input NSString *jsCall = [NSString stringWithFormat:@"yourJsFunction(\"%@\")", encodedString]; [self.webView stringByEvaluatingJavaScriptFromString:jsCall];
在 JS 中,将 JSON 字符串解析为对象(可选,如果先编码,请记住对其进行解码)。
function yourJsFunction(encodedArray) { // Decode and parse the received input var jsonString = Base64.decode(encodedArray); var arrayFromiOS = JSON.parse(jsonString); }
更新:关于适用于 iOS 和 JS 的 Base64 实用程序,Internet 上有大量函数和库的示例,例如 these ones适用于 iOS 和这些 other ones对于 JS。您可以选择自己喜欢的。
关于javascript - 将 NSArray 发送到 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17990655/