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)
        }
      })

  • 26
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值