Skip to content

onGetLegacyUserIdentity:dataJson

获取旧版用户身份标识

该方法用于新版本游戏包获取原APP用户身份标识。主要用途是:新版本游戏启动时,原APP用户登录成功后,游戏需要获取原APP用户身份标识,用于后续游戏数据同步。


方法声明

objectivec
/**
 * 当 SDK 请求获取旧版用户身份标识(Legacy User Identity)时触发。
 * 通常用于兼容旧版本系统或迁移存量用户数据。
 *
 * @param stateHandle 用于向 SDK 返回处理结果的状态句柄。
 * @param dataJson 包含请求参数(如当前用户 ID)或上下文信息的 JSON 字符串。
 */
- (void)onGetLegacyUserIdentity:(id<SUDOPStateHandle>)stateHandle dataJson:(NSString*)dataJson;

运行行为

  • 追溯触发:游戏引擎在初始化或同步云端存档时,若检测到需要映射旧版账号,会发起此调用。
  • 数据透传dataJson 字段中包含了游戏侧提供的上下文(例如:游戏内部定义的旧账号索引或特定的迁移标记)。
  • 异步决策:App 接收到请求后,可以进行异步查询(如访问 App Server 换取 Legacy ID),完成后通过 stateHandle 闭环。
  • 结果回传:App 需返回包含 legacyUserId 的 JSON 字符串。如果该用户没有旧版标识,通常返回当前 userId 或空 JSON。

代码示例 (Objective-C)

实现旧版 ID 的查询与回传:

objectivec
- (void)onGetLegacyUserIdentity:(id<SUDOPStateHandle>)stateHandle dataJson:(NSString*)dataJson {
    // 1. 解析请求参数
    NSData *requestData = [dataJson dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *requestDict = [NSJSONSerialization JSONObjectWithData:requestData options:0 error:nil];
    NSString *currentUserId = requestDict[@"userId"];

    // 2. 模拟从 App 业务层获取该用户对应的旧版 ID
    // 可能是 MD5 后的设备标识或旧系统的自增 ID
    NSString *legacyId = [MyUserCenter getLegacyIdForUser:currentUserId];

    // 3. 构造符合协议要求的返回结果
    NSDictionary *result = @{
        @"legacyUserId": legacyId ?: @""
    };

    // 4. 转为 JSON 并回传
    NSData *resultData = [NSJSONSerialization dataWithJSONObject:result options:0 error:nil];
    NSString *resultJson = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
    
    [stateHandle success:resultJson];
}

注意事项

  • 非阻塞要求:虽然 iOS 提供了强大的多线程能力,但请避免在该回调中执行同步的网络请求或耗时的数据库操作,推荐使用异步任务。
  • 返回值规范:如果业务上不需要区分新旧 ID,建议直接回传当前的 userId,以确保游戏逻辑能够继续执行。
  • stateHandle 闭环:必须确保调用 [stateHandle success:][stateHandle fail:]。如果方法执行完毕未给出明确反馈,SDK 内部可能会判定为请求超时,导致游戏流程卡死。