2014-04-14 20 views
1

我有一個webview我從中調用返回結果的方法JSON.stringify(); 然後它被存儲在數據庫中,稍後用於恢復webview中的頁面狀態。從WebView與JSON字符串的NSString

NSString *data = [self.browser stringByEvaluatingJavaScriptFromString:@"course.serialize();"]; 
[self.course storeRawSerializedData:data]; 
當它從數據庫中檢索

(核心數據),我將其注入加載HTML頁面源,像這樣:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    if(_data){ 
     NSString* content = [[NSString alloc] initWithData:_data 
                encoding:NSUTF8StringEncoding]; 
     _data = nil; 
     _jsReady = YES; 

     NSString *data = @""; 
     if(self.course.returnRawSerializedData){ 
      data = [data stringByAppendingString:@"<script type=\"text/javascript\">var restoreData=%@;</script>"]; 
      data = [NSString stringWithFormat:data, self.course.returnRawSerializedData]; 
     } 
     //inject extra content to the page 
     content = [data stringByAppendingString:content]; 
     //load modified HTML string 
     [self.browser loadHTMLString:content baseURL:_url]; 
    } 
} 

的問題是使用JSON此行之後是無效的:

通過web視圖返回的JSON是:

{"status":"incomplete","data_json":"{\"colour\":\"#000000\"}"}

,注射後看起來是這樣的:

<script type=\"text/javascript\">var restoreData={"status":"incomplete","data_json":"{\"colour\":\"#000000\"}"};</script>

頁返回SyntaxError: JSON parse error: Unexpected identifier "object"

當我在stringByAppendingString法單或雙引號把它包起來,然後頁面返回SyntaxError: JSON parse error: Expected '}'

它的工作原理當我手動轉義所有雙引號但我不知道如何以編程方式執行它時,我預期從stringByEvaluatingJavaScriptFromString返回的字符串已經被轉義以便在雙引號內使用。

+0

的可能的複製http://stackoverflow.com/questions/14198331/how-to-pass-json-nsstring-containing-json-to-a-javascript-method-從目標 – 2intor

+0

這是不是和提出的解決方案在給定的SO問題不解決我的問題(以及它如何轉移到編碼百分比,我需要逃脫引號!)。 –

+0

我使用了[這裏]建議的解決方案(http://stackoverflow.com/a/770533/923340),這並不理想,因爲這意味着我的序列化方法將會轉義。不過,如果我能有一個基於Objective-C的解決方案,那會更好。 –

回答

1

你也可以考慮以下的解決方案,

Base64編碼要在Objective-C注入做反向的JavascriptNSString

+0

這是我現在使用的解決方案的變體(請參閱我的評論與鏈接源),這不是理想的解決方案,這次我有JS的控制權,我可以修改返回的值或在這種情況下注入的值,但它可能並不總是可能的。我希望有解決方案,或者至少有一些方法可以幫助我。 –

+0

我無論如何都接受這一點,這就是我現在正在做的事情,但遺憾的是沒有內置的解決方案。 –

0

逃脫報價將工作。

例如:

content = [content stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];