# IGP.UnitySDK.Compliance

IGP Unity SDK 的实名认证和防沉迷功能合规模块。

当前模块暴露实名认证和防沉迷功能事件与读取入口。认证入口由主包 `IGPRuntimeManager.CreateAntiAddictionRealNameWebSessionAsync()` 获取，游戏负责用自己的 WebView 打开页面并处理完成回调。

## 安装

先安装主包：

```text
adapters/unity/Runtime/IGP.UnitySDK/package.json
```

再安装本模块：

```text
adapters/unity/Runtime/IGP.UnitySDK.Compliance/package.json
```

## 最小接入

```csharp
using IGP.UnitySDK;
using IGP.UnitySDK.Compliance;

public sealed class ComplianceDriver
{
    private IGPRuntimeManager runtimeManager;

    public async void Refresh()
    {
        var antiAddictionEvent =
            await IGPCompliance.RefreshAntiAddictionEventAsync(runtimeManager);
        var ageRange =
            await IGPCompliance.RefreshAntiAddictionAgeRangeAsync(runtimeManager);
        var remainingTime =
            await IGPCompliance.RefreshAntiAddictionRemainingTimeAsync(runtimeManager);

        if (antiAddictionEvent.action == IGPAntiAddictionComplianceActions.Block)
        {
            // 游戏自行处理限制进入、退出、切账号或提示。
        }
    }

    public async void OpenVerification()
    {
        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();
        await RefreshAfterVerification();
    }

    private async System.Threading.Tasks.Task RefreshAfterVerification()
    {
        var antiAddictionEvent =
            await IGPCompliance.RefreshAntiAddictionEventAsync(runtimeManager);
        // 根据最新状态放行、提示或返回主菜单。
    }

    private void OpenGameWebView(string url) {}
    private void CloseGameWebView() {}
}
```

监听运行过程中的变化：

```csharp
var subscription = IGPCompliance.SubscribeAntiAddictionEvents(
    runtimeManager,
    antiAddictionEvent =>
    {
        // 游戏自行处理事件。
    });
```

不用时调用：

```csharp
subscription.Dispose();
```

## 当前范围

- 提供稳定事件码。
- 提供当前事件读取入口。
- 提供状态变化监听入口。
- 提供年龄段读取入口，返回未知、0、8、16、18。
- 提供剩余可玩时长读取入口，返回秒和分钟。
- 网络或服务异常默认转换为不允许进入，提示为「网络或服务异常」。
- 支持获取游戏内 IGP 登录与实名认证入口；用户未登录时会先在 WebView 内登录，未实名时继续填写实名信息。
- 不在 SDK 内实现弹窗或流程决策。
