请记住,用户已登录-在iOS应用程序中,我将在何处保存此类信息?
假设用户登录到我的应用程序中的某个服务。我如何“记住”用户这样做,这样就不会再提示他/她这样做了 例如,每次应用程序启动时,如果用户登录,我希望它对用户帐户执行某些操作,否则,请不要执行任何操作。用户可以从一个可选的登录窗口登录。一旦他们登录,我想(至少在概念上)设置一个变量,这样我就可以像请记住,用户已登录-在iOS应用程序中,我将在何处保存此类信息?,ios,objective-c,ios5,ios6,Ios,Objective C,Ios5,Ios6,假设用户登录到我的应用程序中的某个服务。我如何“记住”用户这样做,这样就不会再提示他/她这样做了 例如,每次应用程序启动时,如果用户登录,我希望它对用户帐户执行某些操作,否则,请不要执行任何操作。用户可以从一个可选的登录窗口登录。一旦他们登录,我想(至少在概念上)设置一个变量,这样我就可以像if(userIsLoggedIn){…}那样做 这是你的房间吗?核心数据 [[NSUserDefaults standardUserDefaults] setObject:@YES forKey:@"isL
if(userIsLoggedIn){…}
那样做
这是你的房间吗?核心数据
[[NSUserDefaults standardUserDefaults] setObject:@YES forKey:@"isLoggedIn"];
有效注释:您也可以使用相同结果的setBool:forKey
。在此分配之后立即调用synchronize
,也不会有任何伤害(尽管这可能并不重要)
有效注释:您还可以使用具有相同结果的
setBool:forKey
。在此分配之后立即调用synchronize
,也不会有任何伤害(尽管这可能并不重要) 您可以轻松地将其存储在NSUserDefault中
// init
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// set the default value
[defaults setObject:@"YES" forKey:@"loggedIn"];
// read value
NSString *loggedIn = [defaults objectForKey:@"loggedIn"]
更新:
设置为BOOL:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"loggedIn"];
读取值:
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"loggedIn"]) {
// go to login screen
} else {
// go to main screen
}
您可以轻松地将其存储在nsserdefaults中
// init
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// set the default value
[defaults setObject:@"YES" forKey:@"loggedIn"];
// read value
NSString *loggedIn = [defaults objectForKey:@"loggedIn"]
更新:
设置为BOOL:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"loggedIn"];
读取值:
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"loggedIn"]) {
// go to login screen
} else {
// go to main screen
}
核心数据实际上不适合这样的小而独特的数据块
NSUserDefaults是处理此类小事情的合适场所,但如果这些小事情被认为是机密的——比如登录详细信息——那么钥匙链就更好了 核心数据实际上不适合这样的小而独特的数据块
NSUserDefaults是类似这样的小事情的正确位置,但是如果那些小东西应该是秘密的,比如登录细节,那么密钥链就更好了 如果您使用登录凭据,NSUserDefaults会使您的应用程序面临安全风险 我建议使用NSKeyedArchiver 这个网站对如何实现它有一个非常简单的解释 苹果API文档仅供将来参考。
如果您使用登录凭据,NSUserDefaults会使您的应用程序面临安全风险 我建议使用NSKeyedArchiver 这个网站对如何实现它有一个非常简单的解释 苹果API文档仅供将来参考。
正如其他答案所指出的那样,如果您存储的是简单的非私有状态,NSUserDefaults非常有用 我通常喜欢用一个类别来总结这一点,这样我可以更容易地与用户默认值交互,而不必担心键等问题 一个类似于此类别的示例 NSUserDefaults+pasauthorization.h
@interface NSUserDefaults (PASAuthorisation)
@property (nonatomic, assign, getter=pas_isLoggedIn) BOOL pas_loggedIn;
@end
#import "NSUserDefaults+PASAuthorisation.h"
static NSString * const PASLogginInKey = @"PASLogginInKey";
@implementation NSUserDefaults (PASAuthorisation)
- (BOOL)pas_isLoggedIn;
{
return [self boolForKey:PASLogginInKey];
}
- (void)setPas_loggedIn:(BOOL)pas_loggedIn;
{
[self setBool:pas_loggedIn forKey:PASLogginInKey];
}
@end
NSUserDefaults+pasauthorization.m
@interface NSUserDefaults (PASAuthorisation)
@property (nonatomic, assign, getter=pas_isLoggedIn) BOOL pas_loggedIn;
@end
#import "NSUserDefaults+PASAuthorisation.h"
static NSString * const PASLogginInKey = @"PASLogginInKey";
@implementation NSUserDefaults (PASAuthorisation)
- (BOOL)pas_isLoggedIn;
{
return [self boolForKey:PASLogginInKey];
}
- (void)setPas_loggedIn:(BOOL)pas_loggedIn;
{
[self setBool:pas_loggedIn forKey:PASLogginInKey];
}
@end
正如其他答案所指出的那样,
NSUserDefaults
在存储简单的非私有状态时非常有用
我通常喜欢用一个类别来总结这一点,这样我可以更容易地与用户默认值交互,而不必担心键等问题
一个示例将类似于此类别
NSUserDefaults+pasauthorization.h
@interface NSUserDefaults (PASAuthorisation)
@property (nonatomic, assign, getter=pas_isLoggedIn) BOOL pas_loggedIn;
@end
#import "NSUserDefaults+PASAuthorisation.h"
static NSString * const PASLogginInKey = @"PASLogginInKey";
@implementation NSUserDefaults (PASAuthorisation)
- (BOOL)pas_isLoggedIn;
{
return [self boolForKey:PASLogginInKey];
}
- (void)setPas_loggedIn:(BOOL)pas_loggedIn;
{
[self setBool:pas_loggedIn forKey:PASLogginInKey];
}
@end
NSUserDefaults+pasauthorization.m
@interface NSUserDefaults (PASAuthorisation)
@property (nonatomic, assign, getter=pas_isLoggedIn) BOOL pas_loggedIn;
@end
#import "NSUserDefaults+PASAuthorisation.h"
static NSString * const PASLogginInKey = @"PASLogginInKey";
@implementation NSUserDefaults (PASAuthorisation)
- (BOOL)pas_isLoggedIn;
{
return [self boolForKey:PASLogginInKey];
}
- (void)setPas_loggedIn:(BOOL)pas_loggedIn;
{
[self setBool:pas_loggedIn forKey:PASLogginInKey];
}
@end
那么,一旦他们登录,就再也不用登录了?(只要应用处于活动状态)?我已经通过该服务的SDK实现了这一点,因此我正在寻找一种方法让该应用知道用户已经登录,因此不显示提示,只有在用户登录后才使用该服务获取。因此,一旦他们登录,就不必再次登录?(只要应用处于活动状态)?我已经通过服务的SDK实现了这一点,因此我正在寻找一种方法让应用知道用户已经登录,因此不显示提示,只在用户登录时使用服务获取。之后我是否必须调用synchronize?您应该:synchronize:“将对持久域的任何修改写入磁盘,并将所有未修改的持久域更新为磁盘上的内容。“对于这个特定的问题,我将使用setBool
nsserdefaults
在后台自动同步。如果您需要确保它立即持续,例如当应用程序处于后台时设置了某些内容,则只需调用synchronize
。之后是否必须调用synchronize?您应该:synchronize:“将对持久域的任何修改写入磁盘,并将所有未修改的持久域更新为磁盘上的内容。”对于这个特定的问题,我将使用setBoolNSUserDefaults
在后台自动同步。如果您需要确保它立即持续,例如如果您设置了某个应用程序作为后台,则只需调用synchronize
。谢谢Eugen,非常有用。为什么要使用字符串?现在,您必须使用isEqualToString:
来了解设置是什么……使用NSUserDefaults,您还可以设置布尔值,因此您不需要使用字符串->查看我的UpdateAnks Eugen,非常有用。为什么是字符串?现在,您必须使用IsequalString:
来了解设置是什么……使用NSUserDefaults,您还可以设置一个布尔值,因此您不需要使用字符串->查看我的更新