0

我正在设计一个应用程序,它使用网络服务,如发布链接和图片。第一个视图控制器检查用户的默认用户名和密码,如果正确,则允许用户登录主视图控制器,但如果不正确,则将用户定向到登录视图控制器(如果是第一次应用程序正在运行它还会将用户定向到登录视图控制器)。

我有不同的视图控制器连接到主视图控制器。例如,其中一个用于将图片发布到网站,另一个用于将链接发布到网络,另一个视图控制器用于更改用户配置文件的偏好。

我正在使用 RestKit API 在网络上发布,这是我用于发布的代码:

- (IBAction)addLinkPressed:(UIButton *)sender {

        [RKClient clientWithBaseURLString:@"http://MyWebsite.com"];

        NSDictionary* params = [NSDictionary dictionaryWithObjectsAndKeys:
                                self.linkField.text, @"url",
                                self.linkTitleField.text, @"title",
                                self.linkSummaryField.text, @"summary",
                                nil];

        RKRequest *request = [[RKClient sharedClient] post:@"/send_link.php" params:params delegate:self];
        [request setUserData:@"sendLink"];   
}

对于每个视图控制器,我使用以下方法viewDidLoad来获得发布身份验证:

- (void)autoLogin {

    [RKClient clientWithBaseURLString:@"http://MyWebsite.com"];    
    [RKObjectManager sharedManager].client=[RKClient sharedClient];
    RKParams *parameters = [RKParams params];

    [parameters setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"defaultUsername"] forParam:@"username"];
    [parameters setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"defaultPassword"] forParam:@"password"];

    [[RKClient sharedClient] setAuthenticationType:RKRequestAuthenticationTypeHTTP];

    RKRequest *request = [[RKClient sharedClient] post:@"/login.php" params:parameters delegate:self];
    [request setUserData:@"login"];
}

问题:除了为每个视图控制器登录之外,还有什么方法可以从网站获得发布的身份验证?登录每个视图控制器的问题是,有时记录过程会出错并且不允许用户 POST。我需要一种方法,只要用户输入正确的用户名和密码,它就会一直保持登录状态,直到用户自己注销或删除应用程序。

我发现了这个相对的问题,但它没有那么有帮助,或者我没有很好地理解答案。任何想法或想法将不胜感激。

4

2 回答 2

0

RestKit 旨在使用 API。通常 API 是无状态的,这意味着请求之间没有状态之类的东西。在传统网站上,状态是通过在客户端和服务器之间来回传输 cookie 来实现的。显然 RestKit 不处理 cookie(我认为这很好)。从我的脑海中,我可以想到两个解决方案:

  • 显然 RestKit 不会自动处理 cookie。因此,您可以在登录后获取 cookie 并将其附加到每个后续请求。
  • 更好:使用 OAuth2,它基本上是用户在登录时收到的令牌。然后此令牌作为参数附加到每个请求。

两种方法基本相同。您必须发送一个标识用户已登录的令牌。

于 2012-09-21T23:50:45.727 回答
0

如果我很了解您的情况,那么您有许多单独和独立运行的视图控制器。这样做,您需要与您的应用管理的视图控制器数量一样多的登录。

如果这是您的场景,您可以尝试创建一个单独的类来完成登录工作并使用您的其他视图控制器来处理 GUI。

这将是您的架构:

应用其他类和视图控制器 -> LOGINMANAGER -> viewcontroller 1(图片),viewcontroller 2(链接),viewcontroller 3(首选项),viewcontroller 4(随便)...

于 2012-09-21T23:37:46.813 回答