关于 NativeCn 和 iCosta
NativeCn使用了苹果自己的固有的键盘机制,利用了日文输入法键盘,在没有针对1.1.3更新之前,可能尚无法直接支持1.1.3版。
iCosta本质上是一个附加库,通过dyld在启动SpringBoard时被自动载入, 并通过重载(override)部分方法(我猜测是UIKit的方法,没有逆向分析过)来实现中文输入,因此对于1.1.2的版本仍然可以用于1.1.3版。不过,目前的安装脚本不允许在1.1.3上直接安装,需要手工安装,这篇文章就是讲手工安装的方法的。
UPDATE: iCosta有比较明显的内存泄漏问题。在安装后,类似下面的这种错误随处可见:
*** _NSAutoreleaseNoPool(): Object 0x204680 of class NSConcreteValue autoreleased with no pool in place - just leaking
*** _NSAutoreleaseNoPool(): Object 0x206960 of class NSCFString autoreleased with no pool in place - just leaking
从错误信息看,显然是在创建可自动释放(autorelease)的对象之前没有创建NSAutoreleasePool实例,长期不重启的话,会逐渐导致系统可用内存越来越小。
安装方法
先下载好需要的iCosta 1.1.2版的PXL文件,我用的是拼音输入法,因此下载了 iCostaPy_1.1.2.pxl,其他的输入法安装方法与这里描述的完全一样。
1. 把文件改名成.zip,然后解压,得到以下一些内容:
PxlPkg.plist
README.txt
README_cn.txt
bin/iCosta.dylib (植入库)
iCostaImages/* (键盘需要的图片)
icon.png
util/iCostaCtl (用来安装和卸载的程序)
2. 在iPhone上建一个目录:
/Library/iCosta
然后把iCostaImages里面所有的PNG图片上传到建立的目录中去。完成后检查一下文件属性,应该所有人(Owner, Group, Other)都可读,否则调出输入法后看不见键盘的(注:原PXL中有权限错误),在 iPhone 上输入下面命令确保所有属性都正确:
chmod 755 /Library/iCosta
chmod 644 /Library/iCosta/*
3. 把bin目录中的iCosta.dylib上传到iPhone的/usr/lib目录中去。如果对文件属性不确定, 可以输入下面命令保证权限正确:
chmod 755 /usr/lib/iCosta.dylib
4. 把util目录中的iCostaCtl上传到iPhone的/usr/bin目录中去。如果对文件属性不确定, 可以输入下面命令保证权限正确:
chmod 755 /usr/bin/iCostaCtl
5. 确定存在/var/root/Library/Preferences/.GlobalPreferences.plist文件,如果这个文件不存在,可以用符号连接指向mobile账号下的同名文件:
ln -s /var/mobile/Library/Preferences/.GlobalPreferences.plist /var/root/Library/Preferences/.
感谢Tice指出缺少.GlobalPreferences.plist文件的这种可能性。因Dev JB 113把root有关文件移动到了mobile账号(假如安装时没有选择保留用户数据),因此在root账号下的有关配置可能是空的。
6. 在iPhone上执行下列命令安装植入库并载入字典:
iCostaCtl -install111
以上命令修改了com.apple.SpringBoard.plist,在其中插入了植入库,并修改了全局配置文件.GlobalPreferences.plist,加入了zh_CN条目。
7. 重启SpringBoard使植入库生效:
launchctl remove com.apple.SpringBoard
launchctl load /System/Library/LaunchDaemons/com.apple.SpringBoard.plist
在SpringBoard重启动的时候会通过dyld载入iCosta.dylib植入库,并进行初始化。iCosta.dylib通过重载部分方法来实现中文输入法。至此,已经可以正常输入中文了。
卸载方法
1. 修改SpringBoard配置文件并恢复设置:
iCostaCtl -uninstall111
该命令恢复经过修改的配置文件。
2. 重新启动SpringBoard:
launchctl remove com.apple.SpringBoard
launchctl load /System/Library/LaunchDaemons/com.apple.SpringBoard.plist
3. 删除安装文件:
rm -rf /Library/iCosta
rm -f /usr/lib/iCosta.dylib
rm -f /usr/bin/iCostaCtl
至此,已经彻底删除了iCosta。
常见问题
为什么切换到中文输入法时看不到键盘,却可以“摸黑”输入?
这是因为用于输入法的键盘图片权限不对,无法读取造成的。iCosta的文件包里面iCostaImages目录中的文件权限不对,有部分文件只有所有者(Owner)才能读取,如果从 Unix操作系统上通过SCP或SFTP传到 iPhone后就需要修改权限(因为Unix系统的这种复制会连带属性一起复制,除非目标文件已经存在),修改的方法前面已经讲过了。
为什么以前安装没有这个权限问题?
因为以前SpringBoard应用都是以root身份运行的,可以读取任何文件,而自1.1.3开始,SpringBoard改成了以mobile身份运行,而由于iCosta PXL文件本身的错误导致需要对文件权限进行调整。实际上,由于这个权限问题,很多第三方应用在1.1.3上都需要进行调整,比如Installer必须SUID root才能正确运行。
为什么用Natetrue的方法没有问题,用Dev Team的就有问题?
还是权限问题。Natetrue的方法最后mobile实际上是root,拥有与root同等的权限,当然不会有读不到文件的问题了。Dev Team的方法是遵循了苹果的模式,让mobile与root区分开来,所以有权限问题。
No comments:
Post a Comment