2013-08-01 10 views
7

私のアプリではObjective Cからjavascriptに配列を送る必要があります。私はこの命令を使用することができ、ウェブ上でお読みください。stringByEvaluatingJavaScriptFromStringを、また、私はそう製:だからjavascriptので、私はこの名前dataFromObjC(names, srcs)を持つ関数を作っNSArrayをjavascriptに送信

の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]; 

スニペットが、それ私が作ったアラートが表示されません。 私はこの問題を解決するために私の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文字列にデータをエンコードし、

+0

すべてのデータをJSONとしてエンコードし、JSランドに置いたらデコードしてください。 –

+0

@MikeWeller:私がよく理解しているかどうかを見てみましょう:また、私は2 NSArrayを 'NSJSONSerialization'でエンコードし、次にjavascriptでデコードする必要がありますか?あなたは私のことをもっとよく説明できますか?答えとしてあなたの解決策を書くことができますか? – lucgian84

答えて

9
  • まずありがとうございます。 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); 
    } 
    

UPDATE:iOSとJSのためのBase64ユーティリティについて、インターネットは、iOS用theseonesとJSのためにこれらのotheronesのように、関数やライブラリの例がたくさんあります。好きなものを選ぶことができます。

+0

私は 'javascriptString'を外部ライブラリでエンコードし、これを使ってjavascriptに渡すべきだと思います:' [self.webView stringByEvaluatingJavaScriptFromString:javascriptString]; ' – lucgian84

+0

はい、Base64で文字列をエンコードしてデコードする方が安全ですいくつかの特殊文字の問題を避けるためです。 – veducm

+0

完全な例を追加して、実際にテストして、動作しているかどうか教えてください。それが役に立てば幸い! – veducm

関連する問題