个推一键认证 Flutter 插件,基于 Pigeon 实现。
- ✅ 初始化 SDK
- ✅ 预登录
- ✅ 一键登录
- ✅ 获取 SDK 版本
- ✅ 支持 iOS 和 Android
在 pubspec.yaml 中添加依赖:
dependencies:
getui_auth:
path: ../getui_auth-
确保项目使用 Java 17 或更高版本(插件已配置为 Java 17)
-
在
android/app/build.gradle中配置 APPID:
android {
defaultConfig {
manifestPlaceholders = [
GETUI_APPID: "你的 APPID",
GT_INSTALL_CHANNEL: "渠道名称"
]
}
}注意:插件已经在自己的 settings.gradle 中配置了个推的 Maven 仓库,主工程不需要手动添加。
在 ios/Podfile 中确保最低版本为 iOS 13.0:
platform :ios, '13.0'注意:插件已在 podspec 中配置 static_framework = true,自动使用静态链接,无需手动修改 Podfile。
import 'package:getui_auth/getui_auth.dart';
// 在 App 启动时初始化
await GetuiAuth.init(
appId: 'YOUR_APP_ID',
debug: true, // 调试模式
);在需要一键登录之前,建议提前进行预登录,以提高用户体验:
try {
final preLoginInfo = await GetuiAuth.preLogin(timeout: 8000);
print('预登录成功');
print('手机号: ${preLoginInfo.number}');
print('运营商: ${preLoginInfo.operatorName}');
print('隐私协议: ${preLoginInfo.privacyName}');
} catch (e) {
print('预登录失败: $e');
}final isValid = await GetuiAuth.isPreLoginResultValid();
if (isValid) {
print('预登录结果有效');
} else {
print('预登录结果已失效,需要重新预登录');
}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');
}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('一键登录'),
),
],
),
),
);
}
}| 方法 | 说明 | 参数 | 返回值 |
|---|---|---|---|
init |
初始化 SDK | appId: 应用IDdebug: 是否开启调试模式 |
Future<void> |
preLogin |
预登录 | timeout: 超时时间(毫秒),默认 8000 |
Future<PreLoginInfo> |
isPreLoginResultValid |
检查预登录是否有效 | 无 | Future<bool> |
login |
一键登录 | timeout: 超时时间(毫秒),默认 5000 |
Future<LoginInfo> |
getVersion |
获取 SDK 版本 | 无 | Future<String> |
| 字段 | 类型 | 说明 |
|---|---|---|
number |
String |
手机号码(带掩码) |
privacyName |
String |
运营商隐私协议名称 |
privacyUrl |
String |
运营商隐私协议 URL |
operatorType |
String |
运营商类型(CM/CU/CT 或 1/2/3) |
expiredTime |
int |
过期时间(时间戳) |
operatorName |
String |
运营商名称(扩展属性) |
| 字段 | 类型 | 说明 |
|---|---|---|
gyuid |
String |
个验用户唯一标识 |
token |
String |
登录凭证,需发送到服务器验证 |
expiredTime |
int |
Token 过期时间(时间戳) |
- 隐私政策:在调用
init方法之前,必须确保用户已同意隐私政策 - 预登录时机:建议在 App 启动时或登录页面加载时提前预登录
- 预登录有效期:
- 移动/电信:1小时
- 联通:30分钟
- 授权页规范:如果需要自定义授权页,必须包含以下必要元素:
- 号码栏
- 品牌露出
- 登录按钮
- 隐私确认
- 隐私标题
如果遇到编译错误,请检查:
- APPID 配置:确保在
android/app/build.gradle中正确配置了 APPID - Java 版本:确保使用 Java 17 或更高版本
- 最小 SDK 版本:确保 minSdk >= 19
- 依赖冲突:如果项目中集成了其他个推 SDK,确保版本兼容
注意:插件已自动配置个推 Maven 仓库,无需在主工程中手动添加
插件已在 podspec 中配置 static_framework = true,自动解决了 GYSDK 静态框架的兼容性问题,无需手动配置。
如果仍然遇到静态链接相关错误,请:
- 确保使用最新版本的插件
- 清理缓存后重新安装:
cd ios rm -rf Pods Podfile.lock pod install
如果遇到其他编译错误,请检查:
- iOS 版本:确保 iOS 版本为 13.0 或以上
- Podfile 配置:确保正确配置了静态链接
- 清理缓存:
cd ios rm -rf Pods Podfile.lock pod install - XCode 版本:建议使用 XCode 15 或更高版本
MIT