最近在玩儿 OCR,运行 APP 的时候遇到了一个找不到资源文件的问题,导致无法识别。Google 了一下,把资源文件的引入方式从 Group 改成 Folder Reference,问题就解决了。但是不知道为什么这样能解决问题,就继续查了一些资料,了解一下 Group 与 Folder Reference 的区别,总结如下。
从设计目的上来看,Group 是想让你用来引入代码的,Folder Reference 是想让你用来引入资源文件的。从处理逻辑上看,Xcode 会为 Group 下面的每一个文件生成一个 Reference,并最终把 Group 下面的文件都平铺放到 Product Bundle 的根目录下面;而 Folder Reference 会为文件夹生成一个 Reference,不管内部文件的变动,最终文件会保持目录结构不变 copy 到 Product Bundle 下面;从特性上来看,用 Group 里面的文件可以单独控制,设置 target,设置是否被引入工程等等;Folder Reference 里面的文件可以通过 File System 自由的改动(一些图标通过 Finder 直接 copy 进去),要么全部引入,要么全部不引入。所以说,Group 适合用于引入代码,Folder Reference 适合用于引入资源文件。
回过头说下最开始的问题,为什么 TesseractOCR-iOS 无法找到 traineddata 文件。是因为我是通过 Group 引入,文件都会平铺到 Product Bundle 根目录下面,而内部初始化逻辑是在主 Bundle 下面的 tessdata 目录下面找的,路径不匹配,所以报了无法找到 traineddata 文件的错误。
...
if (self.absoluteDataPath == nil) {
// config Tesseract to search trainedData in tessdata folder of the application bundle;
_absoluteDataPath = [NSBundle mainBundle].bundlePath;
}
setenv("TESSDATA_PREFIX", [_absoluteDataPath stringByAppendingString:@"/"].fileSystemRepresentation, 1);
...
参考链接:Reference 1 , Reference 2