从 Documents 目录存储和读取文件 iOS 5

Posted

技术标签:

【中文标题】从 Documents 目录存储和读取文件 iOS 5【英文标题】:Storing and reading files from Documents directory iOS 5 【发布时间】:2012-04-18 02:24:35 【问题描述】:

在我的游戏中,当一个关卡完成时,应用程序会在应用程序的 Documents 目录中的文件中存储一个“1”。当游戏加载时,玩家只有在上一个关卡已经完成的情况下才能玩一个关卡。当我通过 Xcode 在设备上测试游戏时,应用程序可以正常工作,并且在完成上一个关卡之前无法玩关卡。但是,当应用程序获得批准并在 App Store 上发布时,应用程序的行为就像每个级别都已完成(没有锁定级别)。我无法弄清楚这一点,并希望有人的帮助!我正在测试的设备都是 iO 5.0 或更高版本。

以下是将完成的关卡保存在 Documents 目录中的代码:

 NSMutableData* data = [[NSMutableData alloc] init];
        NSKeyedArchiver* coder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        NSString *levelString = [NSString stringWithFormat:@"Level%d",level];
        [coder encodeInteger:1 forKey:levelString];
        [coder finishEncoding];
        NSString *levelString2 = [NSString stringWithFormat:@"Level%d.save",level];
        ///
        NSFileManager *filemgr;
        NSString *dataFile;
        NSString *docsDir;
        NSArray *dirPaths;

        filemgr = [NSFileManager defaultManager];

        // Identify the documents directory
        dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        docsDir = [dirPaths objectAtIndex:0];

        // Build the path to the data file
        dataFile = [docsDir stringByAppendingPathComponent:levelString2];

        // Check if the file already exists
        if ([filemgr fileExistsAtPath: dataFile])
        
            [[NSFileManager defaultManager] removeItemAtPath:dataFile error:nil];
        
        [data writeToFile:dataFile atomically:YES];
        [coder release];
        [data release];
    
    @catch (NSException* ex) 
    
        CCLOG(@"level save failed: %@", ex);
    

下面是读取Document目录看关卡是否完成的代码:

if ([self loadCompletedLevels:6] == 1)  //// level gets unlocked **** 

-(int) loadCompletedLevels:(int)theLevel; 

int isLevelCompleted;  //1 = completed

NSString* kSaveFile = [NSString stringWithFormat:@"Level%d.save",theLevel];
NSString *levelString = [NSString stringWithFormat:@"Level%d",theLevel];

@try


    NSFileManager *filemgr;
    NSString *dataFile;
    NSString *docsDir;
    NSArray *dirPaths;

    filemgr = [NSFileManager defaultManager];

    // Identify the documents directory
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    docsDir = [dirPaths objectAtIndex:0];

    // Build the path to the data file
    dataFile = [docsDir stringByAppendingPathComponent:kSaveFile];


    if ([[NSFileManager defaultManager] fileExistsAtPath:dataFile])
    
        NSData* data = [[NSData alloc] initWithContentsOfFile:dataFile];

        if (data && [data length] > 0)
        
            NSKeyedUnarchiver* decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
            isLevelCompleted = [decoder decodeIntForKey:levelString];

            [decoder release];
        

        [data release];
    
    if (isLevelCompleted == 1) 
        levelCompleted = YES;

    

@catch (NSException* ex) 


    levelCompleted = NO;

return isLevelCompleted; 

【问题讨论】:

【参考方案1】:

您可能应该使用不同的方法来存储数据,但真正的问题是您没有初始化返回值 isLevelCompleted。它在堆栈上,没有默认值。它从堆栈位置发生的任何事情开始。

所以,如果你不设置它,它将有一个任意值。

此外,您可能应该使用 BOOL 作为布尔值,但如果您这样做:

int isLevelCompleted = 0;  //1 = completed

您会将其初始化为“false”,因此您的代码必须将其显式更改为“true”。

【讨论】:

好点,但似乎还有更多内容......当创建 int isLevelCompleted 时,它可能有垃圾,但它总是等于“1”的机会有多大。我将听从您的建议并更改为布尔值

以上是关于从 Documents 目录存储和读取文件 iOS 5的主要内容,如果未能解决你的问题,请参考以下文章

React Native iOS 从应用程序 Documents 文件夹中读取图像

IOS沙盒Files目录说明和常用操作

从 Documents 目录在 UIWebview 中打开时,ios-css 和 js 无法在 html 文件中链接

iOS 高效地从 Documents Dir 中解析大型 JSON

iOS - 从 Documents 目录中的 bundle 加载 xib

在 iOS 13 中从外部存储读取文件