实名认证与防沉迷
实名认证与防沉迷用于让游戏判断当前玩家是否可以继续游玩,以及是否需要根据平台返回状态执行限制、提示或退出。SDK 只提供状态,不代替游戏决定弹窗、存档、退出或切换账号流程。
IGP 支持两种处理方式:由平台在启动前拦截,或由游戏在游戏内处理登录与实名流程。希望用户不跳出游戏时,推荐使用“游戏内实名”方式:游戏调用 SDK 申请认证入口,在游戏内 WebView 打开;用户未登录时先完成 IGP 登录或注册,登录后如果尚未实名,页面会继续进入实名信息填写。游戏只承载 WebView 和处理回调,不接触用户身份凭证、姓名或身份证号。
- 启动拦截:适用于希望平台在游戏启动前完成实名与防沉迷判断的项目。在开发者后台选择该方式后,不符合条件的用户会在进入游戏前被拦截,游戏通常不需要主动打开实名 WebView。
- 游戏内实名:适用于希望用户留在游戏内完成登录、注册和实名的项目。游戏启动后读取状态;需要实名时调用 SDK 获取认证入口,在游戏内 WebView 打开;收到完成回调后刷新状态。
两种方式应在开发者后台按项目选择,不建议在同一版本中同时设计两套互相冲突的拦截流程。下方代码示例主要面向“游戏内实名”方式;如果项目选择“启动拦截”,游戏侧重点是正常启动后的状态读取和提示,不再自行拉起实名 WebView。
| 引擎 | 状态 | 说明 |
|---|---|---|
| Unity | Preview | 通过可选实名认证与防沉迷模块读取状态、监听变化,并处理游戏内实名流程。 |
| GameMaker | Preview | GameMaker Windows 版已提供当前状态、刷新和事件队列,适合配合启动拦截或状态展示。 |
| Godot | 暂不支持 | 当前 Godot 侧未提供实名认证与防沉迷入口。 |
- 已完成 启动与连接。
- 本机 IGP 桌面客户端可用。
- IGP 开发者后台已开启实名认证与防沉迷,并选择“启动拦截”或“游戏内实名”。
- Unity 项目需要额外安装
cn.indiegp.sdk.unity.compliance。 - 游戏需要自行处理不可玩状态,例如提示、返回主菜单或退出。
Unity 需要在主包外额外安装 cn.indiegp.sdk.unity.compliance。下面示例面向“游戏内实名”方式;如果项目选择“启动拦截”,通常只需要保留状态刷新和阻断提示逻辑。
using UnityEngine;using IGP.UnitySDK;using IGP.UnitySDK.Compliance;
public sealed class IGPComplianceDriver : MonoBehaviour{ [SerializeField] private IGPRuntimeManager runtimeManager; private System.IDisposable subscription;
private void OnEnable() { subscription = IGPCompliance.SubscribeAntiAddictionEvents( runtimeManager, HandleComplianceEvent); }
private void OnDisable() { subscription?.Dispose(); }
public async void Refresh() { var ev = await IGPCompliance.RefreshAntiAddictionEventAsync(runtimeManager); HandleComplianceEvent(ev); }
public async void OpenAccountVerification() { var webSession = await runtimeManager.CreateAntiAddictionRealNameWebSessionAsync(); OpenGameWebView(webSession.url); }
public async void OnWebViewNavigation(string url) { if (!url.StartsWith("igp://anti-addiction/real-name-complete")) { return; }
CloseGameWebView(); var ev = await IGPCompliance.RefreshAntiAddictionEventAsync(runtimeManager); HandleComplianceEvent(ev); }
private void HandleComplianceEvent(IGPAntiAddictionComplianceEvent ev) { if (ev.action == IGPAntiAddictionComplianceActions.Block) { // 根据 ev.reasonMessage 展示提示,或回到主菜单。 } }
private void OpenGameWebView(string url) {} private void CloseGameWebView() {}}GameMaker 侧可以读取本地最近状态,也可以主动刷新状态。当前 GameMaker 版尚未提供游戏内实名 WebView 入口,更适合配合“启动拦截”方式做状态读取和提示。
// Step 或按钮触发var status = igp_refresh_anti_addiction_status(global.igp_app_id);
if (!is_undefined(status) && !status.canPlayNow){ show_debug_message("IGP anti-addiction blocked: " + string(status.reasonMessage));}也可以从事件队列中接收状态变化。
var evt = igp_poll_event();while (!is_undefined(evt)){ if (evt.type == "anti_addiction_state_changed") { var status = evt.anti_addiction_status; show_debug_message("IGP anti-addiction: " + string(status.state)); }
evt = igp_poll_event();}Godot 当前暂不支持实名认证与防沉迷入口。
| 引擎 | 检查点 |
|---|---|
| Unity | 启动拦截方式下,不符合条件的用户不会进入游戏主流程;游戏内实名方式下,未实名时能在游戏内 WebView 打开认证入口,完成后刷新状态。 |
| GameMaker | 能读取 anti_addiction_status,刷新后能收到 anti_addiction_state_changed;如使用启动拦截方式,需要确认不符合条件的用户不会进入游戏主流程。 |
| Godot | 当前不做实名认证与防沉迷验收。 |
常见问题 / 排查
Section titled “常见问题 / 排查”- Unity 找不到
IGPCompliance:确认已安装实名认证与防沉迷模块包。 - 状态为空或保持默认值:先确认 IGP 桌面客户端是否连接成功。
- 用户不应跳出游戏:使用游戏内 WebView 打开 SDK 返回的
url,不要直接交给系统浏览器。 - 收到阻断状态:游戏应按返回原因处理,不要在 SDK 层硬编码放行逻辑。
- GameMaker 没有状态变化事件:确认调用了
igp_update()并轮询事件队列。