跳过正文
  1. Posts/

记一个行结束符引发的JS报错

··1 分钟

2018.9.5

问题描述
#

最近遇到一个神奇的Bug,通过UIWebViewstringByEvaluatingJavaScriptFromString:方法执行一段JavaScript代码时,JavaScript报错:

SyntaxError: Unexpected EOF

经过仔细的排查,发现待执行的JavaScript代码里面包含U+2028字符。还找到了Stack Overflow相关讨论JavaScript解析器会把行分隔符U+2028和段落分隔符U+2029解析成一行的结束,代码里要是包含这两个字符相当于换行,例如:

alert("\u2028")

就会被解析为

alert(" “)

于是就产生了语法错误。

解决方案
#

我用的方法比较简单、粗暴,在执行JavaScript代码前,直接过滤掉这两个字符。代码如下:

// 
    javaScriptString = [javaScriptString stringByReplacingOccurrencesOfString:@"\u2028" withString:@""];
    javaScriptString = [javaScriptString stringByReplacingOccurrencesOfString:@"\u2029" withString:@""];
    NSString* ret = [(UIWebView*)_engineWebView stringByEvaluatingJavaScriptFromString:javaScriptString];

相关文章

从一个AFNetworking循环引用说起

··3 分钟
2018.8.28 本文分析使用代码是AFNetworking 3.2.1 最近使用Instruments中的Leaks分析项目内存泄露,发现了一个AFNetworking的循环引用。如下图所示:

iOS模拟器安装debug包

··2 分钟
2018.8.21 由于项目是Hybrid的平台,有第三方人员需要在上面开发H5应用,但是release包不能调试H5,只有debug报可以调试,但是项目源码不能交给第三方,在google搜索了下,发现一篇霜神的文章,讲的是debug包可以拷贝到其它机器运行,于是实践了一波。

dispatch_sync死锁问题

··1 分钟
2018.8.3 问题分析 # 使用dispatch_sync的时候要小心谨慎,稍不注意就会导致死锁问题,先看两个典型的案例:

UIWebView获取详细浏览记录

··4 分钟
2018.8.1 需求 # 获取UIWebView的前进后退的浏览记录,举个例子,比如从A->B->C->B,此时B上一页是A,下一页是C,需要获取A、C的URL信息。

runtime实现私有变量搜索

··2 分钟
本文 Demo 地址 2018.7.31 需求 # 在开发功能时,为了满足产品变态的需求,难免有系统类提供的API不够用的时候,这时候私有变量就可以发挥它光和热了。怎么通过一个类,一层一层的找到特定类型的私有成员变量? 受益于Objective-C的动态语言特性,就算苹果UIKit不开源,但是在runtime面前,类的结构还是暴露无遗。我的思路是逐层手动打印成员变量信息,如果是UI控件可以用Reveal来加快进度,配合KVC机制,获取私有变量就如同探囊取物一般。 在多次遇到这个问题后,我决定实现一个工具类来简化这个过程,毕竟能自动化的就尽量不要手动。