博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】plist涉及到沙盒的一个问题
阅读量:6413 次
发布时间:2019-06-23

本文共 2439 字,大约阅读时间需要 8 分钟。

保存玩家数据,模拟器读写都可以,而真机plist文件只能读不能写,十分头大,弄球一天找到了问题所在。

按照网上比较有说服力的说法是:iOS程序执行的时候是在“沙盒”里执行。而沙盒里的数据不能写入,只能读取。

经过测试,当一个程序在执行的时候,比如叫 Test.app 的iOS程序,获得他的执行地址的代码是(比如找的是CFG.plist文件)

NSBundle *bundle = [ NSBundle mainBundle ];

NSString *filePath = [ bundle pathForResource:@"CFG" ofType:@"plist" ];

filePath打印出来的执行地址应该类似

Support/iPhone Simulator/5.0/Applications/3B5DBF75-18D2-43EA-B26F-7FEDECAFDC92/Test.app/CFG.plist

每 个应用程序都一个固定且唯一的ID(上面的3B5DBF75-18D2-43EA-B26F-7FEDECAFDC92),这个ID被作为iOS执行时的 一个用来修饰的文件夹,这样可以保证每个应用都是独立的,哪怕名字一样。而这个ID文件夹下有一系列实际存在的文件夹。而Test.app只是其中一个, 里面有实际的游戏数据。如果要想保存数据,那么应该将数据写入到一个叫做“Documents”的文件夹下。访问路径的代码如下:

 NSArray *doc = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docPath = [ doc objectAtIndex:0 ];

执行结果是 Support/iPhone Simulator/5.0/Applications/3B5DBF75-18D2-43EA-B26F-7FEDECAFDC92/Documents

可以看到系统文件名ID和上面的一样。

 

综 上所述。当有数据为只读的时候,应该放到app应用里的plist里,当数据要做修改,应该放到documents里。比如游戏里的物品数据,这种不能被 修改的放到app里,而玩家的合成装备应该在documents里手动创建一个plist来存储。那么首要问题就是要判断,documents里是否已有 数据。

NSArray *doc = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *docPath = [ doc objectAtIndex:0 ];

if( [[NSFileManager defaultManager] fileExistsAtPath:[docPathstringByAppendingPathComponent:@"Score.plist"] ]==NO ) {

   // ============================== 写入plist初始化数据(最后有,先说读取)

}

 

读取:

NSArray *doc = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *docPath = [ doc objectAtIndex:0 ]; // 字典集合。  

NSDictionary *dic = [ NSDictionary dictionaryWithContentsOfFile:[docPathstringByAppendingPathComponent:@"Score.plist"] ]; // 解析数据

NSString *content = [ dic objectForKey:@"Score" ];

NSArray *array = [ content componentsSeparatedByString:@","];

content里就是“Score”里所存储的数据,array是将content里的数据按“,”拆分,仅将两个“,”之间的数据保存。

 

写入:一定要注意,必须创建一个新的NSMutableDictionary

// 用来覆盖原始数据的新dic

NSMutableDictionary *newDic = [ [ NSMutableDictionary alloc ] init ];

// 新数据

NSString *newScore = @"100,200,300";

// 将新的dic里的“Score”项里的数据写为“newScore”

[ newDic setValue:newScore forKey:@"Score" ];

// 将 newDic 保存至docPath+“Score.plist”文件里,也就是覆盖原来的文件

NSArray *doc = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *docPath = [ doc objectAtIndex:0 ];

[ newDic writeToFile:[docPath stringByAppendingPathComponent:@"Score.plist"] atomically:YES ];

本文转自编程小翁博客园博客,原文链接:http://www.cnblogs.com/wengzilin/archive/2012/03/29/2422866.html,如需转载请自行联系原作者

你可能感兴趣的文章
深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法(转)
查看>>
jQuery常用方法
查看>>
经典算法
查看>>
11 用户交互,显示省市县三级联动的选择
查看>>
sql语句的优化分析
查看>>
运维面试题五十题
查看>>
雷神编码博客入口
查看>>
7.微软AJAX的解决方案
查看>>
线程中断、线程让步、线程睡眠、线程合并
查看>>
当通过Struts2传值给后台时,如果是外键,传字符串那么会出现错误
查看>>
主流浏览器
查看>>
String类replaceAll方法正则替换深入分析
查看>>
快速排序
查看>>
极限编程和JUnit
查看>>
iOS中 SDWebImage手动清除缓存的方法 技术分享
查看>>
[Array]448. Find All Numbers Disappeared in an Array
查看>>
因为我想在博客园长呆,所以给博客园提一些改进建议
查看>>
hdu 1087 Super Jumping! Jumping! Jumping! (DP)
查看>>
struts和struts2的区别
查看>>
JavaScript 自执行函数剖析
查看>>