登录

业务场景

调用该接口会向用户展示登录弹框,由用户进行登录操作,用户登录完成后由 sdk 通过回调的方式把对应的结果返回给研发。

注意事项

  • 登录接口不能频繁调用,否则会返回重复登录、正在登录等的错误信息
  • 需要在初始化成功后调用
  • 服务端登录验签的实现,请查看登录验签

流程图

接口介绍

/**
 * 登录接口
 */
- (void)login;

调用示例


// 监听登录回调通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onLoginSuccess:) name:NOTIFICATION_LOGIN_SUCCESS object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onLoginFailed:) name:NOTIFICATION_LOGIN_FAILED object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onLoginCancel:) name:NOTIFICATION_LOGIN_CANCEL object:nil];

// 调用登录接口
[SDKManager.getInstance login];

// 监听
- (void)onLoginSuccess:(NSNotification *)notif
{
    NSDictionary *userData = notif.userInfo;
    NSString *openId = [userData objectForKey:KEY_OPENID];                 // SDK账号对外唯一标识
    long timestamp = [[userData objectForKey:KEY_TIMES_TAMP] longLongValue]; // 登录时间戳
    NSString *sign = [userData objectForKey:KEY_SIGN];                     // 服务端登录验签的签名信息
    NSString *token = [userData objectForKey:KEY_TOKEN];                   // 服务端登录验签的Token
    NSString *areaId = [userData objectForKey:KEY_AREAID];                 // 游戏大区Id
    BOOL isAuth = [[userData objectForKey:KEY_ISAUTH] boolValue];          // 是否实名认证
    NSString *birthday = [userData objectForKey:KEY_BIRTHDAY];             // 用户的生日
    NSInteger gender = [[userData objectForKey:KEY_GENDER] integerValue];  // 用户的性别
    NSString *regCoCode = [userData objectForKey:KEY_REGCOCODE];             // 注册国家码
    NSString *rGameArea = [userData objectForKey:KEY_RGAMEAREA];             // 注册地区
    NSString *loginCoCode = [userData objectForKey:KEY_LOGINCOCODE];             // 登录国家码
    NSString *lGameArea = [userData objectForKey:KEY_LGAMEAREA];             // 登录地区
    UserInfo *userInfo = (UserInfo *)[userData objectForKey:KEY_USER_INFO];// 默认返回nil对象,无需处理该类型

  	if (userInfo != nil) {
      	// 使用前,需先进行非空判断,防止调用异常
        NSString *channelUid = userInfo.channelUid;
        NSString *avatarUrl = userInfo.avatarUrl;
        NSString *avatarUrlBig = userInfo.avatarUrlBig;
        NSString *nickName = userInfo.nickName;
        BOOL isAuthoriza = userInfo.isAuthoriza;
        NSInteger playerLevel = userInfo.playerLevel;
        NSString *shareId = userInfo.shareId;
        NSString *sharePosition = userInfo.sharePosition;
        NSString *shareServerId = userInfo.shareServerId;
        NSString *shareRoleId = userInfo.shareRoleId;
        NSInteger userType = userInfo.userType;
        NSInteger visitBackStatus = userInfo.visitBackStatus;
        NSString *phoneNum = userInfo.phoneNum;
        BOOL bandPhoneFlag = userInfo.bandPhoneFlag;
        NSString *location = userInfo.location;
    }
//    登录成功
//    游戏侧使用用户登录信息(userData)来走一次游戏侧的账号登录流程
}

- (void)onLoginFailed:(NSNotification *)notif
{
    NSDictionary *errorInfo = notif.userInfo;
    NSInteger errorCode = [[errorInfo objectForKey:KEY_ERROR_CODE] integerValue];
    NSString *errorMsg = [errorInfo objectForKey:KEY_ERROR_MSG];
    [self textViewLog:[NSString stringWithFormat:@"登录失败: %@(%ld)", errorMsg, errorCode]];
//    登录失败,errorInfo返回了失败的原因
//    游戏侧需要弹窗提示失败原因,并停留在游戏的登录界面,让用户能够重新点击登录按钮,重新拉起SDK的登录界面
}

- (void)onLoginCancel:(NSNotification *)notif
{
    NSLog(@"%@: 取消登录", @"Demo");
//    取消登录
//    游戏侧需要停留在游戏的登录界面,让用户能够重新点击登录按钮,重新拉起SDK的登录界面
}

参数说明

【出参】

UserData

参数名称类型说明
openIdStringSDK 用户唯一标识 (最长 50 个字符)
tokenString服务端登录验签的 Token
timestamplong登录时间戳 (毫秒)
signString服务端登录验签的签名信息,具体请查看登录验签
areaIdString游戏大区 Id
isAuthboolean用户是否实名的标识
birthdayString用户的生日,格式:yyyyMMdd
genderint性别:0(未知)、1(女性)、2(男性)
userInfoUserInfo返回空对象,无需处理该对象

UserInfo:

参数名称类型说明
channelUidNSString渠道的 openid,一定会有
avatarUrlNSString用户头像 ,没有数据则为空
avatarUrlBigNSString用户头像-高清大图,没有数据则为空
nickNameNSString用户昵称,没有数据则为空
isAuthorizaBOOL用户是否做了登录授权的标识
playerLevelBOOL渠道用户等级,获取不到渠道数据的时候为 0
shareIdNSString分享者分享的 id
sharePositionNSString分享图位置
shareServerIdNSString分享者所在的区服 ID
shareRoleIdNSString分享者的角色 ID
userTypeNSInteger用户类型,1:新用户,0:老用户
visitBackStatusNSInteger抖音复访任务状态 1=完成 0=未完成字段名称有改变**
phoneNumNSString用户手机号码,没有数据则为空
bandPhoneFlagBOOL是否绑定过手机
locationNSString地址,没有数据则为空

string areaId:大区 ID 说明

areaId 的返回值形式包括: areaId="1_1", areaId="1_1,2_1", areaId="1_1,2_1$1":

格式格式说明
2_1用户只可以看到 2 区 1 服及其以后的服务器列表并可以进入。
3_7用户只可以看到 3 区的 7 服 及其以后的服务器列表并可以进入。3 区 1~6 服看不到。
1_4,3_6用户在游戏登录服务器选择界面可以看到 1 区 4 服及其以后的服列表(包含 4 服本身),和 3 区的 6 服及其以后的服务器列表,且都可以进入。 其中 1 区 1-3 服不显示,3 区 1-5 服不显示。
2_1,3_1$22 区和 3 区进行合并,该用户显示 2 区区名,并能看到 2 区和 3 区的所有服务器列表。
2_1,3_7$32 区和 3 区进行合并,该用户显示 3 区区名,并能看到 2 区 1 服及其以后的服,和 3 区 7 服及其以后的所有服务器列表。但看不到 3 区 1-6 服。

注意:areaId = 0 或 areaId=0_0 都是错误找不到区服。具体的 areaId 对应的游戏服务器列表由运营提供。

区服对应关系内部了解区名编号
益玩安卓专区一区
IOS 专区二区
益玩安卓用户及 IOS 用户都可见此区服务器列表三区
应用宝专区四区
安卓其他渠道专区五区

错误码

错误码说明
-100000网络不可用,请检查网络
-100022请先初始化成功后再调登录

FAQ

Q: SDK 登录时验签不一致

A: 请先使用在线验签工具自行查验一遍,如下图 image.png

Q: 登录验签使用哪一个 key?

A: 登录验签使用的是 appKey 而非 signKey