juliangut / tify
统一推送通知服务抽象层
Requires
- php: >=5.5
- symfony/options-resolver: ^2.7|^3.0
- zendframework/zendservice-apple-apns: ^1.2
- zendframework/zendservice-google-gcm: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^1.0
- humbug/humbug: ~1.0@dev
- phpmd/phpmd: ^2.0
- phpunit/phpunit: ^4.5|^5.0
- sebastian/phpcpd: ^2.0
- squizlabs/php_codesniffer: ^2.0
README
Tify
统一推送通知服务抽象层,用于连接 Google GCM 和 Apple APNS 服务。
安装
使用 Composer 安装
composer require juliangut/tify
然后包含自动加载文件
require_once './vendor/autoload.php';
概念
接收器
将接收推送通知的各个设备。由推送通知服务(APNS 或 GCM)提供的设备 token
标识。
new \Jgut\Tify\Receiver\ApnsReceiver('device_token'); new \Jgut\Tify\Receiver\GcmReceiver('device_token');
device_token
的格式取决于服务类型。请查阅 APNS 和 GCM 文档以获取正确的格式。
消息
消息构成了到达接收器的最终信息。GCM 和 APNS 消息根据每个服务规范持有不同的信息。
为了创建消息有效负载,必须包含以下消息参数之一
- 对于 APNS
title
title_loc_key
body
loc_key
- 对于 GCM
title
title_loc_key
body
body_loc_key
消息可以包含任何数量的自定义有效负载数据,这些数据将组成发送到目标接收器附加的数据。
此键/值有效负载数据必须遵守某些限制,以同时与不同服务完全兼容,为此,自动添加了一个前缀(默认为 data_
)。如果需要,可以更改或删除此前缀,但请注意,有效负载数据不应是保留词(aps
、from
或以 google
或 gcm
开头的任何单词)或任何 GCM 通知参数。
在 这里 查找 APNS 消息参数,见表格 3-2。
在 这里 查找 GCM 消息参数,见表格 2。
通知
这是一个容器,用于保存消息及其关联的目标接收器。
通知是工作单元的核心,可以将多个通知设置为共享相同适配器但向不同接收器发送不同消息的 Tify 服务。
通知包含一些额外的参数,这些参数由推送通知服务用于控制行为或用于通知创建。
通过清除接收器列表或更改消息,可以将通知重复使用所需次数。
在 这里 查找 APNS 通知参数,见表格 3-1。
在 这里 查找 GCM 通知参数,见表格 1。
适配器
适配器将接收到通知,实际使用相应的通知服务将消息发送到相关接收器。接收器将根据其类型自动筛选以使用正确的服务。
对于 APNS 适配器,certificate
参数是强制性的,表示服务证书的路径(.pem 文件)。在 GCM 中,api_key
是强制参数,表示 Google API 密钥。
$apnsService = new \Jgut\Tify\Service\ApnsService(['certificate' => 'path_to_certificate.pem']); $gcmService = new \Jgut\Tify\Service\GcmService(['api_key' => 'google_api_key']);
结果
APNS 和 GCM 推送服务之间的响应非常不同,结果是一个响应抽象,旨在提供通用的接口来访问 APNS 和 GCM 服务返回的非相等数据。
这些对象由设备 token、日期、状态码(状态分类)和状态消息(对应于原始 APNS 或 GCM 响应状态)组成。
状态码
STATUS_SUCCESS
,推送成功STATUS_INVALID_DEVICE
,提供的设备令牌无效STATUS_INVALID_MESSAGE
,消息未正确组成STATUS_RATE_ERROR
,仅适用于GCMSTATUS_AUTH_ERROR
,仅适用于GCMSTATUS_SERVER_ERROR
STATUS_UNKNOWN_ERROR
在所有结果状态中,STATUS_INVALID_DEVICE
最有意思,因为这表明您可能需要从数据库中移除该令牌。
服务
为了简单起见,而不是逐个将通知传递给适配器,可以使用'Tify Service'将通知发送到相应的接收器,使用正确提供的适配器,自动将通知结果合并到一个返回数组中。
用法
推送
基本用法:创建一个要发送到不同适配器的单条消息。
use Jgut\Tify\Adapter\Apns\ApnsAdapter; use Jgut\Tify\Adapter\Gcm\GcmAdapter; use Jgut\Tify\Message; use Jgut\Tify\Notification; use Jgut\Tify\Receiver\ApnsReceiver; use Jgut\Tify\Receiver\GcmReceiver; use Jgut\Tify\Service; $adapters = [ new GcmAdapter(['api_key' => '00000']), new ApnsAdapter(['certificate' => 'path_to_certificate']), ]; $message = new Message([ 'title' => 'title', 'body' => 'body', ]); $receivers = [ new GcmReceiver('aaaaaaaaaaa'), new GcmReceiver('bbbbbbbbbbb'), new ApnsReceiver('ccccccccccc'), new ApnsReceiver('ddddddddddd'), ]; $service = new Service($adapters, new Notification($message, $receivers)); $results = $service->push();
共享相同的适配器发送不同的消息
use Jgut\Tify\Adapter\Gcm\GcmAdapter; use Jgut\Tify\Message; use Jgut\Tify\Notification; use Jgut\Tify\Receiver\GcmReceiver; use Jgut\Tify\Service; $adapters = [ new GcmAdapter(['api_key' => '00000']), new GcmAdapter(['api_key' => '11111']), ]; $service = new Service($adapters); $service->addNotification(new Notification( new Message([ 'title' => 'title_one', 'body' => 'body_one', ]), [ new GcmReceiver('aaaaaaaaaaa'), new GcmReceiver('bbbbbbbbbbb'), ] )); $service->addNotification(new Notification( new Message([ 'title' => 'title_two', 'body' => 'body_two', ]), [ new GcmReceiver('xxxxxxxxxxx'), new GcmReceiver('zzzzzzzzzzz'), ] )); $results = $service->push();
反馈
use Jgut\Tify\Adapter\Gcm\ApnsAdapter; use Jgut\Tify\Service; $adapters = [ new ApnsAdapter(['certificate' => 'path_to_certificate_one']), new ApnsAdapter(['certificate' => 'path_to_certificate_two']), ]; $service = new Service($adapters); $results = $service->feedback();
反馈返回包含令牌和过期设备令牌时间的Result对象。
贡献
发现了一个错误或有一个功能请求?请打开一个新问题。在提交之前请先查看现有的问题。
参见文件 CONTRIBUTING.md
许可
有关许可条款的副本,请参阅源代码中包含的文件 LICENSE。