Flutter获取Firebase设备Token真机运行报错如何解决
问题场景
Flutter开发中通过以下代码获取Firebase设备Token:
FirebaseMessaging.instance.getToken().then((value) => print("token is $value"));
模拟器运行时代码可正常执行并打印Token,切换到真机运行时抛出如下错误:
java.util.concurrent.ExecutionException: com.google.firebase.installations.FirebaseInstallationsException: Firebase Installations Service is unavailable. Please try again later.
排查修复步骤
- 优先排查真机网络连通性:Firebase服务在国内无特殊网络配置的环境下无法正常访问,若模拟器配置了全局代理、真机未配置可用代理,就会出现模拟器正常、真机报错的典型现象,给真机配置全局可用的代理后重试即可。
- 校验配置文件一致性:确认
android/app目录下的google-services.json文件,和Firebase控制台中对应应用包名的配置文件完全匹配,没有错用其他项目/其他包名的配置。如果近期在Firebase控制台调整过应用配置,重新下载最新的配置文件替换本地文件,执行flutter clean清理构建缓存后重新编译运行。 - 检查Android端构建配置:
- 确认
android/build.gradle中依赖的com.google.gms:google-services插件版本,和当前使用的Firebase SDK版本适配,不要使用过旧版本的插件 - 确认
android/app/build.gradle文件底部已经正确添加插件应用配置:apply plugin: 'com.google.gms.google-services' - 确认真机已安装可用的Google Play服务框架,部分国行安卓机型默认阉割Google服务组件,会导致Firebase相关服务无法正常通信,安装完整Google服务框架后重试。
- 确认
- 检查应用权限声明:确认
AndroidManifest.xml中已添加必要的网络相关权限:
部分定制ROM会拦截未声明网络权限应用的联网请求,即使设备本身网络正常也会抛出服务不可用错误。<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 校验初始化流程:如果使用的是6.x以上版本的
firebase_messaging插件,确认在调用getToken()之前已经完成Firebase初始化,参考代码如下:
未完成初始化就调用接口,也可能偶发服务不可用的报错。WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 初始化完成后再调用getToken FirebaseMessaging.instance.getToken().then((value) => print("token is $value"));
内容的提问来源于stack exchange,提问作者sarakhan
相关产品推荐
相关产品推荐

