laravel框架使用极光推送消息操作示例
发布:smiling 来源: PHP粉丝网 添加日期:2022-02-12 10:45:50 浏览: 评论:0
本文实例讲述了laravel框架使用极光推送消息,分享给大家供大家参考,具体如下:
最近需要使用极光推送往客户端推消息,所以这里记录下使用过程。
极光推送的服务端文档:
https://docs.jiguang.cn/jpush/server/push/server_overview/
极光推送服务端PHP代码:
https://github.com/jpush/jpush-api-php-client
在laravel项目下安装极光推送
composer require jpush/jpush
我们在config目录下创建一个jpush.php文件,用于获取key和secret
- <?php
- return [
- 'app_key' => env('JPUSH_APP_KEY', ''),
- 'master_secret' => env('JPUSH_MASTER_SECRET', ''),
- 'apns_production' => env('JPUSH_APNS_PRODUCTION', true),
- ];
然后在 .env 文件中配置相应参数
JPUSH_APP_KEY=
JPUSH_MASTER_SECRET=
JPUSH_APNS_PRODUCTION=true
然后我们在app目录下,创建一个 Services目录,并创建JPushService.php
- <?php
- namespace App\Services;
- use JPush\Client as JPush;
- use Log;
- class JPushService
- {
- protected static $client = null;
- //推送类型
- const PUSH_TYPE_ALL = 1;
- const PUSH_TYPE_TAG = 2;
- const PUSH_TYPE_ALIAS = 3;
- const PUSH_TYPE_REG_ID = 4;
- private function __construct()
- {
- }
- private function __clone()
- {
- }
- /**
- * 获取实例
- */
- public static function getInstance()
- {
- if (!self::$client) {
- self::$client = new JPush(config('jpush.app_key'), config('jpush.master_secret'), null);
- }
- return self::$client;
- }
- /**
- * 给android或ios推送消息
- */
- public static function pushNotify($params)
- {
- //推送平台
- $platform = $params['platform'] ?? 'all';
- //推送标题
- $title = $params['title'] ?? '';
- //推送内容
- $content = $params['content'] ?? '';
- //通知栏样式ID
- $builder_id = $params['builder_id'] ?? 0;
- //附加字段
- $extras = $params['extras'] ?? '';
- //推送类型
- $type = $params['type'] ?? '';
- //推送目标(注册ID)
- $reg_id = $params['reg_id'] ?? '';
- //推送目标(标签)
- $tag = $params['tag'] ?? '';
- //推送目标(别名)
- $alias = $params['alias'] ?? '';
- try {
- $push = self::getInstance()->push();
- //设置平台
- $push->setPlatform($platform);
- switch ($type) {
- case self::PUSH_TYPE_ALL:
- $push->addAllAudience();
- break;
- case self::PUSH_TYPE_TAG:
- $push->addTag($tag);
- break;
- case self::PUSH_TYPE_ALIAS:
- $push->addAlias($alias);
- break;
- case self::PUSH_TYPE_REG_ID:
- $push->addRegistrationId($reg_id);
- break;
- }
- $push->androidNotification($content, [
- 'title' => $title,
- 'builder_id' => $builder_id,
- 'extras' => $extras,
- ])->iosNotification($content, [
- 'sound' => 'sound',
- 'badge' => '+1',
- 'extras' => $extras
- ])->options([
- 'apns_production' => config('jpush.apns_production', true),
- //表示离线消息保留时长(秒)
- 'time_to_live' => 86400,
- ]);
- $response = $push->send();
- if ($response['http_code'] != 200) {
- Log::channel('jpush')->error(json_encode($response, JSON_UNESCAPED_UNICODE));
- }
- return $response;
- } catch (\Throwable $e) {
- Log::channel('jpush')->error(json_encode([
- 'file' => $e->getFile(),
- 'line' => $e->getLine(),
- 'message' => $e->getMessage(),
- 'params' => $params,
- ], JSON_UNESCAPED_UNICODE));
- }
- }
- /**
- * 获取指定设备的别名和标签
- */
- public static function getDevices($reg_id)
- {
- $response = self::getInstance()->device()->getDevices($reg_id);
- if ($response['http_code'] == 200) {
- return $response['body'];
- }
- return [];
- }
- /**
- * 给指定设备添加标签
- */
- public static function addTags($reg_id, $tags = [])
- {
- $response = self::getInstance()->device()->addTags($reg_id, $tags);
- if ($response['http_code'] == 200) {
- return true;
- }
- return false;
- }
- /**
- * 清空指定设备的标签
- */
- public static function clearTags($reg_id)
- {
- $response = self::getInstance()->device()->clearTags($reg_id);
- if ($response['http_code'] == 200) {
- return true;
- }
- return false;
- }
- /**
- * 清空指定设备的标签
- */
- public static function removeTags($reg_id, $tags = [])
- {
- $response = self::getInstance()->device()->removeTags($reg_id, $tags);
- if ($response['http_code'] == 200) {
- return true;
- }
- return false;
- }
- /**
- * 更新指定设备的别名
- */
- public static function updateAlias($reg_id, $alias)
- {
- $response = self::getInstance()->device()->updateAlias($reg_id, $alias);
- if ($response['http_code'] == 200) {
- return true;
- }
- return false;
- }
- }
创建完后,我们就可以在项目中调用 JPushService::pushNotify() 来推消息了。
- JPushService::pushNotify([
- //标题
- 'title' => '测试',
- //内容
- 'content' => '测试',
- //设备标识,跟设备相关
- 'reg_id' => 'xxxxxxxxxxx',
- //扩展字段
- 'extras' => [
- 'key' => 'value',
- ],
- //推送类型
- 'type' => JPushService::PUSH_TYPE_REG_ID,
- ]);
reg_id是前端安卓或IOS获取到后,传给PHP后端,然后跟用户关联,存起来。
注意,reg_id是跟设备相关的,同一个设备上的APP,当不同用户登陆时,reg_id是一样的,这样会导致一个问题。
A用户登APP后,又切换到B用户,那B用户会收到发送给A用户的消息,这会造成消息错乱。
解决方法:
通过别名来发送消息,因为一个设备只能绑定一个别名,当A用户登陆时,把 reg_id 绑定到别名 user_a,切换用户或退出时,就把别名置空。
然后B用户登陆,就把 reg_id 绑定到 user_b 上。推消息时,就通过别名来推送消息。
绑定别名(推荐使用用户ID来区分不同的别名):
JPushService::updateAlias($user->jpush_reg_id, 'user_id_' . $user->id);
置空别名:
JPushService::updateAlias($user->jpush_reg_id, '');
通过别名发送:
- JPushService::pushNotify([
- 'title' => '测试',
- 'content' => '测试',
- 'alias' => 'user_id_' . $message->receive_id,
- 'extras' => $extras,
- 'type' => JPushService::PUSH_TYPE_ALIAS,
- ]);
Tags: laravel极光推送消息
- 上一篇:laravel框架使用阿里云短信发送消息操作示例
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)