You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cordova-plugin-firebasex在Android12/13下回调未触发问题求助

问题分析

你遇到的核心问题是:Android 13设备上cordova-plugin-firebasex的hasPermission回调完全不触发,结合Logcat中的CordovaBridge: Ignoring exec() from previous page load日志,问题根源大概率是两个方向:

  1. 插件调用时机过早,Cordova忽略了未完成页面加载阶段的exec请求
  2. 旧版本插件对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:27:40