plist涉及到沙盒的一个问题
来源:互联网 发布:路由器访客网络连不上 编辑:程序博客网 时间:2024/04/28 01:12
plist涉及到沙盒的一个问题
保存玩家数据,模拟器读写都可以,而真机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 ];
- plist涉及到沙盒的一个问题
- plist涉及到沙盒的一个问题
- discuz涉及到的问题
- 涉及到url修改的问题
- oracle创建视图中涉及到另外一个用户的表权限不足问题
- CCArray,plist的使用问题
- info.plist 的相关问题
- SqlParameter使用(涉及到SQL的注入问题)
- 凡问题涉及到相关部门的部长
- 程序中涉及到时间的相关问题
- 运算符涉及到的数据类型转换问题
- 结构体指针涉及到的问题
- 涉及到的map按value排序问题
- JSP中涉及到的编码问题
- 涉及到android遇到的一些问题整理
- 安装双系统涉及到GPU方面的问题
- 今天有同学提了一个很有意思的问题, 涉及到曲线坐标, 我没做出来...
- [sql server] 问题总结17---一个项目涉及到的50个Sql语句(爱新觉罗.毓华整理版)
- android拍照压缩及添加水印3
- Centos6.0下多个JDK安装部署
- LinkedHashMap和HashMap的比较使用
- 双指针不带头结点的链栈的实现(C语言)
- spring之IOC
- plist涉及到沙盒的一个问题
- 来自《Hadoop权威指南》第二版 - Hello Hadoop!云计算开发环境搭建
- 如果你对异常还有疑问,请看这里。
- sqlserver存储过程中利用游标遍历结果集简单示例及查询数据库时间
- java中的反射问题 .
- android动画
- 使用正则匹配字符串的子串
- 几种JavaScript图形和图表绘制工具体验
- APR安装部署提高Tomcat性能