ThinkPHP推送uniapp消息
后台-插件-广告管理-内容页头部广告(手机) |
主要思路:ThinkPHP调用uniapp的uni-push2.0的推送消息功能,实现APP中的信息提醒。
uniapp中配置,实现uniapp后台推送消息功能
创建Android证书
登录DCloud开发中心的应用列表,根据应用uni-app应用标识找到对应的应用。点击应用名称进入应用详情。选择“Android云端证书”选项,点击“创建证书”。
生成后点击“证书详情”,可以查看证书的具体信息。
创建Android平台信息
将当前地址复制另开一窗口,在该应用的“各平台信息”中点击“新建”创建Android平台信息。
包名:是Android唯一值,一般使用域名倒置,类似Java中类的包名。
SHA1值、MD5、SHA256的信息在刚生成的证书详情得到。
开通uni-push功能
在左侧菜单中找到“uni-push”、“2.0(支持全端推送)”、“应用信息”。
在上面的当前应用,先切换到当前应用,“选择平台”取消“iOS”项,“Android包名”直接下拉选择刚配置的包名,关联服务空间选择开发环境选择的云服务空间,点击“开通应用”完成后端的配置。
客户端开通对应配置
在HBuilderX中,打开“manifest.json”,点击“APP模块配置”,选中“Push(消息推送)”的“uniPush2.0(全端支持)”。离线推送需要各个市场平台配置信息处理的。
客户端接收推送的消息,并状态栏提示处理
在App.vue的OnLaunch方法中增加代码,即应用启动就执行。
- import pushInit from '@/utils/unipush.js'
- pushInit()
增加unipush.js文件,主要功能接收推送消息,并状态栏提示,如果无状态栏提示功能,提醒用户打开权限。
- export default function() {
- //提示开通权限
- setPermissions()
- uni.onPushMessage(res => {
- console.log(res)
- if (res.type == 'receive') {
- // 接收到推送消息,弹出任务栏提醒
- uni.createPushMessage(res.data)
- } else if (res.type == 'click') {
- // 任务栏点击处理
- console.log(res)
- }
- })
- }
- /**
- * 设置手机通知权限
- */
- function setPermissions() {
- // #ifdef APP-PLUS
- if (plus.os.name == 'Android') { // 判断是Android
- var main = plus.android.runtimeMainActivity()
- var pkName = main.getPackageName()
- var uid = main.getApplicationInfo().plusGetAttribute('uid')
- var NotificationManagerCompat = plus.android.importClass('android.support.v4.app.NotificationManagerCompat')
- //android.support.v4升级为androidx
- if (NotificationManagerCompat == null) {
- NotificationManagerCompat = plus.android.importClass('androidx.core.app.NotificationManagerCompat')
- }
- var areNotificationsEnabled = NotificationManagerCompat.from(main).areNotificationsEnabled()
- // 未开通‘允许通知’权限,则弹窗提醒开通,并点击确认后,跳转到系统设置页面进行设置
- if (!areNotificationsEnabled) {
- uni.showModal({
- title: '通知权限开启提醒',
- content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
- showCancel: false,
- confirmText: '去设置',
- success: function(res) {
- if (res.confirm) {
- var Intent = plus.android.importClass('android.content.Intent')
- var Build = plus.android.importClass('android.os.Build')
- //android 8.0引导
- if (Build.VERSION.SDK_INT >= 26) {
- var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS')
- intent.putExtra('android.provider.extra.APP_PACKAGE', pkName)
- } else if (Build.VERSION.SDK_INT >= 21) { //android 5.0-7.0
- var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS')
- intent.putExtra('app_package', pkName)
- intent.putExtra('app_uid', uid)
- } else { //(<21)其他--跳转到该应用管理的详情页
- intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
- var uri = Uri.fromParts('package', mainActivity.getPackageName(), null)
- intent.setData(uri)
- }
- // 跳转到该应用的系统通知设置页
- main.startActivity(intent)
- }
- }
- })
- }
- } else if (plus.os.name == 'iOS') { // 判断是ISO
- var isOn = undefined
- var types = 0
- var app = plus.ios.invoke('UIApplication', 'sharedApplication')
- var settings = plus.ios.invoke(app, 'currentUserNotificationSettings')
- if (settings) {
- types = settings.plusGetAttribute('types')
- plus.ios.deleteObject(settings)
- } else {
- types = plus.ios.invoke(app, 'enabledRemoteNotificationTypes')
- }
- plus.ios.deleteObject(app)
- isOn = (0 != types)
- if (isOn == false) {
- uni.showModal({
- title: '通知权限开启提醒',
- content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
- showCancel: false,
- confirmText: '去设置',
- success: function(res) {
- if (res.confirm) {
- var app = plus.ios.invoke('UIApplication', 'sharedApplication')
- var setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:')
- plus.ios.invoke(app, 'openURL:', setting)
- plus.ios.deleteObject(setting)
- plus.ios.deleteObject(app)
- }
- }
- })
- }
- }
- // #endif
- }
开发云函数推送消息功能。
新建云函数“pushMessage”,并添加公共模块或扩展库依赖“uni-cloud-push”。
在云函数中增加代码,作用:把接收的参数通过push方式把数据传给客户端
- 'use strict'
- const uniPush = uniCloud.getPushManager({ appId: '__UNI__1234567' })
- const TOKEN = 'secret'
- exports.main = async (event, context) => {
- let { token, client_id, title, content, data } = event['queryStringParameters']
- if (token != TOKEN) {
- return { 'errCode': -1 }
- }
- client_id = client_id.split(',')
- data = JSON.parse(data)
- return await uniPush.sendMessage({
- 'push_clientid': client_id,
- 'title': title,
- 'content': content,
- 'payload': data
- })
- }
开放云函数连接
在服务空间列表中,选中指定的服务空间名称。在左侧找到函数/对象列表,在列表中找到“pushMessage”函数,点击“详情”进行配置。
在函数明细的最底部,点击“编辑”,设置URL部分,设置好后,外部即可使用URL进行调用即可。
apipost提交模拟
ThinkPHP代码
- public function testPushMessage()
- {
- $data = ['id' => 1, 'type' => 'order'];
- $ret = CommonUtil::http('https://test.ffhome.top/pushMessage', [], [
- 'token' => 'secret',
- 'client_id' => '87424fe315dbf675bb6f6adc61deb054',
- 'title' => 'title6',
- 'content' => 'content6',
- 'data' => json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
- ], 'POST');
- print_r($ret);
- $this->assertEquals(0, $ret['errCode']);
- }
应用推送结果示意
问题:ThinkPHP中怎么获得指定用户的clientId?
在客户端代码中可通过如下代码获得,获得后可以将clientId与登录账号信息提交到后端进行关联处理即可。
- uni.getPushClientId({
- success(res) {
- // clientId
- console.log(res.cid)
- }
- })
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |