javascript - 将 NSArray 发送到 javascript

标签 javascript objective-c uiwebview

在我的应用程序中,我需要将一个数组从 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/

相关文章:

应用程序未运行时的 iOS 7 后台获取

ios - 在 AVFoundation AVSampleBufferDisplayLayer 中循环播放视频

iphone - iOS字体:如何在iOS中显示科普特字体

javascript - 使用javascript将类附加到父div

jquery - 单击 highslide 事件中的 anchor

iphone - 音频本地化

ios - 带有 setTintColor 的 UIWebView 插入符号颜色?

javascript - 如何使用 JavaScript 发出 HTTP 请求以从 Ubiquity AirMax 或 AirFibre radio 获取 status.cgi json 数据?

javascript - 使用 CSS/JavaScript 安排动画?

uiwebview - 如何检测 UIWebView 是否正在缩放?