您现在的位置是:首页 > 技术教程 正文

ThinkPHP推送uniapp消息

admin 阅读: 2024-03-16
后台-插件-广告管理-内容页头部广告(手机)

主要思路: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方法中增加代码,即应用启动就执行。

  1. import pushInit from '@/utils/unipush.js'
  2. pushInit()

增加unipush.js文件,主要功能接收推送消息,并状态栏提示,如果无状态栏提示功能,提醒用户打开权限。

  1. export default function() {
  2. //提示开通权限
  3. setPermissions()
  4. uni.onPushMessage(res => {
  5. console.log(res)
  6. if (res.type == 'receive') {
  7. // 接收到推送消息,弹出任务栏提醒
  8. uni.createPushMessage(res.data)
  9. } else if (res.type == 'click') {
  10. // 任务栏点击处理
  11. console.log(res)
  12. }
  13. })
  14. }
  15. /**
  16. * 设置手机通知权限
  17. */
  18. function setPermissions() {
  19. // #ifdef APP-PLUS
  20. if (plus.os.name == 'Android') { // 判断是Android
  21. var main = plus.android.runtimeMainActivity()
  22. var pkName = main.getPackageName()
  23. var uid = main.getApplicationInfo().plusGetAttribute('uid')
  24. var NotificationManagerCompat = plus.android.importClass('android.support.v4.app.NotificationManagerCompat')
  25. //android.support.v4升级为androidx
  26. if (NotificationManagerCompat == null) {
  27. NotificationManagerCompat = plus.android.importClass('androidx.core.app.NotificationManagerCompat')
  28. }
  29. var areNotificationsEnabled = NotificationManagerCompat.from(main).areNotificationsEnabled()
  30. // 未开通‘允许通知’权限,则弹窗提醒开通,并点击确认后,跳转到系统设置页面进行设置
  31. if (!areNotificationsEnabled) {
  32. uni.showModal({
  33. title: '通知权限开启提醒',
  34. content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
  35. showCancel: false,
  36. confirmText: '去设置',
  37. success: function(res) {
  38. if (res.confirm) {
  39. var Intent = plus.android.importClass('android.content.Intent')
  40. var Build = plus.android.importClass('android.os.Build')
  41. //android 8.0引导
  42. if (Build.VERSION.SDK_INT >= 26) {
  43. var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS')
  44. intent.putExtra('android.provider.extra.APP_PACKAGE', pkName)
  45. } else if (Build.VERSION.SDK_INT >= 21) { //android 5.0-7.0
  46. var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS')
  47. intent.putExtra('app_package', pkName)
  48. intent.putExtra('app_uid', uid)
  49. } else { //(<21)其他--跳转到该应用管理的详情页
  50. intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
  51. var uri = Uri.fromParts('package', mainActivity.getPackageName(), null)
  52. intent.setData(uri)
  53. }
  54. // 跳转到该应用的系统通知设置页
  55. main.startActivity(intent)
  56. }
  57. }
  58. })
  59. }
  60. } else if (plus.os.name == 'iOS') { // 判断是ISO
  61. var isOn = undefined
  62. var types = 0
  63. var app = plus.ios.invoke('UIApplication', 'sharedApplication')
  64. var settings = plus.ios.invoke(app, 'currentUserNotificationSettings')
  65. if (settings) {
  66. types = settings.plusGetAttribute('types')
  67. plus.ios.deleteObject(settings)
  68. } else {
  69. types = plus.ios.invoke(app, 'enabledRemoteNotificationTypes')
  70. }
  71. plus.ios.deleteObject(app)
  72. isOn = (0 != types)
  73. if (isOn == false) {
  74. uni.showModal({
  75. title: '通知权限开启提醒',
  76. content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
  77. showCancel: false,
  78. confirmText: '去设置',
  79. success: function(res) {
  80. if (res.confirm) {
  81. var app = plus.ios.invoke('UIApplication', 'sharedApplication')
  82. var setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:')
  83. plus.ios.invoke(app, 'openURL:', setting)
  84. plus.ios.deleteObject(setting)
  85. plus.ios.deleteObject(app)
  86. }
  87. }
  88. })
  89. }
  90. }
  91. // #endif
  92. }

开发云函数推送消息功能。

新建云函数“pushMessage”,并添加公共模块或扩展库依赖“uni-cloud-push”。


在云函数中增加代码,作用:把接收的参数通过push方式把数据传给客户端

  1. 'use strict'
  2. const uniPush = uniCloud.getPushManager({ appId: '__UNI__1234567' })
  3. const TOKEN = 'secret'
  4. exports.main = async (event, context) => {
  5. let { token, client_id, title, content, data } = event['queryStringParameters']
  6. if (token != TOKEN) {
  7. return { 'errCode': -1 }
  8. }
  9. client_id = client_id.split(',')
  10. data = JSON.parse(data)
  11. return await uniPush.sendMessage({
  12. 'push_clientid': client_id,
  13. 'title': title,
  14. 'content': content,
  15. 'payload': data
  16. })
  17. }

开放云函数连接

在服务空间列表中,选中指定的服务空间名称。在左侧找到函数/对象列表,在列表中找到“pushMessage”函数,点击“详情”进行配置。

在函数明细的最底部,点击“编辑”,设置URL部分,设置好后,外部即可使用URL进行调用即可。

apipost提交模拟

ThinkPHP代码

  1. public function testPushMessage()
  2. {
  3. $data = ['id' => 1, 'type' => 'order'];
  4. $ret = CommonUtil::http('https://test.ffhome.top/pushMessage', [], [
  5. 'token' => 'secret',
  6. 'client_id' => '87424fe315dbf675bb6f6adc61deb054',
  7. 'title' => 'title6',
  8. 'content' => 'content6',
  9. 'data' => json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
  10. ], 'POST');
  11. print_r($ret);
  12. $this->assertEquals(0, $ret['errCode']);
  13. }

应用推送结果示意

问题:ThinkPHP中怎么获得指定用户的clientId?

在客户端代码中可通过如下代码获得,获得后可以将clientId与登录账号信息提交到后端进行关联处理即可。

  1. uni.getPushClientId({
  2. success(res) {
  3. // clientId
  4. console.log(res.cid)
  5. }
  6. })

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索