最近在專案中需要用到推送,抽出時間看了看極光推送,記錄一下
Github地址:https://github.com/jpush/jpush-api-php-cli...
Push API:https://github.com/jpush/jpush-api-php-cli...
極光推送官方文件地址:https://docs.jiguang.cn/jpush/server/push/...
- PHP 7.1.29
- Laravel 5.6
在 composer.json
檔案中的 require
下新增 "jpush/jpush": "^3.6"
"require": {
"jpush/jpush": "^3.6",
},
執行命令:composer install
在 config
目錄下新建檔案 Jpush.php
並進行如下配置:
return [
'android_app_key' => env('JPUSH_APP_KEY'),
'android_master_secret' => env('JPUSH_APP_MASTER_SECRET'),
'ios_app_key' => env('JPUSH_IOS_KEY'),
'ios_master_secret' => env('JPUSH_IOS_MASTER_SECRET'),
// 環境 true-生產環境 false-開發環境
'environment' => env('JPUSH_APNS_PRODUCTION', true),
];
.env
檔案進行如下配置:
JPUSH_APP_KEY=極光推送的app_key(android)
JPUSH_APP_MASTER_SECRET=極光推送的master_secret(android)
JPUSH_IOS_KEY=極光推送的app_key(ios)
JPUSH_IOS_MASTER_SECRET=極光推送的master_secret(ios)
JPUSH_APNS_PRODUCTION=true
在 Modules
目錄下新建目錄 Jpush
,然後在 Jpush
目錄下新建檔案 JpushService.php
內容如下:
<?php
namespace App\Modules\Jpush;
use App\BaseService;
use App\Exceptions\BaseResponseException;
use JPush\Client;
use Log;
class JpushService extends BaseService
{
/**
* 初始化 JPushClient
* @param $app
* @return Client
*/
public static function newJpushClient($app)
{
if ($app == 'android') {
$appKey = config('Jpush.android_app_key');
$master = config('Jpush.android_master_secret');
} elseif ($app == 'ios') {
$appKey = config('Jpush.ios_app_key');
$master = config('Jpush.ios_master_secret');
} else {
throw new BaseResponseException('APP型別錯誤');
}
$client = new Client($appKey, $master);
return $client;
}
/**
* android 或 ios 透過 別名 給單個裝置或多個裝置推送訊息
* @param $params
* @return array
*/
public static function androidOrIosPushByAlias($params)
{
// 推送平臺
$platform = array_get($params, 'platform');
// 推送標題
$title = array_get($params, 'title');
// 推送內容
$content = array_get($params, 'content');
// 通知欄樣式 ID
$builderId = array_get($params, 'builderId');
// 附加欄位 (可用於給前端返回,進行其他業務操作,例如:返回orderId,用於點選通知後跳轉到訂單詳情頁面)
$extras = array_get($params, 'extras');
// 推送目標 (別名)
$alias = array_get($params, 'alias');
// 推送目標 (註冊ID)
$registrationId = array_get($params, 'registrationId');
// 推送型別 (1-別名 2-註冊id 3-全部(ios 或 android))
$type = array_get($params, 'type');
// 返回一個推送 Payload 構建器
$push = self::newJpushClient($platform)->push();
$push->setPlatform($platform);
switch ($type) {
// 透過別名推送
case 1:
$push->addAlias($alias);
break;
// 透過註冊 ID 推送
case 2:
$push->addRegistrationId($registrationId);
break;
// 推送全部(android 或 ios)
case 3:
$push->addAllAudience();
break;
}
$push->androidNotification($content, [ // android 通知
"title" => $title,
"builder_id" => $builderId,
"extras" => $extras,
])->iosNotification($content, [ // ios 通知
"sound" => "sound", // 通知提示聲音,如果無此欄位,則此訊息無聲音提示;
"badge" => "+1", // 應用角標(APP右上角的數字)0 清除 預設 +1
"extras" => $extras
])->options([ // 推送引數
'apns_production' => config('Jpush.environment') // APNs 是否生產環境 (ios)
]);
$response = $push->send();
if ($response['http_code'] != 200) {
Log::info('推送失敗 by alias',
compact('response', 'type', 'platform', 'alias', 'registrationId', 'title', 'content')
);
}
return $response;
}
}
新建路由:
// 手動推送測試(極光推送)
Route::post('message/jpush', 'MessageController@testJpush');
新建控制器並新增方法如下:
/**
* 手動測試推送(極光推送)
*/
public function testJpush()
{
// 推送平臺 ios android
$params['platform'] = 'android';
// 推送標題
$params['title'] = '恭喜您中獎了!';
// 推送內容
$params['content'] = '恭喜您中獎了!500萬元大獎哦!';
// 通知欄樣式 ID
$params['builderId'] = 1;
// 附加欄位(這裡自定義 Key / value 資訊,以供業務使用)
$params['extras'] = [
'orderid' => 13545,
];
// 推送型別 1-別名 2-註冊id 3-全部
$params['type'] = 1;
// 註冊ID 可以是單個 也可以是 陣列
// $params['registrationId'] = '170976fsdas554ewerr98f28';
// or
// $params['registrationId'] = [
// '170976fsdas554ewerr98f28',
// '120c8545we15we46b8929e'
// ];
// 別名 可以是單個 也可以是 陣列
// $params['alias'] = '51651545154';
// or
// $params['alias'] = [
// '51651545154',
// '61654564897',
// ];
// 開始推送
$data = JpushService::androidOrIosPushByAlias($params);
dd($data);
}
最後,請求該測試方法,得到返回結果如下:
本文只用到了最常用的通知欄推送
,如需其他方式請參考 官方文件。
以上方法在 android demo 以及 ios 真機測試過,可用,Good Luck,Thanks♪(・ω・)ノ。
本作品採用《CC 協議》,轉載必須註明作者和本文連結