在带有 AFnetworking 的 iOS 应用程序上使用 cookie

Posted

技术标签:

【中文标题】在带有 AFnetworking 的 iOS 应用程序上使用 cookie【英文标题】:Using cookies on iOS application with AFnetworking 【发布时间】:2013-06-15 02:55:28 【问题描述】:

我正在构建一个与 php Web 服务对话的 ios 应用程序。 Web 服务还为 Web 应用程序提供服务。因此,有一个使用用户名和密码的简单注册和登录功能,在 Web 应用程序端,当您登录时,您可以选择单击记住我,它会存储一个持续 1 年的 cookie,因此您不必登录在您每次访问该页面时。

现在,进入 iOS 部分。用户第一次打开需要输入凭据的应用程序时,这会向 Web 服务发送一个 post 调用,因为它和 iOS 应用程序假定单击了记住我,因此它返回 cookie 以避免再次询问凭据.

我了解到有些人将 cookie 保存在用户默认值上,并在每次启动应用程序时恢复它们。但是我已经测试了几次,显然这个cookie被神奇地保存了,没有我写任何代码,我什至关掉手机启动应用程序,网络服务仍然记得我。

那么,我必须保存 cookie 吗?有必要吗 ?我应该提高安全性吗?如果是这样怎么办?

【问题讨论】:

你还想知道什么...? 没有别的了@VivekSehrawat 谢谢你的帮助! 【参考方案1】:

NSUserdefaults 中没有这样的魔法可以保存数据,我可以告诉你如何做到这一点。首先,您必须获取一个 bool,如果您单击了 remember me 按钮,它可以存储该信息。如果用户点击了它,则 check bool 为真,当用户登录时,它将检查 bool,如果为真,则它将数据保存在 NSUerdefault 中。

每当应用程序启动时,它首先会检查 NSUserdefault 中的布尔值是否为真,如果为真,它将访问服务并登录,它也不会导航到登录屏幕。您可以根据您的要求更多地修改以下代码

-(IBAction)remember
    check=TRUE;

-(IBAction)Login

    if (check) 
        NSLog(check ? @"True" : @"False");

        NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
        [defaults setBool:TRUE forKey:@"data"];
        [defaults setObject:emailStr forKey:@"email"];
        [defaults setObject:passStr forKey:@"pass"];
        [defaults synchronize];
        NSLog(@"Data saved");
    
//write here code for sending the request for login 


In Appdelegate write this 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    if(![[NSUserDefaults standardUserDefaults] boolForKey:@"data"])
    
        [self displayLogin];
     else
    
        [self displayMainScreen];
    
       [self.window makeKeyAndVisible];
    return YES;

-(void)displayLogin
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    UINavigationController *navigation=[[UINavigationController alloc]initWithRootViewController:self.viewController];
    self.window.rootViewController = navigation;

-(void)displayMainScreen

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    NSString *emailStr = [defaults objectForKey:@"email"];
    NSString *passStr = [defaults objectForKey:@"pass"];
//write here code for sending the request for login 

【讨论】:

【参考方案2】:

正如您所观察到的,cookie 是为您存储的,并且“通常”会遵守从服务器返回的指定 cookie 政策和时间安排。虽然它不是 100% 可靠的,在某些情况下,cookie 可能会在设定的日期之前被删除(可能不会经常发生)。如果您乐于承担用户有时可能不得不重新登录的“风险”,那么您无需做任何事情。如果您想确定管理,那么您应该使用NSHTTPCookieStorage 获取cookie,将它们存储在其他地方(如NSUserDefaults)并稍后恢复它们。

【讨论】:

以上是关于在带有 AFnetworking 的 iOS 应用程序上使用 cookie的主要内容,如果未能解决你的问题,请参考以下文章

带有 XMLParser 的 AFNetworking HTTPClient 子类

iOS,AFNetworking - 带有 JSON 响应的“清除”NSSTring [关闭]

带有 AFNetworking 的 iOS POST:NSLocalizedDescription=请求失败:内部服务器错误 (500)

iOS 从带有 JSON 参数的 AFNetworking HTTP POST 方法获取 JSON 响应

AFNetworking : 上传带有其他参数的图片

使用 AFNetworking 在 iOS 8 中登录时解析服务器提供未经授权的 (401)