【转】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 ];

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

相关文章
|
1月前
|
存储 程序员 Python
你的隐私堪忧!彻底清空磁盘,只需要1行Python代码
你的隐私堪忧!彻底清空磁盘,只需要1行Python代码
你的隐私堪忧!彻底清空磁盘,只需要1行Python代码
|
4月前
|
安全 Windows
8.2 Windows驱动开发:内核解锁与强删文件
在某些时候我们的系统中会出现一些无法被正常删除的文件,如果想要强制删除则需要在驱动层面对其进行解锁后才可删掉,而所谓的解锁其实就是释放掉文件描述符(句柄表)占用,文件解锁的核心原理是通过调用`ObSetHandleAttributes`函数将特定句柄设置为可关闭状态,然后在调用`ZwClose`将其文件关闭,强制删除则是通过`ObReferenceObjectByHandle`在对象上提供相应的权限后直接调用`ZwDeleteFile`将其删除。
38 0
8.2 Windows驱动开发:内核解锁与强删文件
|
10月前
|
存储 安全 Java
代码审计——目录遍历详解
代码审计——目录遍历详解
154 0
|
10月前
|
存储 数据可视化 BI
【滴水逆向P77】加载进程(PE查看器)应用程序源码解析(上)
【滴水逆向P77】加载进程(PE查看器)应用程序源码解析
|
10月前
|
API 索引 Windows
【滴水逆向P77】加载进程(PE查看器)应用程序源码解析(下)
【滴水逆向P77】加载进程(PE查看器)应用程序源码解析
[开发小技巧] Cocos2dx应用程序的命令行参数workdir:重定向工作目录
[开发小技巧] Cocos2dx应用程序的命令行参数workdir:重定向工作目录
67 0
|
JSON 小程序 前端开发
微信小程序--》组成结构 文件作用 宿主环境
⚓经过web前端开发的学习,相信大家对于前端开发有了一定深入的了解,今天我开设了微信小程序,主要想从移动端开发方向进一步发展,而对于我来说写移动端博文的第一站就是小程序开发,希望看到我文章的朋友能对你有所帮助。
158 0
 微信小程序--》组成结构 文件作用 宿主环境
|
存储 Unix
【操纵系统】文件目录
【操纵系统】文件目录
119 0
|
存储
访问沙盒外文档UIDocumentPickerViewController
官方文档解析 官方文档:https://developer.apple.com/documentation/uikit/uidocumentpickerviewcontroller?language=objc UIDocumentPickerViewController有四种模式: Import an external document:用户选择一个外部文档,文档选择器拷贝该文档到应用沙盒,不会修改源文档。
4861 0