在 Laravel 中使用 极光推送
最近在项目中需要用到推送,抽出时间看了看极光推送,记录一下
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
安装 Jpush
在 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 协议》,转载必须注明作者和本文链接
本帖由系统于 1年前 自动加精
感谢分享 👍
用laravel做推送,不考虑性能问题吗😁
startPush这个方法不存在的
极光的到达率咋样,我们之前也用的极光,但到达率不是太好,现在换成阿里的移动推送了
registrationId 应该如何获取, 如何和 user 表的用户对应?
App\BaseService 这个类是你自定义的吗?里面有什么内容?