laravel框架使用極光推送消息操作示例
本文實例講述了laravel框架使用極光推送消息。分享給大家供大家參考,具體如下:
最近需要使用極光推送往客戶端推消息,所以這里記錄下使用過程。
極光推送的服務(wù)端文檔:
https://docs.jiguang.cn/jpush/server/push/server_overview/
極光推送服務(wù)端PHP代碼:
https://github.com/jpush/jpush-api-php-client
在laravel項目下安裝極光推送
composer require jpush/jpush
我們在config目錄下創(chuàng)建一個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 文件中配置相應(yīng)參數(shù)
JPUSH_APP_KEY= JPUSH_MASTER_SECRET= JPUSH_APNS_PRODUCTION=true
然后我們在app目錄下,創(chuàng)建一個 Services目錄,并創(chuàng)建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'] ?? ''; //推送內(nèi)容 $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(); //設(shè)置平臺 $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)); } } /** * 獲取指定設(shè)備的別名和標簽 */ public static function getDevices($reg_id) { $response = self::getInstance()->device()->getDevices($reg_id); if ($response['http_code'] == 200) { return $response['body']; } return []; } /** * 給指定設(shè)備添加標簽 */ public static function addTags($reg_id, $tags = []) { $response = self::getInstance()->device()->addTags($reg_id, $tags); if ($response['http_code'] == 200) { return true; } return false; } /** * 清空指定設(shè)備的標簽 */ public static function clearTags($reg_id) { $response = self::getInstance()->device()->clearTags($reg_id); if ($response['http_code'] == 200) { return true; } return false; } /** * 清空指定設(shè)備的標簽 */ public static function removeTags($reg_id, $tags = []) { $response = self::getInstance()->device()->removeTags($reg_id, $tags); if ($response['http_code'] == 200) { return true; } return false; } /** * 更新指定設(shè)備的別名 */ public static function updateAlias($reg_id, $alias) { $response = self::getInstance()->device()->updateAlias($reg_id, $alias); if ($response['http_code'] == 200) { return true; } return false; } }
創(chuàng)建完后,我們就可以在項目中調(diào)用 JPushService::pushNotify() 來推消息了。
JPushService::pushNotify([ //標題 'title' => '測試', //內(nèi)容 'content' => '測試', //設(shè)備標識,跟設(shè)備相關(guān) 'reg_id' => 'xxxxxxxxxxx', //擴展字段 'extras' => [ 'key' => 'value', ], //推送類型 'type' => JPushService::PUSH_TYPE_REG_ID, ]);
reg_id是前端安卓或IOS獲取到后,傳給PHP后端,然后跟用戶關(guān)聯(lián),存起來。
注意,reg_id是跟設(shè)備相關(guān)的,同一個設(shè)備上的APP,當(dāng)不同用戶登陸時,reg_id是一樣的,這樣會導(dǎo)致一個問題。
A用戶登APP后,又切換到B用戶,那B用戶會收到發(fā)送給A用戶的消息,這會造成消息錯亂。
解決方法:
通過別名來發(fā)送消息,因為一個設(shè)備只能綁定一個別名,當(dāng)A用戶登陸時,把 reg_id 綁定到別名 user_a,切換用戶或退出時,就把別名置空。
然后B用戶登陸,就把 reg_id 綁定到 user_b 上。推消息時,就通過別名來推送消息。
綁定別名(推薦使用用戶ID來區(qū)分不同的別名):
JPushService::updateAlias($user->jpush_reg_id, 'user_id_' . $user->id);
置空別名:
JPushService::updateAlias($user->jpush_reg_id, '');
通過別名發(fā)送:
JPushService::pushNotify([ 'title' => '測試', 'content' => '測試', 'alias' => 'user_id_' . $message->receive_id, 'extras' => $extras, 'type' => JPushService::PUSH_TYPE_ALIAS, ]);
更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進階教程》、《php優(yōu)秀開發(fā)框架總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家基于Laravel框架的PHP程序設(shè)計有所幫助。
- Laravel使用swoole實現(xiàn)websocket主動消息推送的方法介紹
- laravel框架使用阿里云短信發(fā)送消息操作示例
- Laravel admin實現(xiàn)消息提醒、播放音頻功能
- Laravel Validator自定義錯誤返回提示消息并在前端展示
- Laravel使用消息隊列需要注意的一些問題
- PHP的Laravel框架中使用消息隊列queue及異步隊列的方法
- 在Laravel框架里實現(xiàn)發(fā)送郵件實例(郵箱驗證)
- Laravel框架實現(xiàn)發(fā)送短信驗證功能代碼
- 使用 laravel sms 構(gòu)建短信驗證碼發(fā)送校驗功能
- laravel5.4利用163郵箱發(fā)送郵件的步驟詳解
- laravel中短信發(fā)送驗證碼的實現(xiàn)方法
- 用Laravel Sms實現(xiàn)laravel短信驗證碼的發(fā)送的實現(xiàn)
相關(guān)文章
PHP實現(xiàn)保存網(wǎng)站用戶密碼到css文件(通用型)
這篇文章主要介紹了PHP實現(xiàn)保存網(wǎng)站用戶密碼到css文件(通用型),的實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11CodeIgniter框架提示Disallowed Key Characters的解決辦法
在做項目過程中,出現(xiàn)提交form表單的時候,出現(xiàn)了Disallowed Key Characters 的提示2014-04-04laravel5.1框架model類查詢的實現(xiàn)方法
今天小編就為大家分享一篇laravel5.1框架model類查詢的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10PHP以json或xml格式返回請求數(shù)據(jù)的方法
今天小編就為大家分享一篇PHP以json或xml格式返回請求數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Ubuntu中啟用php的mail()函數(shù)并解決發(fā)送郵件速度慢問題
本文主要給大家介紹的是在Ubuntu下安裝sendmail的方法,以及啟用sendmail之后,php發(fā)送郵件緩慢的原因及解決方法,有需要的小伙伴可以參考下。2015-03-03thinkPHP框架實現(xiàn)圖像裁剪、縮放、加水印的方法
這篇文章主要介紹了thinkPHP框架實現(xiàn)圖像裁剪、縮放、加水印的方法,結(jié)合實例形式給出了thinkPHP針對圖片進行裁剪、縮放及加水印的自定義函數(shù),具有一定參考借鑒價值,需要的朋友可以參考下2017-03-03