更新记录

1.0.10(2025-12-09)

  1. 降低sdk以适配低版本android

1.0.9(2025-12-05)

  1. ios抽取registerForRemoteNotifications接口,在app启动的时候调用一次就可以

1.0.8(2025-11-21)

  1. 修复某些版本HBuildx 在iOS端打包报错问题
查看更多

平台兼容性

uni-app(4.07)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - 5.0 15 -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

uni-app x(4.07)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 5.0 15 - -

其他

多语言 暗黑模式 宽屏模式

Firebase Analytics & Fcm

  1. Analytics 是一种免费的应用衡量解决方案,可提供有关应用使用情况和用户参与度的洞察。
  2. Fcm支持铃声、震动、自定义图标
  3. 鸿蒙消息推送

功能

  1. 记录事件
  2. 衡量电子商务
  3. 跟踪屏幕
  4. 衡量广告收入
  5. 设置默认事件参数
  6. 设置用户属性
  7. 设置用户ID
  8. 禁用/开启Analytics 数据收集
  9. Fcm支持铃声、震动、自定义图标
  10. 鸿蒙消息推送

集成步骤

  1. 在Firebasehttps://console.firebase.google.com/?hl=zh-cn平台创建项目,创建项目时注意开启"为此项目启用Google Analytics(分析)"(或者在项目“项目设置”,然后在集成标签页中启用该服务)
  2. 点击创建的项目,分别添加Android、iOS应用,添加的时候Android需要绑定包名和打包证书签名的SHA-1(可选),iOS需要绑定包名,再分别下载Android的google-services.json和iOS的GoogleService-Info.plist,注意自定义基座或云打包时需要用绑定的包名和打包证书
  3. 项目设置 > Cloud Messaging 标签页,在 iOS 应用配置下的 APNs 身份验证密钥中,点击上传按钮,上传您的开发身份验证密钥、生产身份验证密钥,或两者。二者至少需要选择其一.
  4. 将demo里的nativeResources、nativeResources、AndroidManifest.xml、Info.plist文件夹或文件夹拷贝到项目里的对应路径
  5. ios需要勾选manifest.json里的app模块配置Push(消息推送),不需要勾选uniPush 1.0和uniPush 2.0,并且增加iOS最低版本配置 "deploymentTarget" : "15.0"
  6. nativeResources/ios/UniApp.entitlements文件里的aps-environment对应的值是development、production,一般开发阶段使用development,生产发布使用production
  7. 修改nativeplugins/wrs-notifiction的文件(ios自定义推送消息图标icon功能,用不到此功能可以删除wrs-notifiction文件夹并忽略这个步骤的配置),并在manifest.json->安卓/iOS原生插件配置->本地插件里选择对应的插件: 可参考uniapp官方集成文档https://nativesupport.dcloud.net.cn/NativePlugin/course/package.html#ios-extension
  • manifest.json app原生插件配置勾选WRSNotification插件
  • ios-extension.json里的identifier改为打包包名+自定义后缀(${包名}.${自定义后缀}),如:

包名为com.wrs.project.WRSVoipProject
后缀为WRSNotificactionServiceExtension
identifier为com.wrs.project.jpush.WRSNotificactionServiceExtension
  • ios-extension.json里的profile替换为iOS的extension签名文件名,文件名要以ios-为前缀
  • ios-com_notification.mobileprovision替换为ios-extension.json里profile的签名文件

{
  "token": "xx", // 远程消息推送的手机token,由app生成token
  "alert": "您有一个音视频来电",
  "body": "音视频来电",
  "topic": "com.wrs.project.jpush", // app包名
  "sound": "ring.wav", // 消息通知铃声
  "payload": {
    "updateNotification": { // 修改消息通知的图标和标题,mutableContent需要设置为1,仅支持iOS 15以上系统
      "icon": "http://192.168.0.104:3000/static/***.png",
      "displayName": "张三来电"
    }
  },
  "mutableContent": 1
}
  1. 将iOS下载的GoogleService-Info.plist替换nativeResources/ios/Resources/GoogleService-Info.plist
  2. Android的google-services.json的处理方式有2种:
    1. 联系作者将google-services.json转换为config.xml,然后替换nativeResources/android/res/values的config.xml文件
    1. 使用google-services.json的值替换config.xml的值,对应的替换值为:
