登录
业务场景
调用该接口会向用户展示登录弹框,由用户进行登录操作,用户登录完成后由 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
参数名称 | 类型 | 说明 |
---|---|---|
openId | String | SDK 用户唯一标识 (最长 50 个字符) |
token | String | 服务端登录验签的 Token |
timestamp | long | 登录时间戳 (毫秒) |
sign | String | 服务端登录验签的签名信息,具体请查看登录验签 |
areaId | String | 游戏大区 Id |
isAuth | boolean | 用户是否实名的标识 |
birthday | String | 用户的生日,格式:yyyyMMdd |
gender | int | 性别:0(未知)、1(女性)、2(男性) |
userInfo | UserInfo | 返回空对象,无需处理该对象 |
UserInfo:
参数名称 | 类型 | 说明 |
---|---|---|
channelUid | NSString | 渠道的 openid,一定会有 |
avatarUrl | NSString | 用户头像 ,没有数据则为空 |
avatarUrlBig | NSString | 用户头像-高清大图,没有数据则为空 |
nickName | NSString | 用户昵称,没有数据则为空 |
isAuthoriza | BOOL | 用户是否做了登录授权的标识 |
playerLevel | BOOL | 渠道用户等级,获取不到渠道数据的时候为 0 |
shareId | NSString | 分享者分享的 id |
sharePosition | NSString | 分享图位置 |
shareServerId | NSString | 分享者所在的区服 ID |
shareRoleId | NSString | 分享者的角色 ID |
userType | NSInteger | 用户类型,1:新用户,0:老用户 |
visitBackStatus | NSInteger | 抖音复访任务状态 1=完成 0=未完成字段名称有改变** |
phoneNum | NSString | 用户手机号码,没有数据则为空 |
bandPhoneFlag | BOOL | 是否绑定过手机 |
location | NSString | 地址,没有数据则为空 |
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$2 | 2 区和 3 区进行合并,该用户显示 2 区区名,并能看到 2 区和 3 区的所有服务器列表。 |
2_1,3_7$3 | 2 区和 3 区进行合并,该用户显示 3 区区名,并能看到 2 区 1 服及其以后的服,和 3 区 7 服及其以后的所有服务器列表。但看不到 3 区 1-6 服。 |
注意:areaId = 0 或 areaId=0_0 都是错误找不到区服。具体的 areaId 对应的游戏服务器列表由运营提供。
区服对应关系 | 内部了解区名编号 |
---|---|
益玩安卓专区 | 一区 |
IOS 专区 | 二区 |
益玩安卓用户及 IOS 用户都可见此区服务器列表 | 三区 |
应用宝专区 | 四区 |
安卓其他渠道专区 | 五区 |
错误码
错误码 | 说明 |
---|---|
-100000 | 网络不可用,请检查网络 |
-100022 | 请先初始化成功后再调登录 |
FAQ
Q: SDK 登录时验签不一致
A: 请先使用在线验签工具自行查验一遍,如下图
Q: 登录验签使用哪一个 key?
A: 登录验签使用的是 appKey 而非 signKey