问题描述

在给游戏资源做加密的时候,发现了一个问题,加密前的对象可以正常获取fullpath,加密后就一直是nil,难道苹果会自己识别 对应资源,如果资源格式被破坏后,就没办法取到fullpath.

问题分析

std::string CCFileUtilsIOS::getFullPathForDirectoryAndFilename(const std::string& strDirectory, const std::string& strFilename)
{
    if (strDirectory[0] != '/')
    {
        NSString* fullpath = [[NSBundle mainBundle] pathForResource:[NSString stringWithUTF8String:strFilename.c_str()]
                                                             ofType:nil
                                                        inDirectory:[NSString stringWithUTF8String:strDirectory.c_str()]];
        if (fullpath != nil) {
            return [fullpath UTF8String];
        }
    }
    else
    {
        std::string fullPath = strDirectory+strFilename;
        // Search path is an absolute path.
        if ([s_fileManager fileExistsAtPath:[NSString stringWithUTF8String:fullPath.c_str()]]) {
            return fullPath;
        }
    }
    return "";
}

这个是ios 获取资源全路径的方法,因为之前我有在其它项目上成功过,所以这个问题,因为通过对比取不一样的地方,应该就是问题所在。 最后发现,只要是虚拟上目录下就可以正常获取加密的资源,真实目录会检测它对应格式数据是不是正确(我只对png做了测试)。

解决方案

使用虚拟目录,把资源都放虚拟目录就可以正常读取资源了,如果需要多一层目录,可以使用

CCFileUtils::sharedFileUtils()->addSearchPath("res/");