zoukankan      html  css  js  c++  java
  • 【转】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 ];

  • 相关阅读:
    lufylegendRPG游戏引擎 Yorhom's Game Box
    讨论交流 Yorhom's Game Box
    货币之间的大小写转换
    Unreal3的D3D渲染器部分
    Linxu宿主目录
    用于主题检测的临时日志(b25e234297d442ccba394dd2241308d2 3bfe001a32de4114a6b44005b770f6d7)
    Linux命令 文件命名规则 基础
    C#_GDI_文章粗略整合
    由IDisposable接口导致的using使用 以及using的其他用法
    ADO.NET基础备忘1_SqlConnection SqlCommand SqlDataReader
  • 原文地址:https://www.cnblogs.com/wengzilin/p/2422866.html
Copyright © 2011-2022 走看看