【问题标题】:iOS: store authentication data permanently on the deviceiOS:将身份验证数据永久存储在设备上
【发布时间】:2012-08-12 00:40:25
【问题描述】:

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

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

我不确定这是否是 iphone app 登录过程的正确方式?

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

【问题讨论】:

    标签: ios wcf login


    【解决方案1】:

    听起来像是 NSUserDefaults 的完美之选。像这样使用它们:

    NSUserDefaults *myUserDefaults = [NSUserDefaults standardUserDefaults];
    [myUserDefaults setObject: @"the key" forKey: @"key"];
    

    您还可以使用其他功能来设置不同类型的数据,例如setInteger:forKey:setValue:forKey:。要调用您的数据,请使用此函数:

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

    并且返回值将是您存储在其中的对象。其他数据类型与 integerForKey:valueForKey: 等函数类似。

    【讨论】:

    • 这正是我的应用所需要的。不幸的是,我进入并使用核心数据创建了一个自定义解决方案。 TODO:迁移现有代码以使用 NSUserDefaults。
    • 感谢 WolfLink,正是我需要的 :)
    【解决方案2】:

    你应该知道你必须尊重你的应用程序的沙盒,这意味着你不能在设备上“永久”存储一些东西。

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

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

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

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud setObject:@"mylongtoken" forKey:@"com.myapp.apitoken"];
    [ud synchronize];
    

    如果您删除应用,这些数据也会消失。当应用程序通过 App Store 更新时,这些数据会保留下来,并将作为设备备份的一部分备​​份到 iTunes/iCloud。

    您也可以将此属性列表与 iCloud 同步,但请查看此帖子:Can I use iCloud to sync the NSUserDefaults plist file

    【讨论】:

    • 感谢丹尼尔的回复。永久我的意思是当用户关闭或重新启动他们的设备时维护该数据,因此他们下次使用该应用程序时不需要再次登录。如果用户选择删除应用程序,我同意完全删除该数据。
    【解决方案3】:

    实际上,如果您要存储凭据,您可能应该将其放入钥匙串中。 NSUserDefaults 可以很容易地从设备上加载并以明文形式保存。

    这是一个不错的钥匙串实用程序库,应该会有所帮助: https://github.com/ldandersen/STUtils/tree/master/Security

    您可以像这样保存凭据:

    [STKeychain storeUsername:@"username" andPassword:@"password" forServiceName:@"namespace" updateExisting:YES error:&error];
    

    然后像这样检索它们:

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

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2012-09-24
      • 1970-01-01
      • 2018-08-03
      • 2023-03-06
      • 1970-01-01
      • 2017-01-14
      • 2020-10-22
      • 1970-01-01
      相关资源
      最近更新 更多