Skip to content

darren-you/getui_auth

Repository files navigation

getui_auth

个推一键认证 Flutter 插件,基于 Pigeon 实现。

功能特性

  • ✅ 初始化 SDK
  • ✅ 预登录
  • ✅ 一键登录
  • ✅ 获取 SDK 版本
  • ✅ 支持 iOS 和 Android

安装

pubspec.yaml 中添加依赖:

dependencies:
  getui_auth:
    path: ../getui_auth

配置

Android 配置

  1. 确保项目使用 Java 17 或更高版本(插件已配置为 Java 17)

  2. android/app/build.gradle 中配置 APPID:

android {
    defaultConfig {
        manifestPlaceholders = [
            GETUI_APPID: "你的 APPID",
            GT_INSTALL_CHANNEL: "渠道名称"
        ]
    }
}

注意:插件已经在自己的 settings.gradle 中配置了个推的 Maven 仓库,主工程不需要手动添加。

iOS 配置

ios/Podfile 中确保最低版本为 iOS 13.0:

platform :ios, '13.0'

注意:插件已在 podspec 中配置 static_framework = true,自动使用静态链接,无需手动修改 Podfile

使用方法

1. 初始化

import 'package:getui_auth/getui_auth.dart';

// 在 App 启动时初始化
await GetuiAuth.init(
  appId: 'YOUR_APP_ID',
  debug: true, // 调试模式
);

2. 预登录

在需要一键登录之前,建议提前进行预登录,以提高用户体验:

try {
  final preLoginInfo = await GetuiAuth.preLogin(timeout: 8000);
  print('预登录成功');
  print('手机号: ${preLoginInfo.number}');
  print('运营商: ${preLoginInfo.operatorName}');
  print('隐私协议: ${preLoginInfo.privacyName}');
} catch (e) {
  print('预登录失败: $e');
}

3. 检查预登录是否有效

final isValid = await GetuiAuth.isPreLoginResultValid();
if (isValid) {
  print('预登录结果有效');
} else {
  print('预登录结果已失效,需要重新预登录');
}

4. 一键登录

try {
  final loginInfo = await GetuiAuth.login(timeout: 5000);
  print('登录成功');
  print('GYUID: ${loginInfo.gyuid}');
  print('Token: ${loginInfo.token}');
  print('过期时间: ${loginInfo.expiredTime}');
  
  // 将 token 发送到服务器进行号码验证
  // verifyToken(loginInfo.token);
} catch (e) {
  print('登录失败: $e');
}

5. 获取 SDK 版本

final version = await GetuiAuth.getVersion();
print('SDK 版本: $version');

完整示例

import 'package:flutter/material.dart';
import 'package:getui_auth/getui_auth.dart';

class LoginPage extends StatefulWidget {
  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  String _status = '未初始化';
  PreLoginInfo? _preLoginInfo;

  @override
  void initState() {
    super.initState();
    _initSDK();
  }

  Future<void> _initSDK() async {
    try {
      await GetuiAuth.init(
        appId: 'YOUR_APP_ID',
        debug: true,
      );
      setState(() {
        _status = '初始化成功';
      });
      
      // 初始化后立即进行预登录
      _preLogin();
    } catch (e) {
      setState(() {
        _status = '初始化失败: $e';
      });
    }
  }

  Future<void> _preLogin() async {
    try {
      final info = await GetuiAuth.preLogin(timeout: 8000);
      setState(() {
        _preLoginInfo = info;
        _status = '预登录成功';
      });
    } catch (e) {
      setState(() {
        _status = '预登录失败: $e';
      });
    }
  }

  Future<void> _login() async {
    // 检查预登录是否有效
    final isValid = await GetuiAuth.isPreLoginResultValid();
    if (!isValid) {
      // 如果预登录失效,先进行预登录
      await _preLogin();
    }

    try {
      final loginInfo = await GetuiAuth.login(timeout: 5000);
      setState(() {
        _status = '登录成功: ${loginInfo.token}';
      });
      
      // TODO: 将 token 发送到服务器进行验证
    } catch (e) {
      setState(() {
        _status = '登录失败: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('个推一键登录')),
      body: Padding(
        padding: EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Text('状态: $_status'),
            SizedBox(height: 20),
            if (_preLoginInfo != null) ...[
              Text('手机号: ${_preLoginInfo!.number}'),
              Text('运营商: ${_preLoginInfo!.operatorName}'),
              Text('隐私协议: ${_preLoginInfo!.privacyName}'),
              SizedBox(height: 20),
            ],
            ElevatedButton(
              onPressed: _preLogin,
              child: Text('预登录'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: _login,
              child: Text('一键登录'),
            ),
          ],
        ),
      ),
    );
  }
}

API 参考

GetuiAuth

方法 说明 参数 返回值
init 初始化 SDK appId: 应用ID
debug: 是否开启调试模式
Future<void>
preLogin 预登录 timeout: 超时时间(毫秒),默认 8000 Future<PreLoginInfo>
isPreLoginResultValid 检查预登录是否有效 Future<bool>
login 一键登录 timeout: 超时时间(毫秒),默认 5000 Future<LoginInfo>
getVersion 获取 SDK 版本 Future<String>

PreLoginInfo

字段 类型 说明
number String 手机号码(带掩码)
privacyName String 运营商隐私协议名称
privacyUrl String 运营商隐私协议 URL
operatorType String 运营商类型(CM/CU/CT 或 1/2/3)
expiredTime int 过期时间(时间戳)
operatorName String 运营商名称(扩展属性)

LoginInfo

字段 类型 说明
gyuid String 个验用户唯一标识
token String 登录凭证,需发送到服务器验证
expiredTime int Token 过期时间(时间戳)

注意事项

  1. 隐私政策:在调用 init 方法之前,必须确保用户已同意隐私政策
  2. 预登录时机:建议在 App 启动时或登录页面加载时提前预登录
  3. 预登录有效期
    • 移动/电信:1小时
    • 联通:30分钟
  4. 授权页规范:如果需要自定义授权页,必须包含以下必要元素:
    • 号码栏
    • 品牌露出
    • 登录按钮
    • 隐私确认
    • 隐私标题

常见问题

Android 编译错误

如果遇到编译错误,请检查:

  1. APPID 配置:确保在 android/app/build.gradle 中正确配置了 APPID
  2. Java 版本:确保使用 Java 17 或更高版本
  3. 最小 SDK 版本:确保 minSdk >= 19
  4. 依赖冲突:如果项目中集成了其他个推 SDK,确保版本兼容

注意:插件已自动配置个推 Maven 仓库,无需在主工程中手动添加

iOS 编译错误

1. 静态链接错误(已解决)

插件已在 podspec 中配置 static_framework = true,自动解决了 GYSDK 静态框架的兼容性问题,无需手动配置。

如果仍然遇到静态链接相关错误,请:

  1. 确保使用最新版本的插件
  2. 清理缓存后重新安装:
    cd ios
    rm -rf Pods Podfile.lock
    pod install

2. 其他常见问题

如果遇到其他编译错误,请检查:

  1. iOS 版本:确保 iOS 版本为 13.0 或以上
  2. Podfile 配置:确保正确配置了静态链接
  3. 清理缓存
    cd ios
    rm -rf Pods Podfile.lock
    pod install
  4. XCode 版本:建议使用 XCode 15 或更高版本

许可证

MIT

相关链接

About

个推一键认证 Flutter 插件,基于 Pigeon 实现

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors