2013-08-01 29 views
7

在我的應用程序,我需要發送一個數組從目標C到JavaScript。我,我可以使用這個指令在網絡上閱讀:stringByEvaluatingJavaScriptFromString,也是我做了這麼:發送NSArray到javascript

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

我希望你能幫助我。

謝謝

+0

您應該使用'NSJSONSerialization'將所有數據編碼爲JSON,並在JS land中進行解碼。 –

+0

@MikeWeller:讓我們看看我是否理解得很清楚:在目標C中,我必須用NSJSONSerialization編碼2個NSArray,然後在javascript中解碼?你能否更好地解釋我,也許你可以把你的解決方案作爲答案? – lucgian84

回答

9
  • 首先,您的數據編碼成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); 
    } 
    

UPDATE:關於Base64編碼工具,用於iOS和JS,互聯網是大量的功能和庫的例子,像theseones iOS和這些otherones的JS。你可以選擇你喜歡的。

+0

你認爲我應該用外部庫對我的'javascriptString'進行編碼,並使用下面的代碼傳遞給javascript:'[self.webView stringByEvaluatingJavaScriptFromString:javascriptString];' – lucgian84

+0

是的,使用Base64對字符串進行編碼和解碼會更安全例如,以避免一些特殊字符的問題。 – veducm

+0

我已經添加了一個完整的例子,所以你可以實際測試它,讓我知道它是否工作。希望能幫助到你! – veducm