iOS:在设备上永久存储身份验证数据

iOS:在设备上永久存储身份验证数据,ios,wcf,login,Ios,Wcf,Login,我是一名.Net开发人员,对Xcode非常陌生。我正在使用WCF进行服务器端处理,并在iphone应用程序和WCF之间发送/接收JSON数据。我希望本机iPhone应用程序执行以下操作: 注册和登录视图 用户单击“登录”按钮后,它将以JSON格式输入的用户名和密码发送到我的WCF服务进行身份验证,如果登录有效,WCF将返回有效的成员GUID和令牌字符串 iPhone应用程序接收成员guid和令牌,并将它们存储在“持久变量”中,我将为经过身份验证的用户加载新视图。因此,成员可以访问所有函数/视图

我是一名.Net开发人员,对Xcode非常陌生。我正在使用WCF进行服务器端处理,并在iphone应用程序和WCF之间发送/接收JSON数据。我希望本机iPhone应用程序执行以下操作:

  • 注册和登录视图
  • 用户单击“登录”按钮后,它将以JSON格式输入的用户名和密码发送到我的WCF服务进行身份验证,如果登录有效,WCF将返回有效的成员GUID和令牌字符串
  • iPhone应用程序接收成员guid和令牌,并将它们存储在“持久变量”中,我将为经过身份验证的用户加载新视图。因此,成员可以访问所有函数/视图
  • 每次我在iphone应用程序和WCF之间发布数据时,我都需要使用变量中的成员guid和令牌,以便WCF服务知道哪个成员正在请求数据
  • 每次用户关机或重启iphone时,我希望我的应用程序能够记住成员guid,这样他们就不必再次登录
  • 用户可以单击注销按钮,它将清除变量并返回到登录视图
  • 我不确定这是否是iphone应用程序登录过程的正确方式


    我已经完成了WCF身份验证并发回了JSON,但现在我需要存储成员GUID,有人能告诉我正确的方向吗?我应该用什么来存储那些以后可以使用的信息?举个例子就好了

    听起来像是一件完美的事情。像这样使用它们:

    NSUserDefaults *myUserDefaults = [NSUserDefaults standardUserDefaults];
    [myUserDefaults setObject: @"the key" forKey: @"key"];
    
    您还可以使用其他函数设置不同类型的数据,如
    setInteger:forKey:
    setValue:forKey:
    。要调用数据,请使用此功能:

    NSString *theKey = [myUserDefaults objectForKey:@"key"];
    

    返回值将是存储在其中的对象。其他数据类型与函数类似,如
    integerworkey:
    valueForKey:
    您应该知道,您必须尊重应用程序的沙箱,这意味着您不能在设备上“永久”存储某些内容

    通常,这种逻辑(保存令牌等)是通过将数据保存到
    NSUserDefaults
    中来完成的

    NSUserDefaults
    是应用程序的属性列表,您可以将数据存储为键值对

    例如,您可以通过执行以下操作来保存某些内容:

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud setObject:@"mylongtoken" forKey:@"com.myapp.apitoken"];
    [ud synchronize];
    
    如果删除该应用程序,此数据也将消失。当应用程序通过app Store更新时,此数据将被保留,并作为设备备份的一部分备份到iTunes/iCloud


    您也可以将此属性列表与iCloud同步,但为此,请查看此帖子:

    实际上,如果您正在存储凭据,您可能应该将其放入密钥链中。NSUserDefaults可以很容易地从设备上加载,并保存在clear中

    下面是一个很好的钥匙链实用程序库,应该会很有帮助:

    您可以按如下方式保存凭据:

    [STKeychain storeUsername:@"username" andPassword:@"password" forServiceName:@"namespace" updateExisting:YES error:&error];
    
    然后像这样检索它们:

    NSString *password = [STKeychain getPasswordForUsername:@"username" andServiceName:@"namespace" error:&error];
    

    这正是我的应用程序所需要的。不幸的是,我使用核心数据创建了一个定制解决方案。TODO:迁移现有代码以使用NSUserDefaults。感谢WolfLink,这正是我需要的:)感谢您的回复Daniel。我所说的永久性是指在用户关闭或重新启动设备时维护这段数据,这样他们下次使用应用程序时就不需要再次登录。如果用户选择删除应用程序,则应完全删除该数据,我同意。