NativeCn is a Chinese input method, this article is written in Chinese.
试用NativeCn
UPDATE: 注意,你在使用它之前应该知道,该程序会向开发者传回有关你手机的数据(是否牵涉个人隐私不祥)。
因最近有朋友说NativeCn 3.01已经正式支持1.1.3了,我以前一直是NativeCn的用户,只是后来升级到1.1.3后暂时没有合适版本,所以才尝试了一下iCosta,没想到一下就吸引了我。既然NativeCn能够支持1.1.3了,我也很愿意试用一下,希望能够找回从前的感觉,同时由于用过了iCosta,也可以进行一下比较,毕竟这是两种完全不同的实现方式。
我从官方网站得到了相关的安装文件NativeCn3X.zip,安装脚本很简单,无非是拷贝文件,并且加上了用来解决很多第三方软件不能运行问题的符号链接(对libgcc_s.1.dylib的引用)。从脚本上看应该可以顺利安装在所有1.1.3上,用Installer相信可以毫无困难的安装。
我还是用老办法,手工安装和试用,便于发现和解决问题。
第一次运行
按照说明第一次运行需要访问网络,我很好奇究竟为什么要访问网络,于是我用tcpdump进行了捕获,感觉是个CRC值(生成算法不清楚,没有逆向分析算法)传给了开发者网站:
http://www.iphone.org.hk/cgi-bin/ncn.cgi?code=XXX
多次实验发现,这个值不能伪造,显然ncn程序里面有对比检查的,而且多次实验的结果这个值总是相同,我猜测这是一个针对每台iPhone都不相同的一个值。不知道开发者为什么需要得到这个CRC值,而且又不明说,只是说需要访问网络,让人感觉未免有些不太光明正大。
UPDATE: 要试验很简单,在浏览器里面输入上面的链接,其中的XXX可以填写任意的内容,长度也可以任意(不知道会不会导致CGI崩溃或者造成网站阻塞?)。
UPDATE: 如果不喜欢这个未经用户同意就偷传数据的功能,可以打个小补丁:
Search for differences 1. G:\iPhone Stuffs\iPhone Apps\NativeCn3X\Applications\NativeCn.app\ncn: 1,567,416 bytes 2. G:\iPhone Stuffs\iPhone Apps\NativeCn3X\Applications\NativeCn.app\patched\ncn: 1,567,416 bytes Offsets: hexadec. 6F0C: 21 01 6F0D: FF 00 6F0E: FF A0 6F0F: EB E3 4 difference(s) found.
UPDATE: 注意这个补丁一定要在安装好NativeCn后立即进行,一旦联网用过NativeCn后,这个补丁就不起作用了。
UPDATE: 如果想实验捕获这个数据传输过程,可以删掉NativeCn目录中的ncn.dat文件,然后在网关上启动TCP报文侦听,准备截获发往上面服务器的80端口的数据报文,启动NativeCn,你会立即发现有HTTP请求发往上面的网站,code=后面跟的就是你iPhone的CRC值。
访问权限
由于需要在安装目录进行写入,同时需要根据需要重启服务甚至重启iPhone,因此NativeCn的两个程序ncn(主程序)和ncn_sub(该程序就是wget,不过版本太老,文件太大了,新版的只有200多KB)都设置了SUID root权限,以便越过对mobile的权限限制。ncn_sub将CRC通过CGI程序传送给Web服务器并将返回结果存入本地ncn.dat文件,从我实验的结果来看返回来的就是传过去的值。
国际键盘
NativeCn使用Apple内置国际键盘,利用了日文键盘,为了在1.1.3上使用,程序利用了Erica Sadun的plutil工具修改.GlobalPreferences.plist等文件(像是先转换成了XML),并对UIKit打补丁(大概这就是需要重启动iPhone一次的原因)。另外,程序自带了需要用到的几个BSD工具,比如reboot,这些工具是随BSD Subsystem安装的,既然要求安装BSD Subsystem又何必要自带这些已经安装的工具?
键盘图片
有一个问题是图片格式的问题,大概为了省事,图片全部采用BMP格式,这个格式载入方便,但是占用空间比较大,仅这一项就占掉了7MB的空间,好像有些浪费。还有一个小问题,目录里面有一个Windows环境下的Thumbs.db文件,打包的人也太粗心了,这个问题以前版本也有 :)
卸载问题
NativeCn的卸载稍显简单了,善后工作不是很完整,从脚本看只是简单的删除了NativeCn.app目录,并没有完全删除程序的每一个细节,比如/usr/lib/n.lib和/var/mobile/Library/NativeCn都没有删除(难道我的安装脚本不正确?)。
使用感受
从使用角度来看,个人感觉和以前没有多大区别,假如没有iCosta作对比的话,我会很满意这个输入法了。但是对比就发现了一些不足的地方(我是用全拼的):
1. 键盘太小,按错的比例较高
2. 汉字太小,看起来有些吃力
3. 缺少联想
有一点需要提及的是,虽然对NativeCn的具体实现方法我不是太清楚(我只逆向分析感兴趣的东西,从未做过键盘的逆向分析),但可以肯定的是与iCosta所用的插入库技术完全不同,后者通常是用来对程序进行测试用的,不过iCosta迁移比较方便。另外,NativeCn没有像iCosta那样明显的内存泄漏问题(UPDATE: 该问题已在1.0.5版修正)。但两种输入法都缺少快速输入所需要的词组功能。
总的来说,iCosta 3.01 NativeCn 3.01 (手误) 给我的感觉还不错,相比之前版本,既不好也不坏,当然我输入汉字的时候很少,可能有些片面了,另外可能每个人感觉会有所不同。从我角度出发,我还是愿意使用iCosta,它的流畅性和大字体是我所喜欢的。
UPDATE: 在未知NativeCn将什么数据传回开发者(是否有关个人隐私)之前我不会使用它。

