2013-08-01 2 views
1

В моем приложении мне нужно прочитать файл JSON, хранящийся в папке Documents моего iPhone. Я видел, что существует метод для объединения javascript и цели C. Как я могу это сделать? Я понимаю, что я должен использовать этот метод в объекте C - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;, но что я должен написать в javascript? Я нашел это: call objective C method from javascript, но я не понял, как это работает. В моем приложении я имею сделать это:Прочтите файл JSON из папки документов iOS с javascript

  1. Reach предложения от мобильного сайта (я сделал какой-нибудь мобильный сайт)
  2. Я хранить мобильный локальный сайт в папке Документы моего iPhone
  3. Я создаю файл JSON для сохранения имени, пути и даты истечения срока действия предложения. Я сохранил этот JSON в папке «Документы» моего iPhone.
  4. . .
  5. . У моего приложения есть контроллер просмотра «архив», в котором я загружаю мобильный сайт, на котором я буду перечислять все предложения, хранящиеся на устройстве, путем чтения созданного JSON.

Я создал собственное приложение, и он работает, теперь я должен реализовать метод для чтения файла JSON из папки «Документы», может ли кто-нибудь помочь мне сделать эту операцию? Как я могу прочитать JSON из javascript, проанализировать его и показать результат в динамическом списке html?

Спасибо

КОД UPDATE: пока я писал этот код:

Objective C сниппет

- (void)parseJson { 
    // Carico il documento JSON dalla cartella documents 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"data.json"]; 
    BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath]; 
    if (fileExist) { 
     NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; 
     NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding]; 
     NSDictionary *dictContent = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 
     if (dictContent) { 
      NSDictionary *sites = [dictContent objectForKey:@"sites"]; 
      NSArray *site = [sites objectForKey:@"site"]; 
      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"]]; 
      }; 
      NSString *javascriptString = [NSString stringWithFormat:@"dataFromObjC([%@, %@])", names, srcs]; 
      [self.webView stringByEvaluatingJavaScriptFromString:javascriptString]; 
     } 
    } else { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Promo" message:@"Non hai ancora salvato nessuna promozione!" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; 
     [alert show]; 
    } 

    // Faccio il parse del documento JSON 
    // Passo le informazioni parsate al javascript 
} 

В 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"> 
      function dataFromObjC(names, srcs) { 
       alert(names); 
       alert(srcs); 
      } 
     </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> 

Я надеюсь, что это будет полезно для ее решения. Я использовал stringByEvaluatingJavaScriptFromString, потому что я нашел здесь сообщение для чтения данных с объективного C на javascript.

ответ

0

Как нужно читать JSON только, а затем прочитать его:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                NSUserDomainMask, 
                YES); 

NSString *fullPath = [[paths lastObject] stringByAppendingPathComponent:@"myJson.json"]; 
NSData *jsonData = [[NSFileManager defaultManager] contentsAtPath:fullPath]; 

затем разобрать его NSDictionary:

id jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 

Обновленный снова: Если вы хотите вызвать OBJ с из JavaScript , вам необходимо определить конкретный URL-адрес, например:

http://abc.com/?key=value 

Затем назовите его ЯШ:

function callObjC(){ 
    location.href='http://abc.com/?key=value'; 
} 

Тогда в shouldStartLoadWithRequest, сравнение URL-запрос и конкретного URL, это они же тогда делать свою функцию.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    if ([[[request URL] absoluteString] hasPrefix:@"http://abc.com/"]) { 
     //comparing urls, if almost the same 
     //if you need to pass parameters to Obj C, put them in the URL as my example and explode yourself 
     [self anotherMethod];//your method 
     return NO;//skip the request, as the link is not valid or we don't want to change the webview 
    } 

    return YES; 
} 

Ваш link provided, он использует самоопределенную протокол: JS-вызов, а не HTTP. Это работает, но Apple не рекомендует его.

+0

Хорошо, я знаю это. Но я должен сделать это в javascript ... Как я могу это сделать? – lucgian84

+0

Что вы думаете об этом [link] (https://github.com/marcuswestin/WebViewJavascriptBridge)? – lucgian84

+0

Обновлены мои ан. – Horst

Смежные вопросы