Objective-C运行时加载服务端资源至Bundle 实现多Cocos游戏分目录加载
问题解答
首先明确:iOS 应用的 App Bundle 是安装后只读的系统目录,不可能在运行时把下载的资源写入Bundle、变成内置预置资源。你完全不需要把资源硬塞进Bundle,只要修改Cocos引擎的资源搜索路径,就能直接加载沙盒里解压完成的游戏资源。
问题根源
你现在必须提前把资源加到Xcode的「Copy Bundle Resources」构建阶段才能加载,本质原因是Cocos2d-x默认的资源搜索路径只覆盖App Bundle内的资源目录,没有把你沙盒中解压后的游戏资源路径加入搜索列表,引擎找不到对应文件自然加载失败。
落地实现步骤
- 首先调整资源解压的目录结构,做游戏资源隔离
不要把所有下载的zip都直接解压到Documents根目录,否则多游戏资源重名会直接覆盖冲突。给每个游戏分配独立的沙盒子目录,比如ID为1001的游戏解压到Documents/games/1001/,ID为1002的游戏解压到Documents/games/1002/即可。
对应解压逻辑的修改参考:NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths firstObject]; // currentGameId 替换成你当前要启动的游戏的唯一标识 NSString *gameSaveDir = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"games/%@", currentGameId]]; NSFileManager *fileMgr = [NSFileManager defaultManager]; // 自动创建多级目录 [fileMgr createDirectoryAtPath:gameSaveDir withIntermediateDirectories:YES attributes:nil error:nil]; // 把zip包解压到对应游戏的专属目录 [SSZipArchive unzipFileAtPath:zipFilePath toDestination:gameSaveDir]; - 启动Cocos引擎前,把目标游戏的沙盒路径加到引擎搜索列表最前端
Cocos的文件工具类会按照搜索路径的顺序查找资源,把沙盒路径放在最高优先级,引擎就会优先加载你下载的资源,不会依赖Bundle内的预置文件。
这段代码要加在app->start()调用之前:// 把OC路径字符串转成Cocos支持的std::string格式 std::string gameResourcePath = [gameSaveDir UTF8String]; // 第二个参数传true,代表把该路径插入搜索列表最顶部,优先级最高 FileUtils::getInstance()->addSearchPath(gameResourcePath, true); - 修正现有逻辑的稳定性问题
你当前用dataWithContentsOfURL做同步网络请求,会直接卡死主线程,网络差时会被系统watchdog判定为无响应直接杀进程,必须改成异步下载:NSURLSessionDownloadTask *downloadTask = [[NSURLSession sharedSession] downloadTaskWithURL:url completionHandler:^(NSURL *tmpLocation, NSURLResponse *resp, NSError *err) { if (!err && tmpLocation) { // 下载完成后切回主线程执行解压、路径配置、引擎启动逻辑 dispatch_async(dispatch_get_main_queue(), ^{ // 此处写zip移动、解压、加搜索路径、 present控制器、启动app的逻辑 }); } }]; [downloadTask resume];
注意事项
- 不要把游戏资源解压到
NSCachesDirectory目录,系统在存储空间不足时会自动清理该目录下的文件,会导致资源丢失需要重新下载 - 动态下发的内容只能是图片、配置、音频这类非可执行资源,不要下发lua、js脚本或者编译后的二进制代码,否则会触发苹果审核拒审
- 资源下载完成后最好做MD5校验,避免下载/解压过程中文件损坏导致游戏启动失败
内容的提问来源于stack exchange,提问作者PinPolygons
相关产品推荐
相关产品推荐