google-services.json config.xml
client_type为3的client_id default_web_client_id
project_info -> project_number gcm_defaultSenderId
api_key -> current_key google_api_key
client -> client_info -> mobilesdk_app_id google_app_id
api_key -> current_key google_crash_reporting_api_key
project_info -> storage_bucket google_storage_bucket
project_info -> project_id project_id
  1. 集成插件步骤请参考https://www.cnblogs.com/wenrisheng/p/18323027
  2. 鸿蒙next消息推送配置

点击消息监听并获取消息里的业务参数

  • Android通过在页面的onShow()接口里获取到消息的业务参数

onShow() {
    if (this.isAndroid) {
        let intentData = UTSPush.getUTSIntentData()
        if (intentData) {
            // 后端或本地发送通知的时候,自己带上业务参数,这里可以获取到点击通知启动app的参数
            // {"extras":{"age":"999","short_cut_class_name":"io.dcloud.PandoraEntry","google.ttl":2419200,"collapse_key":"com.wrs.project.jpush","__intetn_orientation__":2,"google.message_id":"0:1728539699533701%8b5c45cc8b5c45cc","google.delivered_priority":"high","gcm.n.analytics_data":{"empty":false,"parcelled":false,"size":0},"google.sent_time":1728539699510,"from":"1062023367861","name":"wrs","address":"zh","google.original_priority":"high"}}                     let extras = intentData.extras
            if (intentData.extras) {
                this.showMsg("用户点击了消息通知,通知业务参数:" + JSON.stringify(intentData.extras))
            }
            // this.showMsg("intent data:" + JSON.stringify(intentData))
        }
    }
}
  • iOS如果app在运行中,用户点击了消息会回调onClick,如果app没有启动,点击消息来启动app的话会回调onLaunchOptioins

