【问题标题】:what is the best way for saving username and High Score保存用户名和高分的最佳方法是什么
【发布时间】:2011-07-23 20:11:25
【问题描述】:

在我的应用程序中,我需要保存一个双精度值(高分)和字符串(玩家姓名)我应该使用什么来获得这个。

任何想法都会很棒。

谢谢

【问题讨论】:

    标签: iphone objective-c save storage nsuserdefaults


    【解决方案1】:

    正如 deanWombourne 所说,您可以使用 NSUserDefaults 来存储这些数据,但它不是很安全。如果您不想“在空中”存储这些数据,可以查看 Buzz Andersen 的 SFHFKeychainUtils 将它们存储在 iPhone 钥匙串中。

    首先,将 SFHFKeychainUtils 文件复制到您的项目中。单击 SFHFKeychainUtils.m 并单击获取信息。转到目标选项卡并检查目标附近的框是否已选中。如果没有,请检查它。按住 Control 键单击您的框架文件夹并选择添加现有框架。找到 Security.framework 并将其添加到您的项目中。通过对 SFHFKeychainUtils.m 执行相同的过程来检查该框架是否已添加到您的目标中。现在打开您要使用此代码的位置的实现文件,并在顶部添加#import "SFHFKeychainUtils.h"

    这是一个关于如何使用这段代码的小例子:

    
    // to store your data  
    NSError *error = nil;  
    [SFHFKeychainUtils storeUsername:kName andPassword:name forServiceName:kStoredName updateExisting:YES error:&error];  
    [SFHFKeychainUtils storeUsername:kScore andPassword:score forServiceName:kStoredScore updateExisting:YES error:&error];  
    
    // to get them back  
    NSString *name = [SFHFKeychainUtils getPasswordForUsername:kName andServiceName:kScoredName error:&error];  
    double score = [SFHFKeychainUtils getPasswordForUsername:kScore andServiceName:kScoredScore error:&error];  
    
    // kName, kScore, kStoredName, kStoredScore are defined key but you can use also strings with @"your string here".
    // It is important that when you store and get back a value, username and serviceName must be the same.

    【讨论】:

    • 问题是当我分配分数(双值)时发生了无与伦比的错误
    • 在存储分数之前尝试将双精度转换为字符串,当您想要将其取回时再次将其转换为双精度...
    • 多次出现这些错误 +[SFHFKeychainUtils storeUsername:andPassword:forServiceName:updateExisting:error:] in SFHFKeychainUtils.o _kSecClassGenericPassword$non_lazy_ptr in SFHFKeychainUtils.o
    • 不,不是字符串!将其转换为 NSNumber 对象 - [NSNumber numberWithDouble:score] 并使用 doubleValue 取回值:)
    • @Bobj-C 您是否使用 #import "SFHFKeychainUtils.h" 导入了顶部的文件?您是否在项目中添加了 SFHFKeychainUtils.h 和 .m?
    【解决方案2】:

    如果这就是你要保存的全部,那么NSUserDefaults 应该没问题

    // To store
    [[NSUserDefaults standardUserDefaults] setObject:name forKey:@"name"];
    [[NSUserDefaults standardUserDefaults] setDouble:score forKey:@"score"];
    
    // To read back in
    NSString *name = [[NSUserDefaults standardUserDefualts] objectForKey:@"name"];
    double score = [[NSUserDefaults standardUserDefaults] doubleForKey:@"score"];
    // Don't forget that your name is autoreleased - if you want to keep it, set it to a retained
    // property or retain it yourself :)
    

    【讨论】:

    • 您好,感谢您的回答,但是如果用户有越狱的 iphone,他可以访问 com.domainname.app.plist 并将他的分数更改为他想要的任何值。我可以在 .plist 中隐藏键值吗
    • 啊,你从来没有说过安全 :) 这种方式最简单,但如果你想要安全,请改用@Matthew's answer :)
    • 钥匙串不会保护用户的数据。虽然访问钥匙串数据肯定比首选项 plist 需要更多的工作,但它只是为了保护用户的数据免受其他人(即不知道用户密码的人)的影响。您不妨使用 NSUserDefaults 并使用存储在应用程序代码中的密钥加密值。
    • 哦,我还以为图书馆也会做加密。哦,好吧,每天都是上学日!
    猜你喜欢
    • 2019-09-12
    • 2023-03-13
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多