2013-08-01 15 views
7

W mojej aplikacji muszę wysłać tablicę z Objective C do javascript. Czytałem w internecie, że mogę korzystać z tej instrukcji: stringByEvaluatingJavaScriptFromString, także zrobiłem tak:Wysyłaj NSArray do javascript

Objective C snippet

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

Więc w javascript Zrobiłem funkcję, która ma tę nazwę dataFromObjC(names, srcs), ale nie pokazuje mi wpisu, który zrobiłem. Opublikuję tutaj pełny kod mojego html, dzięki czemu możesz mi pomóc rozwiązać ten problem.

HTML kod

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

Mam nadzieję, że może mi pomóc.

Dziękuję

+0

Powinieneś zakodować wszystkie swoje dane jako JSON za pomocą 'NSJSONSerialization' i dekodować je, gdy będziesz w JS land. –

+0

@MikeWeller: Zobaczmy, czy dobrze rozumiem: również w obiektywnym C muszę zakodować 2 NSArray z 'NSJSONSerialization', a następnie w javascript muszę odszyfrować? Czy możesz mi lepiej wytłumaczyć, czy możesz napisać swoje rozwiązanie jako odpowiedź? – lucgian84

Odpowiedz

9
  • Najpierw kodowania danych na ciąg JSON, zamiast zwykłego łańcucha, przed wysłaniem go do JS. Możesz to zrobić pod numerem NSJSONSerialization.

    - (NSData *) arrayToJSON:(NSArray *) inputArray 
    { 
        NSError *error = nil; 
        id result = [NSJSONSerialization dataWithJSONObject:inputArray 
                   options:kNilOptions error:&error]; 
        if (error != nil) return nil; 
        return result;  
    } 
    
  • Wyślij do JS z stringByEvaluatingJavaScriptFromString:. Opcjonalnie, polecam ci zakodować ciąg z Base64, aby uniknąć problemów ze znakami specjalnymi.

    // 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]; 
    
  • Raz w JS, analizować łańcuch JSON do obiektu (opcjonalnie, pamiętaj, aby go rozszyfrować jeśli zakodować pierwsze).

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

UPDATE: O użyteczności base64 dla iOS i JS, Internet jest mnóstwo przykładów funkcji i bibliotek, jak theseones dla iOS i tych otherones dla JS. Możesz wybrać ten, który preferujesz.

+0

Myślisz, że powinienem zakodować moje 'javascriptString' z zewnętrzną biblioteką i przekazać do javascript'a używając:' [self.webView stringByEvaluatingJavaScriptFromString: javascriptString]; ' – lucgian84

+0

Tak, bezpieczniej byłoby kodować i dekodować ciąg z Base64 dla na przykład, aby uniknąć problemów z niektórymi znakami specjalnymi. – veducm

+0

Dodałem pełny przykład, abyś mógł go przetestować i dać znać, czy to działa. Mam nadzieję, że to pomoże! – veducm