15 Comments
Maybe you can have a try with the WeFIT input method, now in preview 5 version.
For the user use the Pinyin input method, it’s much better than the iCosta as the support of the words & long sentence.
I won’t give it a try until it’s final.
WeFIT caused problem when the first “preview” was released. It modifies a daemon file(i forgot witch one…), when I tried to remove it from my iphone it causes a stuck-on-white-apple. I like FIT very much on my osx, but on iphone they still have long way to go, plus it’s much slower than other two popular input methods, for what I have heard…so yea, maybe i’ll give a final version a try, I don’t like programs that update very 5 minutes. iCosta is much more like my type :)
NativeCN的方法是修改UIKit.framework下面的一个dat(好像是word.dat吧?),在日文文字的部分加入整个输入法码表从而实现和日文共享输入法. 说实话这个有点作坊的感觉,呵呵. 个人还是比较愛 iCosta 的,因为它独立.
and you have a typo here:
iCosta 3.01给我的感觉还不错
@Crump: You are right. NativeCN is just replacing data file - those encoding tables. They did nothing more than that.
@George: I checked those “leaking” messages and found it is just from initialization code. There are totally 12 messages on 1.1.x. At initialization time no autorelease pool is created so those are leaked, but once application started and autorelease pool was established - Either AppKit or UIKit application always contains its own autorelease pool inside. So the initialization leak is one time stuff, no more leaks there.
Well, are those leaked memory auto cleaned when the application quits ? From what I can see, most applications uses UIKit, which will trigger some leak, if these leaked memory never gets cleaned when the application quits, it’ll sums up to a huge value some time later. I didn’t feel any obvious memory issues, I’m just speculating such a potential issue.
这个输入法在Safari下输入中文一按退格Safari就自动退出,George有什么建议么?
我就试了一下,因为没打算继续用,所以没有仔细使用各个方面,抱歉无法提供任何有价值的建议。建议你发到开发者论坛去。
应该是firmware的bug,没法解决。
RC1 released, pretty stable, the bugs mentioned here have been fixed. Looking forward to the final version.
I mean weFIT 1.0RC1
@George:
Yes, leaked memory is reclaimed by OS once application quit.
it seems ncn.cgi had been removed already
Connect to http://www.iphone.org.hk/cgi-bin/ncn.cgi
========= Not Connected =========
========= Dns Lookup : Working =========
========= Dns Lookup : Done =========
========= Connected =========
========= Method used : HEAD =========
========= Waiting for Headers =========
========= Waiting for Body =========
========= Ready =========
HTTP/1.1 404 Not found
Server: Sun-ONE-Web-Server/6.1
Date: Tue, 11 Mar 2008 13:40:43 GMT
Content-length: 292
Content-type: text/html
Connection: close
ReplyCode = #404
ReplyText = Not found
IP Address = 203.169.142.220
ContentLen = 292 Bytes