SPLoginViewController记住凭据

时间:2012-07-13 15:58:14

标签: spotify cocoalibspotify-2.0

在CocoaLibSpotify中,如何让SPLoginViewController存储凭据,以便用户以后可以通过[[SPSession sharedSession] attemptLoginWithStoredCredentials:]自动登录?

2 个答案:

答案 0 :(得分:10)

你没有。

相反,实现SPSessionDelegate方法-session:didGenerateLoginCredentials:forUserName:并将凭据存储在NSUserDefaults或其他任何内容中(给定的凭据已经加密并且可以安全地以明文形式存储)。

下次启动您的应用时,如果您有可用的凭据,请完全跳过SPLoginViewController并使用SPSession的{​​{1}}方法登录。如果这会产生登录错​​误,则令牌已失效,您需要让用户再次登录 - 如果用户在生成令牌后更改了密码,则可能会失效。

请注意,attemptLoginWithUserName:existingCredential:rememberCredentials:参数和旧rememberCredentials:方式现在被视为已弃用,并且很快就会消失。

答案 1 :(得分:4)

之前的答案也不再相关,因为attemptLoginWithUserName:existingCredential:rememberCredentials:方法不再存在(尽管它仍然在SPSession.h的注释中引用)

进行设置:

  1. 从github获取最新的cocoalibspotify并在Xcode中构建它: https://github.com/spotify/cocoalibspotify
  2. 构建并放入您的项目:
  3. 如果以前没有登录,则自动登录或提示用户身份验证:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSMutableDictionary *storedCredentials = [defaults valueForKey:@"SpotifyUsers"];
    
    if (storedCredentials == nil)
        [self performSelector:@selector(showLogin) withObject:nil afterDelay:0.0];
    else
    {
        NSString *u = [storedCredentials objectForKey:@"LastUser"] ;
        [[SPSession sharedSession] attemptLoginWithUserName:u existingCredential:[storedCredentials objectForKey:u]];
    }
    

    登录时存储凭据的回调方法:

    -(void)session:(SPSession *)aSession didGenerateLoginCredentials:(NSString *)credential forUserName:(NSString *)userName
    {
        NSLog(@"stored credentials");
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSMutableDictionary *storedCredentials = [[defaults valueForKey:@"SpotifyUsers"] mutableCopy];
    
        if (storedCredentials == nil)
            storedCredentials = [NSMutableDictionary dictionary];
    
        [storedCredentials setValue:credential forKey:userName];
        [storedCredentials setValue:userName forKey:@"LastUser"];
        [defaults setValue:storedCredentials forKey:@"SpotifyUsers"];
        [defaults synchronize];
    }