【问题标题】:user credential persistence in iPhoneiPhone 中的用户凭证持久性
【发布时间】:2009-12-25 10:10:27
【问题描述】:

由于我是 iPhone 编程的新手,我想做这样的事情:在我的应用程序的主屏幕中,我询问用户名和密码,并授权用户使用这些信息调用 .net 网络服务。在这个主屏幕中,有一个开关控制器“记住我”,以便应用程序在用户下次运行应用程序时记住用户。我的问题是: 1. 如何在 iPhone 中调用 .net 网络服务? 2. 我怎样才能保留这些用户名和密码信息(如网络应用程序中的cookie),这样用户就不会被要求提供凭据信息? 我真的很感激,谢谢。

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    保留用户凭据

    如果您要存储用户名和密码,则应使用钥匙串。在 iPhone 上使用 Keychain 类似于在 Mac 上使用 Keychain。

    使用钥匙串导入“Security/Security.h”。

    Apple 在其文档中提供了一个示例here,用于添加和检索用户名和密码。示例方法

        - (void)mySetObject:(id)inObject forKey:(id)key;
        - (id)myObjectForKey:(id)key;
        - (void)resetKeychainItem;
    

    将使您能够在几乎不修改示例代码的情况下持久保存和检索您的用户凭据。

    调用需要身份验证的网络服务

    根据您的身份验证方案,您可以

    • 使用@987654322@在URL中直接提供用户名和密码作为参数
    • 如果您的网络服务使用“基本身份验证”方案,请在您的 @987654324@ 委托中提供 @987654323@ 方法

    【讨论】:

      【解决方案2】:
      1. 您使用 nsmutableurlrequest 生成 Web 服务请求
      2. 使用 nsuserdefaults 保存用户名和密码

      这是第一个例子:

      -(void)sendUpdate {
      
          User *user = [User sharedManager];
      
          NSData *parkedLocation = [[NSString stringWithFormat:@"<location><latitude>%f</latitude><longitude>%f</longitude><userid>%@</userid><udid>%@</udid></location>", 
                                     coordinate.latitude, coordinate.longitude, userid, user.udid] dataUsingEncoding:NSASCIIStringEncoding];
          //NSLog("parkedlocation = %@", parkedLocation);
          NSString *URLstr = LOCATIONS_URL;
          if (controller.put_url) 
              URLstr = controller.put_url;
          NSURL *theURL = [NSURL URLWithString:URLstr];
          //NSURLRequest *theRequest = [NSURLRequest requestWithURL:theURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];
          NSLog(@"IN SEND UPDATE put_url = %@", controller.put_url);
      
          NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];
          if (controller.put_url) {
              [theRequest setHTTPMethod:@"PUT"];
          } else {
              [theRequest setHTTPMethod:@"POST"];
          }
          [theRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-type"];
          [theRequest setHTTPBody:parkedLocation];
      
          [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:TRUE];
      
          NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
      
          if (!theConnection) {
              NSLog(@"COuldn't get a connection to the iParkNow! server");
          }
      }
      

      第二个例子:

       [[NSUserDefaults standardUserDefaults] setObject:self.userName.text forKey:@"Username"];
              [[NSUserDefaults standardUserDefaults] setObject:self.password.text forKey:@"Password"];
      

      【讨论】:

      • 我建议使用钥匙串来存储用户凭据,在另一条评论中有指向示例的链接。
      【解决方案3】:

      您有两个选择:用户偏好或核心数据。两者都有能力 - Core Data 可能有点矫枉过正。

      【讨论】:

        【解决方案4】:

        NSURLRequest 可用于检索 URL,例如您的身份验证服务。 NsUserDefaults 可用于在应用调用之间保存设置。

        注意:查看 ennukiller 的精彩示例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-25
          • 1970-01-01
          • 1970-01-01
          • 2011-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-12
          相关资源
          最近更新 更多