# iOS原生消息推送和Android谷歌fcm消息推送 ## 集成步骤 1. 在Firebase[https://console.firebase.google.com/?hl=zh-cn](https://console.firebase.google.com/?hl=zh-cn)平台创建项目,创建项目时注意开启"为此项目启用Google Analytics(分析)"(或者在项目“项目设置”,然后在集成标签页中启用该服务) 2. 点击创建的项目,添加Android,添加的时候Android需要绑定包名和打包证书签名的SHA-1(可选),下载Android的google-services.json,注意自定义基座或云打包时需要用绑定的包名和打包证书 3. 拷贝demo里的nativeResources、Info.plist、AndroidManifest.xml文件到项目根目录 4. ios勾选manifest.json里的app模块配置Push(消息推送),如果勾选了Push模块,删除nativeResources/ios/UniApp.entitlements 5. nativeResources/ios/UniApp.entitlements文件里的aps-environment对应的值是development、production,一般开发阶段使用development,生产发布使用production,根据情况设置 6. ios打包的.mobileprovision需要包含消息推送功能 7. 集成插件,集成插件步骤请参考 [https://www.cnblogs.com/wenrisheng/p/18323027](https://www.cnblogs.com/wenrisheng/p/18323027) 8. Android的google-services.json的处理方式有2种: ### 8.1 联系作者将google-services.json转换为config.xml,然后替换nativeResources/android/res/values/config.xml文件 ### 8.2 使用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 | ## 通知说明 - iOS的通知无论app在前台运行、后台运行或者app没启动都能收到 - Android的fcm通知: 1. 当app在前台运行时,通知不会显示到通知栏,会回调onMessageReceived接口,需要主动调用UTSPush.shownNotification(params)来显示到通知栏 2. 当app在后台运行时,不会回调onMessageReceived接口,通知会自动显示到通知栏 3. 当app没有启动时,国外版本的手机会自动显示到通知栏,国内版本手机需要开启app的“自启动”功能才会显示到通知栏 - 后端服务接口,Android采用官方库[https://firebase.google.com/docs/cloud-messaging/server?hl=zh-cn](https://firebase.google.com/docs/cloud-messaging/server?hl=zh-cn),ios集成各自后端语言的apn库 ## 接口 ```javascript import { UTSPush } from "@/uni_modules/wrs-uts-push" ``` - 设置消息回调 ```javascript UTSPush.onCallback((resp) => { this.showMsg("onCallback:" + JSON.stringify(resp)) let opt = resp.opt switch (opt) { // 获取到token case "onToken": let token = resp.token if (token) { // token上传给后端接口服务器,服务器调用苹果或Google的接口发送通知 } break; // 获取token失败 case "onTokenFail": break; // onWillPresent仅支持iOS case "onWillPresent": break; // app运行中点击了消息,仅支持iOS,Android通过getUTSIntentData接口获取 case "onClick": break; // app没有启动时,点击消息启动,仅支持iOS,Android通过getUTSIntentData接口获取 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; } }) ``` - 请求通知权限,仅支持iOS ```javascript if (this.isAndroid) { let version = UTSPush.getBuildSDKVersion() if (version >= 33) { this.requestPermission([ "android.permission.POST_NOTIFICATIONS" ]) } // 没有打开通知,提示用户开启通知 let isEnable = UTSPush.getNotificationsEnable() if (!isEnable) { this.showModel("是否去打开通知权限?", () => { UTSPush.openAppNotificatioinSettings() }, () => { }) } } else { UTSPush.requestAuthorization({ types: ["badge", "sound", "alert"] }, (resp) => { let flag = resp.flag if (flag) { // 请求权限失败 } else { console.log("requestAuthorization:" + JSON.stringify(resp)) } }) } ``` - 获取token ```javascript if (this.isAndroid) { UTSPush.getToken((resp) => { let token = resp.token this.showMsg("getToken:" + JSON.stringify(resp)) }) } else { // token结果从UTSPush.onCallback里回调 UTSPush.registerForRemoteNotifications() } ``` - 点击通知打开app,获取通知数据,仅支持Android ```javascript 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("intent data:" + JSON.stringify(intentData)) } } ``` - app在前台运行时,Android的消息通知不会显示在通知栏,需要自己发送本地通知才能显示在通知栏 ```javascript let notification = message.notification let title = notification.title let body = notification.body let data = message.data let url = "wrsapp://wrs.app" if (data) { let params = "" for (let key in data) { if (data.hasOwnProperty(key)) { let value = data[key] if (params.length > 0) { params = params + "&" + key + "=" + value } else { params = params + key + "=" + value } } } url = url + "?" + params } let channelId = notification.channelId if (!channelId) { // android 8以后一定要有channel channelId = this.channelId + "" } let params = {} params.identifier = "123" // 通知ID,主要用于修改、删除通知,android里的identifier必须是数字,iOS的identifier可以是任意字符串 params.channel = { // 如果已经channelId的channel则不创建,如果没有则会自动创建 channelId: channelId, channelName: "支付channel", importance: 4, // 3: default 4: high 2: low 5: max 1: min 0: none lockscreenVisibility: 1, //1: public 0: private -1: secret description: "收付款通知channel" } params.notification = { channelId: channelId, // 此消息通知是属于哪个channel的 contentTitle: title, contentText: body, visibility: 1, // 1: public 0: private -1: secret smallIcon: { // 小图标,必传 type: "resource", // 固定 defType: "drawable", // 固定 name: "not" // 文件名,不要带文件后缀,对应nativeResources/android/res/drawable文件夹下的图片 }, autoCancel: true, // 点击通知后是否自动消息 priority: 1, // 1: high 0: default -1: low -2:min 2: max contentIntent: { intent: { pkg: "com.wrs.project.jpush", // app包名 data: url, extra: data } } } UTSPush.shownNotification(params) ```