Discuz iOS应用开发 (bigApp iOS源码分析 - 用户登录流程)

用户登录流程


Discuz iOS应用开发 (bigApp iOS源码分析 - 用户登录流程)_第1张图片
登录页面.png

点击登录按钮,最终调用的Http请求为

- (void)request_Login_WithUserName:(NSString *)username andPassWord:(NSString *)password andFid:(NSString *)fid andQuestionid:(NSString *)questionid andAnswer:(NSString *)answer andBlock:(void (^)(UserModel *data, NSError *error,NSString *message))block
{
    NSDictionary *dic = @{@"version":@"1",@"module":@"login",@"loginsubmit":@"yes",@"infloat":@"yes",@"lssubmit":@"yes",@"inajax":@"1",@"fastloginfield":@"username",@"username":username,@"password":password,@"cookietime":@"259200000",@"quickforward":@"yes",@"handlekey":@"ls",@"questionid":avoidNullStr(questionid),@"answer":avoidNullStr(answer)};
    
    [[ClanNetAPI sharedJsonClient] requestJsonDataWithPath:_kurl_base_path withParams:dic withMethodType:Get andBlock:^(id data, NSError *error)
     {
         if (error) {
             block(nil,error,nil);
         }else{
             id resultData = [data valueForKeyPath:@"Variables"];
             DLog(@"%@",data);
             if ([resultData objectForKey:@"auth"] && ![[resultData objectForKey:@"auth"] isEqual:[NSNull null]]) {
                 [ClanNetAPI saveCookieData];
                 [[NSUserDefaults standardUserDefaults] setObject:username forKey:@"kLASTUSERNAME"];
                 UserModel *user = [UserModel currentUserInfo];
                 [user setValueWithObject:[UserModel objectWithKeyValues:data[@"data"]]];
                 //设置登录成功
                 user.logined = YES;
                 [UserModel saveToLocal];
                 if (fid) {
                     [self request_checkPostWithFid:fid];
                 }
                 block(user, nil,nil);
             }else{
                 NSDictionary *errMes = data[@"Message"];
                 NSString *messStr = @"密码错误,请重试";
                 if (errMes) {
                     messStr = errMes[@"messagestr"];
                 }
                 //密码错误
                 block(nil,nil,messStr);
             }
         }
     }];
}
  • basePath: api/mobile/iyz_index.php
  • Params:
    NSDictionary *dic = @{
                          @"version":@"1",
                          @"module":@"login",
                          @"loginsubmit":@"yes",
                          @"infloat":@"yes",
                          @"lssubmit":@"yes",
                          @"inajax":@"1",
                          @"fastloginfield":@"username",
                          @"username":username,
                          @"password":password,
                          @"cookietime":@"259200000",
                          @"quickforward":@"yes",
                          @"handlekey":@"ls",@"questionid":avoidNullStr(questionid),
                          @"answer":avoidNullStr(answer)
                          };

在plugin/bigapp/api/1中可以找到定义的login.php模块,最终调用的登录函数为:

$result = userlogin($userName, $password, $questionid, $answer, 'username', $_G['clientip']);

我们可以在source/function/function_member.php中找到对应的函数原型。(有可能不对?)
暂时不清楚这两个文件是如何关联的。

  • returnValue:
 {
    Message =     {
        messagestr = "\U767b\U5f55\U6210\U529f";
        messageval = "login_succeed";
    };
    Variables =     {
        auth = "in order to be comapatible";
    };
    data =     {
        accessmasks = 0;
        adminid = 0;
        allowadmincp = 0;
        avatarstatus = 0;
        conisbind = 0;
        email = "[email protected]";
        emailstatus = 0;
        extgroupids = "";
        freeze = 0;
        groupexpiry = 0;
        groupid = 10;
        newpm = 0;
        newprompt = 0;
        notifysound = 0;
        onlyacceptfriendpm = 0;
        regdate = 1495353072;
        status = 0;
        timeoffset = 9999;
        uid = 2;
        username = Test;
        videophotostatus = 0;
    };
    "error_code" = 0;
    "error_msg" = "\U767b\U5f55\U6210\U529f";
}

data是返回的用户信息,来自主用户表


Discuz iOS应用开发 (bigApp iOS源码分析 - 用户登录流程)_第2张图片
Discuz主用户表.png

用户如果保存在iOS应用本地

             if ([resultData objectForKey:@"auth"] && ![[resultData objectForKey:@"auth"] isEqual:[NSNull null]]) {
                 [ClanNetAPI saveCookieData];
                 [[NSUserDefaults standardUserDefaults] setObject:username forKey:@"kLASTUSERNAME"];
                 UserModel *user = [UserModel currentUserInfo];
                 [user setValueWithObject:[UserModel objectWithKeyValues:data[@"data"]]];
                 //设置登录成功
                 user.logined = YES;
                 [UserModel saveToLocal];
                 if (fid) {
                     [self request_checkPostWithFid:fid];
                 }
                 block(user, nil,nil);
             }

可以看到的是,如果用户登录成功,所做的步骤:

  • 保存cookies到NSUserDefaults的Code_CookieData键值
    NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject: cookiesData forKey: Code_CookieData];
    [defaults synchronize];
  • 保存用户名到NSUserDefaults的@"kLASTUSERNAME"键值
  • 将data的内容更新到单例UserModel中,并设置登录状态为YES,最后保存单例的内容。(保存到NSUserDefaults的kKEY_CURRENT_USER键值)
  • 验证发帖权限 (Todo,low priority?)

再次打开APP时,用户会直接登录:
直接读取了单例UserModel的内容以及NSUserDefaults的Code_CookieData键值中保存的Cookies

用户退出登录:

- (void)logout
{
    [ShareSDK cancelAuthorize:SSDKPlatformTypeSinaWeibo];
    [ShareSDK cancelAuthorize:SSDKPlatformTypeWechat];
    [ClanNetAPI removeCookieData];
    UserModel *user = [UserModel new];
    NSArray *properties = [UserModel propertiesForClass:[user class]];
    for (NSString *property in properties) {
        id value = [user valueForKey:property];
        SEL sel = NSSelectorFromString(property);
        if ([self respondsToSelector:sel]) {
            [self setValue:value forKey:property];
        }
    }
    [UserModel saveToLocal];
    [UserModel currentUserInfo].logined = NO;
    [UserModel saveToLocal];
    //清除信息
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:0] forKey:@"KNEWS_MESSAGE"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"KNEWS_MESSAGE_COME" object:nil];
    [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"KNEWS_FRIEND_MESSAGE"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"KNEWS_FRIEND_MESSAGE" object:nil];
    [[NSUserDefaults standardUserDefaults] setObject:nil forKey:ClanFormhash];
}
  • 移除QQ,微信的认证
  • 删除NSUserDefaults的Code_CookieData键值中保存的Cookies
  • 重置UserModel,并设置为退出登录状态
  • 移除其他信息 (Todo)

工时:

  1. 0.5 day

你可能感兴趣的:(Discuz iOS应用开发 (bigApp iOS源码分析 - 用户登录流程))