Flutter构建Android12应用Intercom相关构建及初始化报错问询
解决方案
问题1:Android构建报IntercomFcmMessengerService缺少android:exported属性
这个报错和你已经加了exported属性的MainActivity无关,是清单合并时,Intercom SDK内部声明的FCM消息服务自带intent-filter,但没有显式配置android:exported属性——Android 12(targetSdk 31)及以上版本强制要求所有带intent-filter的应用组件必须显式声明该属性,所以构建失败。报错栈指向权限相关行是清单合并工具的定位偏移,不用在意。
修复步骤:
- 打开项目下
android/app/src/main/AndroidManifest.xml,在<application>标签内,和现有Activity平级的位置,添加如下配置,覆盖SDK中的默认服务声明:
<service android:name="io.intercom.android.sdk.fcm.IntercomFcmMessengerService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
- 顺手给你清单里已有的
com.yalantis.ucrop.UCropActivity也补上android:exported="false"属性,这个组件没有对外暴露的必要,不补后续大概率会报同类错误。 - 执行
flutter clean清理缓存后重新构建即可。
问题2:升级Intercom到7.2.0后提示initialize不能通过静态方式访问
这个是intercom_flutter 7.x版本的破坏性变更导致的:从这个版本开始,原来所有支持静态调用的Intercom方法,全部调整为需要通过单例实例Intercom.instance访问,同时部分方法名也做了调整。
修复步骤:
- 把你代码里所有
Intercom.xxx形式的静态调用,全部改成Intercom.instance.xxx的形式。 - 注意7.x版本中,原有的
registerIdentifiedUser方法已经重命名为loginIdentifiedUser,调用时需要替换成新方法名。
对应你intercom.dart的修改点参考:
// 初始化逻辑修改 await Intercom.instance.initialize(appId, iosApiKey: iosApiKey, androidApiKey: androidApiKey); // 打开消息窗口 Future displayMessenger() { return Intercom.instance.displayMessenger(); } // 注册登录用户 Future enableIntercom() async { await disableIntercom(); User? loggedInUser = _userService.getLoggedInUser(); if (loggedInUser == null) throw 'Cannot enable intercom. Not logged in.'; assert(loggedInUser.uuid != null && loggedInUser.id != null); String userId = _makeUserId(loggedInUser); return Intercom.instance.loginIdentifiedUser(userId: userId); } // 退出Intercom登录 Future disableIntercom() { return Intercom.instance.logout(); }
改完之后执行flutter pub get拉取依赖,重新编译即可。
内容的提问来源于stack exchange,提问作者Ananth
相关产品推荐
相关产品推荐