UTSPush.onCallback((resp) => {
    // app运行中点击了消息,仅支持iOS
    let opt = resp.opt
    switch (opt) {
        // app运行中点击了消息,仅支持iOS
        case "onClick":{

        }
        break;
        // app没有启动时,点击消息启动app时获取消息的参数会回调这里,仅支持iOS
        case "onLaunchOptioins":
        {
            let remoteNotification = resp.remoteNotification
            if (remoteNotification) {
                // 点击通知启动的app
            }
        }
        break;
})
  • harmony与iOS类似,如果app在运行中,用户点击了消息会回调onAppAbilityNewWant,如果app没有启动,点击消息来启动app的话会回调onAppAbilityCreate

UTSPush.onCallback((resp) => {
    this.showMsg("onCallback:" + JSON.stringify(resp))
    let opt = resp.opt

    switch (opt) {
        // 仅支持鸿蒙,当app未启动时,点击消息来启动app后,从这个回调来获取消息的业务参数
        case "onAppAbilityCreate": {
            // console.log(JSON.stringify(resp))
            this.showMsg("鸿蒙点击通知启动app onAppAbilityCreate")
        }
        break;
        // 仅支持鸿蒙,当app已经启动时,点击消息来唤醒app后,从这个回调来获取消息的业务参数
        case "onAppAbilityNewWant": {
            // console.log(JSON.stringify(resp))
            this.showMsg("鸿蒙点击通知启动app onAppAbilityNewWant")
        }
        break;

推送通知说明

  • iOS、harmony的通知无论app在前台运行、后台运行或者app没启动都能收到
  • Android的fcm通知:
  1. 当app在前台运行时,通知不会显示到通知栏,会回调onMessageReceived接口,需要主动调用UTSPush.shownNotification(params)来显示到通知栏
  2. 当app在后台运行时,不会回调onMessageReceived接口,通知会自动显示到通知栏
  3. 当app没有启动时,国外版本的手机会自动显示到通知栏,国内版本手机需要开启app的“自启动”功能才会显示到通知栏
  4. 系统发出通知的图标和颜色在AndroidManifest.xml里配置,参考demo

消息推送自定义铃声

  1. Android先调用createNotificationChannel接口创建一个带有铃声的channel,后端接口往这个channel(传channelId)里推送消息
  2. ios在后端接口有个sound字段,填入nativeResources/ios/Resources文件夹里面的文件名称,如ring.wav

消息推送自定义图标

  1. Android参考后端官方接口
  2. ios按照操作步骤的第3步和第6步添加配置资源,ios在后端接口里用payload-updateNotification-icon字段

消息推送添加震动

  1. Android先调用createNotificationChannel接口创建一个带有震动的channel,后端接口往这个channel(传channelId)里推送消息
  2. ios暂不支持,有需求可以联系作者

插件声明


import {UTSFirebase, UTSPush, UTSFirebaseAnalytics} from "@/uni_modules/wrs-uts-firebase";
  • 初始化配置,在app启动的时候调用,放到App.vue的onLaunch里面

UTSFirebase.configure()
  • 设置消息通知的回调

UTSPush.onCallback((resp) => {
    this.showMsg("onCallback:" + JSON.stringify(resp))
    let opt = resp.opt

    switch (opt) {
        // 仅支持鸿蒙,当app未启动时,点击消息来启动app后,从这个回调来获取消息的业务参数
        case "onAppAbilityCreate": {
            // console.log(JSON.stringify(resp))
            this.showMsg("鸿蒙点击通知启动app onAppAbilityCreate")
        }
        break;
        // 仅支持鸿蒙,当app已经启动时,点击消息来唤醒app后,从这个回调来获取消息的业务参数
        case "onAppAbilityNewWant": {
            // console.log(JSON.stringify(resp))
            this.showMsg("鸿蒙点击通知启动app onAppAbilityNewWant")
        }
        break;
        // ios获取到token
        case "onToken":
            let apnsToken = resp.token
            if (apnsToken) {
                // 这个是iOS原生的token,如果后台推送接口直接对接苹果来发送消息的话用这个token
                    this.showMsg("IOS apnsToken:" + apnsToken)
            }
            break;
            // 获取token失败
        case "onTokenFail":
            break;
            // onWillPresent仅支持iOS
        case "onWillPresent":
          // {
          //   "aps" : {
          //     "alert" : {
          //       "body" : "great match!",
          //       "title" : "Portugal vs. Denmark",
          //     },
          //     "badge" : 1,
          //   },
          //   "customKey" : "customValue"
          // }
            break;
            // app运行中点击了消息,仅支持iOS
        case "onClick":
            break;
            // app没有启动时,点击消息启动app时获取消息的参数会回调这里,仅支持iOS
        case "onLaunchOptioins":
            let remoteNotification = resp.remoteNotification
            if (remoteNotification) {
                // 点击通知启动的app
            }
            break;
            // 仅支持Android
        case "onMessageReceived":
            // {"message":{"originalPriority":1,"priority":1,"from":"1062023367861","sentTime":1728529512606,"messageId":"0:1728529526496732%8b5c45cc8b5c45cc","collapseKey":"com.wrs.project.jpush","data":{"age":"999","name":"wrs","address":"zh"},"senderId":"1062023367861","ttl":2419200,"notification":{"channelId":"channel01","title":"aaaa","body":"aaaaa"}},"opt":"onMessageReceived"}                       let message = resp.message
            let message = resp.message
            let data = message.data
            let notification = message.notification
            if (notification) {
                // app在前台运行时,收到通知不会显示到通知栏
                // 需要自己调用本地通知来显示通知
                this.shownMessageNotification(message)
            }
            break;
        default:
            break;
    }
})
  • 请求通知权限
            switch (uni.getSystemInfoSync().platform) {
    case 'harmonyos': {
        UTSPush.requestAuthorization({}, (resp) => {
            let flag = resp.flag
            if (flag) {

            } else { // 请求权限失败
                console.log("requestAuthorization:" + JSON.stringify(resp))
            }
        })
    }
    break;
    case 'android': {
        let version = UTSPush.getBuildSDKVersion()
        if (version >= 33) {
            this.requestPermission([
                "android.permission.POST_NOTIFICATIONS"
            ])
        }
        let isEnable = UTSPush.getNotificationsEnable()
        if (!isEnable) {
            this.showModel("是否去打开通知权限?", () => {
                UTSPush.openAppNotificatioinSettings()
            }, () => {

            })
        }

        // 云端url
        let ringUrl = "http://192.168.2.24:8080/file/test.mp3"
        // static文件夹下的文件
        // ringUrl = UTSPush.getResourcePath("/static/test.mp3")
        // nativeResources/android/res/raw文件夹下的文件,只需要文件名,不需要文件后缀
        ringUrl = "test"
        let channelId = this.channelId + ""
        let params = { // 如果已经channelId的channel则不创建,如果没有则会自动创建
            channelId: channelId,
            channelName: "自定义铃声",
            importance: 4, // 3: default 4: high 2: low 5: max 1: min 0: none
            lockscreenVisibility: 1, //1: public 0: private -1: secret
            description: "自定义铃声channel",
            vibration: { // 震动
                enable: true,
                pattern: [100, 200, 300, 400, 500, 400, 300, 200, 400]
            },
            sound: { // 铃声
                url: ringUrl
            },
            lightColor: "#ffffff"
        }
        // 创建频道,先删除再创建 
        UTSPush.deleteNotificationChannel(channelId)
        UTSPush.createNotificationChannel(params)
    }
    break;
    case 'ios': {
        UTSPush.requestAuthorization({
            types: ["badge", "sound", "alert"]
        }, (resp) => {
            console.log("requestAuthorization:" + JSON.stringify(resp))
            let flag = resp.flag
            if (flag) { // 请求权限失败

            } else { // 请求权限失败

            }
        })
    }
    break
    default:
        break;
}
  • ios注册远程通知,在app启动的时候调用一次就可以,仅支持iOS

UTSPush.registerForRemoteNotifications()
  • 获取fcmToken

UTSPush.getToken((resp) => {
    // 这个token上传给后端,后端根据这个token来发送消息给app
    let fcmToken = resp.token
    this.showMsg("getFcmToken:" + JSON.stringify(resp))
})
  • 创建通知频道channel,仅支持Android

// 第一种:云端url
let ringUrl = "http://192.168.2.24:8080/file/test.mp3"
// 第二种:static文件夹下的文件
// ringUrl = UTSPush.getResourcePath("/static/test.mp3")
//第三种(推荐): nativeResources/android/res/raw文件夹下的文件test.mp3,只需要文件名,不需要文件后缀
ringUrl = "test"
let channelId = "xxx"
let params = { // 如果已经channelId的channel则不创建,如果没有则会自动创建
    channelId: channelId,
    channelName: "自定义铃声",
    importance: 4, // 3: default 4: high 2: low 5: max 1: min 0: none
    lockscreenVisibility: 1, //1: public 0: private -1: secret
    description: "自定义铃声channel",
    vibration: { // 震动
        enable: true,
        pattern: [100, 200, 300, 400, 500, 400, 300, 200, 400]
    },
    sound: { // 铃声
        url: ringUrl
    },
    lightColor: "#ffffff"
}
// 创建频道,先删除再创建
UTSPush.createNotificationChannel(params)
  • 删除通知频道,仅支持Android

UTSPush.deleteNotificationChannel(channelId)

Analytics


// 事件名称
let name = "user_login";
// 事件参数
let params = {
    "account": "张三",
    "password": "123456",
    "role": 1,
    "price": 2.02
};
UTSFirebaseAnalytics.logEvent(name, params);

ad_impression、add_payment_info、add_to_cart、add_to_wishlist、app_open、begin_checkout
、campaign_details、generate_lead、join_group、level_end、level_start、level_up、login、
post_score、search、select_content、share、sign_up、spend_virtual_currency、tutorial_begin
、tutorial_complete、unlock_achievement、view_item、view_item_list、view_search_results、earn_virtual_currency
screen_view、remove_from_cart、add_shipping_info、purchase、refund、select_item、select_promotion
、view_cart、view_promotion

achievement_id、ad_format、ad_platform、ad_source、ad_unit_name、character、travel_class、
、content_type、currency、coupon、start_date、end_date、extend_session、flight_number、group_id
、item_category、item_id、item_name、location、level、level_name、method、number_of_nights、number_of_passengers
、number_of_rooms、destination、origin、price、quantity、score、shipping
、transaction_id、search_term、success、tax、value、virtual_currency_name、campaign
、source、medium、term、content、aclid、cp1、item_brand、item_variant、creative_name
、creative_slot、affiliation、index、discount、item_category2、item_category3、item_category4
、item_category5、item_list_id、item_list_name、items、location_id、payment_type
、promotion_id、promotion_name、screen_class、screen_name、shipping_tier

除了预设参数外,您还可以将以下参数添加到事件中:

  1. 自定义参数:可使用自定义参数作为 Analytics 报告中的维度或指标。 您可以对非数值事件参数数据使用自定义维度,而对更适合以数值形式表示的参数数据使用自定义指标。使用 SDK 记录自定义参数后,请注册维度或指标,以确保这些自定义参数能够出现在 Analytics 报告中。可依次点击以下各项完成此操作:“分析”>“事件”>“管理自定义设置”>“创建自定义维度”。 自定义参数可用于每份报告都可能使用的受众群体定义中。如果您的应用已关联到 BigQuery 项目,自定义参数也将包含在导出至 BigQuery 的数据中。如需查看示例查询及更多内容,请访问 Google Analytics(分析)4 BigQuery Export。

  2. VALUE 参数:VALUE 是一个通用参数,可用于累积与事件相关的关键指标,例如收入、距离、时间和分数。

  • 设置默认事件参数

// defaultParams参数可以任意增加key/value属性值,建议不要有多级节点
var params = {};
params.system = "ios";
params.version = "1.0.1"
UTSFirebaseAnalytics.setDefaultEventParameters(params);
  • 设置用户属性

https://firebase.google.cn/docs/analytics/user-properties?hl=zh-cn&platform=ios 要设置用户属性,请执行以下步骤:

在 Firebase 控制台的Analytics自定义定义页面中为用户属性创建自定义定义。有关详细信息,请参阅自定义维度和指标。 使用setUserProperty()方法在您的应用程序中设置用户属性。


let name = "张三";
let value = "20";
UTSFirebaseAnalytics.setUserProperty(name, value);
  • 设置用户ID

let userId = "12121351"
UTSFirebaseAnalytics.setUserId(userId);
  • 禁用/开启Analytics 数据收集

UTSFirebaseAnalytics.setAnalyticsCollectionEnabled(true);
  • 重制Analytics

UTSFirebaseAnalytics.resetAnalyticsData();

DEBUGVIEW实时查看开发测试数据

  1. 电脑安装配置Android的adb命令
  2. 执行命令启动Analytics调试模式:

adb shell setprop debug.firebase.analytics.app ${PACKAGE_NAME}
  1. 调试模式将保持启用状态,直至您通过执行以下命令明确将其停用

adb shell setprop debug.firebase.analytics.app .none.
  1. 进入firebase应用的DebugView页面就可以查看上报的数据

如果觉得可以就点个👍吧,欢迎粉丝收藏,土豪打赏,您的关注就是我们创作的动力!

隐私、权限声明

1. 本插件需要申请的系统权限列表:

通知

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件使用的 Firebase Analytics SDK会采集数据,详情可参考:https://firebase.google.cn/?hl=zh-cn

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: