更新记录
1.0.10(2025-12-09)
- 降低sdk以适配低版本android
1.0.9(2025-12-05)
- ios抽取registerForRemoteNotifications接口,在app启动的时候调用一次就可以
1.0.8(2025-11-21)
- 修复某些版本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
- Analytics 是一种免费的应用衡量解决方案,可提供有关应用使用情况和用户参与度的洞察。
- Fcm支持铃声、震动、自定义图标
- 鸿蒙消息推送
功能
- 记录事件
- 衡量电子商务
- 跟踪屏幕
- 衡量广告收入
- 设置默认事件参数
- 设置用户属性
- 设置用户ID
- 禁用/开启Analytics 数据收集
- Fcm支持铃声、震动、自定义图标
- 鸿蒙消息推送
集成步骤
- 在Firebasehttps://console.firebase.google.com/?hl=zh-cn平台创建项目,创建项目时注意开启"为此项目启用Google Analytics(分析)"(或者在项目“项目设置”,然后在集成标签页中启用该服务)
- 点击创建的项目,分别添加Android、iOS应用,添加的时候Android需要绑定包名和打包证书签名的SHA-1(可选),iOS需要绑定包名,再分别下载Android的google-services.json和iOS的GoogleService-Info.plist,注意自定义基座或云打包时需要用绑定的包名和打包证书
- 项目设置 > Cloud Messaging 标签页,在 iOS 应用配置下的 APNs 身份验证密钥中,点击上传按钮,上传您的开发身份验证密钥、生产身份验证密钥,或两者。二者至少需要选择其一.
- 将demo里的nativeResources、nativeResources、AndroidManifest.xml、Info.plist文件夹或文件夹拷贝到项目里的对应路径
- ios需要勾选manifest.json里的app模块配置Push(消息推送),不需要勾选uniPush 1.0和uniPush 2.0,并且增加iOS最低版本配置 "deploymentTarget" : "15.0"
- nativeResources/ios/UniApp.entitlements文件里的aps-environment对应的值是development、production,一般开发阶段使用development,生产发布使用production
- 修改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
}
- 将iOS下载的GoogleService-Info.plist替换nativeResources/ios/Resources/GoogleService-Info.plist
- Android的google-services.json的处理方式有2种:
-
- 联系作者将google-services.json转换为config.xml,然后替换nativeResources/android/res/values的config.xml文件
-
- 使用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 |
- 集成插件步骤请参考https://www.cnblogs.com/wenrisheng/p/18323027
- 鸿蒙next消息推送配置
- app需要配置手动签名,开发阶段配置开发证书,上架发布的时候配置生产证书
- 在AppGallery Connect里开通推送服务,参考官方https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/push-config-setting
- 在AppGalery Connect里可以直接发推送消息给app来调试https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/myProject/461323198428978332/9249519184595935885?appId=5765880207855838977
点击消息监听并获取消息里的业务参数
- 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通知:
- 当app在前台运行时,通知不会显示到通知栏,会回调onMessageReceived接口,需要主动调用UTSPush.shownNotification(params)来显示到通知栏
- 当app在后台运行时,不会回调onMessageReceived接口,通知会自动显示到通知栏
- 当app没有启动时,国外版本的手机会自动显示到通知栏,国内版本手机需要开启app的“自启动”功能才会显示到通知栏
- 系统发出通知的图标和颜色在AndroidManifest.xml里配置,参考demo
- 后端推送接口
- Android采用官方库https://firebase.google.com/docs/cloud-messaging/server?hl=zh-cn,开发调试时可以使用google平台的界面上推送功能
- 鸿蒙参考官方文档https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/push-server
消息推送自定义铃声
- Android先调用createNotificationChannel接口创建一个带有铃声的channel,后端接口往这个channel(传channelId)里推送消息
- ios在后端接口有个sound字段,填入nativeResources/ios/Resources文件夹里面的文件名称,如ring.wav
消息推送自定义图标
- Android参考后端官方接口
- ios按照操作步骤的第3步和第6步添加配置资源,ios在后端接口里用payload-updateNotification-icon字段
消息推送添加震动
- Android先调用createNotificationChannel接口创建一个带有震动的channel,后端接口往这个channel(传channelId)里推送消息
- 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);
- 已有的name推荐事件事件常量有https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event?hl=zh-cn:
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
- 已有的params的key预设参数常量有https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Param?hl=zh-cn:
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
除了预设参数外,您还可以将以下参数添加到事件中:
-
自定义参数:可使用自定义参数作为 Analytics 报告中的维度或指标。 您可以对非数值事件参数数据使用自定义维度,而对更适合以数值形式表示的参数数据使用自定义指标。使用 SDK 记录自定义参数后,请注册维度或指标,以确保这些自定义参数能够出现在 Analytics 报告中。可依次点击以下各项完成此操作:“分析”>“事件”>“管理自定义设置”>“创建自定义维度”。 自定义参数可用于每份报告都可能使用的受众群体定义中。如果您的应用已关联到 BigQuery 项目,自定义参数也将包含在导出至 BigQuery 的数据中。如需查看示例查询及更多内容,请访问 Google Analytics(分析)4 BigQuery Export。
-
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实时查看开发测试数据
- 电脑安装配置Android的adb命令
- 执行命令启动Analytics调试模式:
adb shell setprop debug.firebase.analytics.app ${PACKAGE_NAME}
- 调试模式将保持启用状态,直至您通过执行以下命令明确将其停用
adb shell setprop debug.firebase.analytics.app .none.
- 进入firebase应用的DebugView页面就可以查看上报的数据

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(1)
下载 1074
赞赏 0
下载 12021025
赞赏 1823
赞赏
京公网安备:11010802035340号