Flutter Android:如何指定固定AppCheck Debug Token避免重装丢失?
解决方案:固定Debug Token与真机App Check调试
一、为Android指定固定Debug Token
默认的DebugAppCheckProvider确实会随机生成token,但可以通过自定义Provider实现固定token的需求,甚至支持从环境变量注入:
- 自定义Debug Provider
创建继承自DebugAppCheckProvider的类,重写getToken方法返回固定值:
public class FixedDebugAppCheckProvider extends DebugAppCheckProvider { private static final String FIXED_DEBUG_TOKEN = "你的固定Debug Token"; public FixedDebugAppCheckProvider(@NonNull Context context) { super(context); } @NonNull @Override public Task<AppCheckToken> getToken() { return Tasks.forResult(new AppCheckToken(FIXED_DEBUG_TOKEN, System.currentTimeMillis() + 365L * 24 * 60 * 60 * 1000)); } }
- 注册自定义Provider
在Application类或Firebase初始化逻辑中,替换默认的DebugProvider:
FirebaseAppCheck.getInstance().installAppCheckProviderFactory( new AppCheckProviderFactory() { @NonNull @Override public AppCheckProvider createProvider(@NonNull Context context) { if (BuildConfig.DEBUG) { return new FixedDebugAppCheckProvider(context); } else { return PlayIntegrityAppCheckProvider.getInstance(); } } } );
- 通过环境变量注入Token
如果不想硬编码,可用Gradle传递环境变量:
- 在
local.properties中添加:APP_CHECK_DEBUG_TOKEN=你的固定Token - 在
app/build.gradle中读取并注入BuildConfig:android { defaultConfig { buildConfigField "String", "APP_CHECK_DEBUG_TOKEN", "\"${getLocalProperty("APP_CHECK_DEBUG_TOKEN")}\"" } } def getLocalProperty(String key) { Properties properties = new Properties() properties.load(new File(rootProject.rootDir, "local.properties").newDataInputStream()) return properties.getProperty(key, "") } - 之后在自定义Provider中用
BuildConfig.APP_CHECK_DEBUG_TOKEN替代硬编码值即可。
二、真机调试App Check的常规方式
- 使用Play Integrity的调试验证
真机Debug构建无需依赖DebugProvider:
- 执行
./gradlew signingReport获取Debug构建的SHA-256指纹 - 在Firebase控制台的App Check设置中,找到Play Integrity提供商,将该SHA-256指纹添加到允许列表
- 配置完成后,Debug构建的真机可直接通过Play Integrity验证,无需Debug Token
- DebugProvider的优化用法
文档提及模拟器是因为其无法运行Play Integrity/SafetyNet,但真机Debug也可使用DebugProvider。另外,Firebase控制台的Debug Token列表无需删除旧token,即使设备重装生成新token,旧token仍可正常使用(除非手动删除)。
三、其他替代方案
- 持久化Debug Token:首次生成token时,将其保存到设备的SharedPreferences或外部存储,重装时读取复用(仅在Debug模式下使用)。
- Flutter层注入Token:通过
flutter run --dart-define=APP_CHECK_DEBUG_TOKEN=xxx传递token,再在Android原生代码中读取BuildConfig.APP_CHECK_DEBUG_TOKEN使用。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

