请记住,用户已登录-在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:“将对持久域的任何修改写入磁盘,并将所有未修改的持久域更新为磁盘上的内容。”对于这个特定的问题,我将使用setBool
NSUserDefaults
在后台自动同步。如果您需要确保它立即持续,例如如果您设置了某个应用程序作为后台,则只需调用
synchronize
。谢谢Eugen,非常有用。为什么要使用字符串?现在,您必须使用
isEqualToString:
来了解设置是什么……使用NSUserDefaults,您还可以设置布尔值,因此您不需要使用字符串->查看我的UpdateAnks Eugen,非常有用。为什么是字符串?现在,您必须使用
IsequalString:
来了解设置是什么……使用NSUserDefaults,您还可以设置一个布尔值,因此您不需要使用字符串->查看我的更新