Cordova-plugin-firebasex在Android12/13下回调未触发问题求助
问题分析
你遇到的核心问题是:Android 13设备上cordova-plugin-firebasex的hasPermission回调完全不触发,结合Logcat中的CordovaBridge: Ignoring exec() from previous page load日志,问题根源大概率是两个方向:
- 插件调用时机过早,Cordova忽略了未完成页面加载阶段的
exec请求 - 旧版本插件对Android 13新增的
POST_NOTIFICATIONS运行时权限处理存在兼容缺陷
以下是针对性的解决方案:
解决方案
1. 确保插件调用在Cordova初始化完成后执行
Cordova的插件API必须在deviceready事件触发后才能安全调用,否则会出现exec请求被忽略的情况。修改你的调用逻辑,将checkNotificationPermissions放在deviceready监听内:
document.addEventListener("deviceready", function() { // 等待Cordova完全初始化后再执行权限检查 checkNotificationPermissions(false); }, false);
2. 手动适配Android 13的通知权限请求
cordova-plugin-firebasex 16.1.0对Android 13的POST_NOTIFICATIONS权限处理存在兼容问题,建议使用cordova-plugin-android-permissions插件单独处理该权限,再衔接Firebase的逻辑:
步骤1:安装权限插件
cordova plugin add cordova-plugin-android-permissions
步骤2:修改权限检查逻辑
checkNotificationPermissions = (requested) => { console.log("check permissions"); const permissions = cordova.plugins.permissions; const android13NotificationPerm = permissions.POST_NOTIFICATIONS; // 先处理Android 13专属的通知权限 permissions.checkPermission(android13NotificationPerm, (status) => { if (status.hasPermission) { // 权限已授权,执行Firebase相关逻辑 handleFirebaseWorkflow(); } else if (!requested) { console.log("Requesting remote notifications permission"); permissions.requestPermission(android13NotificationPerm, (status) => { if (status.hasPermission) { console.log("Permission was granted"); handleFirebaseWorkflow(); } else { console.log("Notifications won't be shown as permission is denied"); } }, (err) => console.error("Permission request failed:", err)); } else { console.log("Notifications won't be shown as permission is denied"); } }, (err) => console.error("Permission check failed:", err)); // 封装Firebase权限检查和Token获取逻辑 function handleFirebaseWorkflow() { window.FirebasePlugin.hasPermission(function(hasPermission) { console.log("has permission: " + hasPermission); if (hasPermission) { console.log("Remote notifications permission granted"); window.FirebasePlugin.getToken(function(token){ console.log("Got FCM token: " + token); }, function(error) { console.log("Failed to get FCM token", error); }); } }); } // 消息监听逻辑保持不变 window.FirebasePlugin.onMessageReceived(function(message){ if(message && message.url){ history.push(message.url); } }, function(error){ console.log("Error on message received " + error); }); }
3. 升级cordova-plugin-firebasex到最新版本
版本16.1.0存在Android 13的已知兼容问题,升级到最新版本(17.x及以上)可直接修复权限回调失效的问题:
cordova plugin rm cordova-plugin-firebasex cordova plugin add cordova-plugin-firebasex@latest
4. 确认AndroidManifest配置正确性
确保config.xml中已正确配置targetSdkVersion和权限:
<platform name="android"> <!-- 明确指定targetSdk为33(Android 13) --> <preference name="android-targetSdkVersion" value="33" /> <config-file target="AndroidManifest.xml" parent="/*"> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> </config-file> </platform>
内容的提问来源于stack exchange,提问作者Chouffiboy
相关产品推荐
相关产品推荐

