来自 webview 的 NSString 和 JSON 字符串

Posted

技术标签:

【中文标题】来自 webview 的 NSString 和 JSON 字符串【英文标题】:NSString from webview with JSON string 【发布时间】:2014-04-14 10:33:07 【问题描述】:

我有一个 webview,我从中调用一个返回 JSON.stringify(); 结果的方法 然后将其存储在数据库中,稍后用于在 webview 中恢复页面的状态。

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 无效:

webview返回的json是:

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

注入后是这样的:

&lt;script type=\"text/javascript\"&gt;var restoreData="status":"incomplete","data_json":"\"colour\":\"#000000\"";&lt;/script&gt;

页面返回SyntaxError: JSON parse error: Unexpected identifier "object"

当我在 stringByAppendingString 方法中用单引号或双引号括起来时,页面返回 SyntaxError: JSON parse error: Expected ''

当我(手动)转义所有双引号但我不知道如何以编程方式进行时,它可以工作,我希望从 stringByEvaluatingJavaScriptFromString 返回的字符串已经转义以在双引号中使用。

【问题讨论】:

***.com/questions/14198331/…的可能重复 它不是,并且在给定的 SO 问题中提出的解决方案不能解决我的问题(当它转义为百分比编码并且我需要转义引号时它怎么能解决!)。 我使用here 提出的解决方案,这并不理想,因为这意味着我的序列化方法会转义。但是,如果我能有一个基于 Objective-C 的解决方案会更好。 【参考方案1】:

您也可以考虑以下作为解决方案,

Base64 编码你想要注入的 NSString Objective-CJavascript 中执行相反的操作。

【讨论】:

这是我现在使用的解决方案的变体(请参阅带有源链接的评论),它不是理想的解决方案,这次我可以控制 JS,我可以修改返回值或者在这种情况下注入价值,但它可能并不总是可能的。我希望有内置的解决方案或至少有一些方法可以为我做到这一点。 我接受这一点,因为无论如何这就是我现在这样做的方式,但遗憾的是没有内置的解决方案。【参考方案2】:

转义引号会起作用。

例如:

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

【讨论】:

以上是关于来自 webview 的 NSString 和 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章

webView和js交互

如何使用来自 NSString 的 NSJSONSerialization 解析 Json [重复]

使用 WebView 将 HTML 加载到 Cocoa 应用程序中并更改文本

为啥来自 NSString 分配的 NSDecimalNumber 会失败?

来自 NSString 的 Objective-C 标识符

WebView警报面板