2013-08-01 17 views
7

için NSArray gönder. Ben bu talimatı kullanabilirsiniz Web'de okuyun: stringByEvaluatingJavaScriptFromString, ayrıca ben çok yaptı: Yani javascript ben bu adı dataFromObjC(names, srcs) sahip bir işlev yaptıBen javascript Amaç C'den bir dizi göndermek gerekir benim app 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]; 

pasajı, ancak Bana yaptığım uyarıyı göstermiyor. Burada html'nin tam kodunu göndereceğim, böylece bu sorunu çözmemde bana yardımcı olabilirsiniz.

HTML kodunu

<!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> 

Bana yardımcı olabilir umuyoruz.

JS göndermeden önce yerine düz dize bir JSON dizeye verilerinizi kodlamak,

+0

JSON 'NSJSONSerialization' kullanma gibi tüm verilerinizi kodlamak ve JS arazi demektir kez deşifre etmelidir. –

+0

@MikeWeller: Bakalım iyi anlarsam: Ayrıca objektif C de 2 NSArray'i "NSJSONSerialization" ile kodlamak zorundayım ve daha sonra kod çözmem gereken javascript'im var mı? Beni daha iyi anlatabilir misin belki de çözümünüzü cevap olarak yazabilir misiniz? – lucgian84

cevap

9
  • İlk teşekkür ederiz. Bunu NSJSONSerialization ile yapabilirsiniz.

    - (NSData *) arrayToJSON:(NSArray *) inputArray 
    { 
        NSError *error = nil; 
        id result = [NSJSONSerialization dataWithJSONObject:inputArray 
                   options:kNilOptions error:&error]; 
        if (error != nil) return nil; 
        return result;  
    } 
    
  • stringByEvaluatingJavaScriptFromString: ile JS gönder. İsteğe bağlı olarak, özel karakterlerle ilgili sorunları önlemek için dizeyi Base64 ile kodlamanızı öneririm.
    // 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]; 
    
  • kez JS, bir nesnenin (önce kodlarsanız isteğe bağlı olarak bunu çözmek için unutmayın) için JSON dizesi ayrıştırmak.

    function yourJsFunction(encodedArray) 
    { 
        // Decode and parse the received input 
        var jsonString = Base64.decode(encodedArray); 
        var arrayFromiOS = JSON.parse(jsonString); 
    } 
    

GÜNCELLEME: iOS ve JS için Base64 yardımcı programlar hakkında, İnternet these iOS için ones ve JS için bu otherones gibi, işlevleri ve kütüphanelerin örnekler bol olduğunu. Tercih edeceğiniz birini seçebilirsiniz.

+0

"javascriptString" işlevini harici bir kütüphaneyle kodlamalıyım ve bunu kullanarak javascript'e aktarmalıyım: '[self.webView stringByEvaluatingJavaScriptFromString: javascriptString];' – lucgian84

+0

Evet, dizeyi Base64 ile kodlamak ve kod çözmek daha güvenli olurdu. Örneğin, bazı özel karakterlerle ilgili sorunları önlemek için. – veducm

+0

Tam bir örnek ekledim, böylece gerçekten test edebilir ve çalışıp çalışmadığını bana bildirebilirsiniz. Umarım yardımcı olur! – veducm