7

私のアプリでは、Objective C から JavaScript に配列を送信する必要があります。私はこの命令を使用できることをウェブで読みました: stringByEvaluatingJavaScriptFromString、また私はそうしました:

目的 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>

あなたが私を助けてくれることを願っています。

ありがとうございました

4

1 に答える 1

10
  • まず、データをプレーン文字列ではなく JSON 文字列にエンコードしてから、JS に送信します。これはNSJSONSerializationで実行できます。

    - (NSData *) arrayToJSON:(NSArray *) inputArray
    {
        NSError *error = nil;
        id result = [NSJSONSerialization dataWithJSONObject:inputArray 
                                                    options:kNilOptions error:&error];
        if (error != nil) return nil;
        return result;    
    }
    
  • でJSに送信しstringByEvaluatingJavaScriptFromString:ます。オプションで、特殊文字の問題を回避するために、文字列を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 ユーティリティについて、インターネットには、iOS 用のこれら ものや JS 用の他の ものなど、関数とライブラリの例がたくさんあります。お好きな方をお選びいただけます。

于 2013-08-01T10:32:18.233 に答える