前段时间迁移小米推送部分代码,这部分之前是其他人负责的。读了代码,发现了两点:

所有接口的实现除了url和传参基本都是一致的

android和ios的设备需要分别推送一次

刚好这段时间了解了一下php的重载概念【动态的创建类属型和方法,不同于java等的参数不同方法名相通的概念,具体的概念可以RTFM】和curl的并发方式,所以

对于以上第一点:是否可以利用php的重载概念,用魔术方法__call()动态的变更接口调用的url参数和请求参数,去实现对小米推送不同接口的调用,也就是说我们所有的调用逻辑都是实现在__call这一个方法中,却对外提供小米推送不同接口的调用方法,这样就会极大的简化代码

对于以上第二点:是否可以利用curl的并行方式一次性推送给android和ios设备,这样理论上我们可以减少一次推送调用的时间,因为我们不需要再去等待给一类设备推送完了,再去推送给另一类设备

接下来,我们开始造代码。首先,构造一个mipush的实体,实体的成员属性包括:运行环境、初始化的一些配置参数、所实现的小米接口的信息(接口uri和参数等)/**

* 运行环境 develop:开发环境 product:生产环境

* @var string

*/

private $_environment = 'develop';

/**

* 设备系统类型 android ios

* @var string

*/

private $_osType = '';

/**

* 小米推送域名

* @var string

*/

private $_host = '';

/**

* 请求头

* @var string

*/

private $_headers = '';

/**

* 接口url

* @var string

*/

private $_url = '';

/**

* 调用的接口方法名称

* @var array

*/

private $_function = [];

/**

* 请求参数

* @var array

*/

private $_data = [];

/**

* 小米推送设置

* @var array

*/

private $_options = [

'title' => '消息通知自定义title',

'restricted_package_name' => '',

'pass_through' => 0, // 0 通知栏消息 1 透传

'notify_type' => -1, // -1:默认所有,1:使用默认提示音提示,2:使用默认震动提示,4:使用默认led灯光提示

'time_to_send' => 0, // 定时推送 单位毫秒 默认0

];

/**

* 运行环境配置

* @var array

*/

private static $_environmentConfig = [

'domain' => [

'product' => 'https://api.xmpush.xiaomi.com/',

'develop' => 'https://sandbox.xmpush.xiaomi.com/'

],

];

/**

* 小米推送接口信息定义

*

* url/请求参数

* @var array

*/

private $_functionDefine = [

'regid' => [

'uri' => 'v3/message/regid',

'arguments' => [

'registration_id' => [

'type' => 'array',

'must' => 'y'

],

'description' => [

'type' => 'string',

'must' => 'y'

],

'params' => [//自定义参数

'type' => 'array',

'must' => 'n'

],

]

],

'userAccount' => [

'uri' => 'v2/message/user_account',

'arguments' => [

'user_account' => [

'type' => 'array',

'must' => 'y'

],

'description' => [

'type' => 'string',

'must' => 'y'

],

'params' => [//自定义参数

'type' => 'array',

'must' => 'n'

],

]

],

'alias' => [

'uri' => 'v3/message/alias',

'arguments' => [

'alias' => [

'type' => 'array',

'must' => 'y'

],

'description' => [

'type' => 'string',

'must' => 'y'

],

'params' => [//自定义参数

'type' => 'array',

'must' => 'n'

],

]

],

'topic' => [

'uri' => 'v3/message/topic',

'arguments' => [

'topics' => [

'type' => 'array',

'must' => 'y'

],

'description' => [

'type' => 'string',

'must' => 'y'

],

'params' => [//自定义参数

'type' => 'array',

'must' => 'n'

],

]

],

'multiTopic' => [

'uri' => 'v3/message/multi_topic',

'arguments' => [

'topics' => [

'type' => 'array',

'must' => 'y'

],

'topics_op' => [// UNION并集,INTERSECTION交集,EXCEPT差集

'type' => 'string',

'must' => 'y'

],

'description' => [

'type' => 'string',

'must' => 'y'

],

'params' => [//自定义参数

'type' => 'array',

'must' => 'n'

],

]

],

'all' => [

'uri' => 'v3/message/all',

'arguments' => [

'description' => [

'type' => 'string',

'must' => 'y'

],

'params' => [//自定义参数

'type' => 'array',

'must' => 'n'

],

]

],

];

mipush实体的构造函数:实现对一系列配置的初始化/**

* 初始化配置

*

* @param $string $os_type 系统类型

* @param $string $config 配置

* @param array $options 设置 [

* 'title' => 'string,标题',

* 'pass_through' => 'tinyint,0通知栏消息,1透传,默认0'

* 'notify_type' => 'tinyint,-1,1,2,3,4',

* 'time_to_send' => 'int, 定时推送, 毫秒'

* ]

* @param string $environment 环境

*/

public function __construct($os_type='', $config=array(), $options=array(), $environment='')

{

/* init environment */

if ($environment) {

$this->_environment = $environment;

}

if ($os_type === 'ios') {

$this->_host = self::$_environmentConfig['domain'][$this->_environment];// ios

}else{

$this->_host = self::$_environmentConfig['domain']['product'];// android

}

/* init option */

$this->_headers = [];

$this->_headers[] = 'Authorization: key=' . $config['secret'];

if ($os_type === 'android') {

$this->_options['restricted_package_name'] = $config['package_name'];

}

foreach ($this->_options as $k => &$v) {

if (in_array($k, $options)) {

$v = $options[$k];

}

}

}

mipush实体的魔法方法__call:动态实现对小米推送接口的参数验证和调用,以至于我们未来实现新的小米推送接口及实现配置就可以。/**

* 魔术方法

*

* 重载对象方法

* @param string $name 小米推送方法名称

* @param array $arguments 请求参数

* @return mixed void||object

*/

public function __call($name,$arguments)

{

$arguments = $arguments[0];

$this->_function = $this->_functionDefine[$name];

$this->_url = $this->_host . $this->_function['uri'];

$this->dataCheck($arguments);

switch ($name) {

case 'regid':

$this->_data['registration_id'] = $arguments['registration_id'];

break;

case 'userAccount':

$this->_data['user_account'] = implode(',', $arguments['user_account']);

break;

case 'alias':

$this->_data['alias'] = implode(',', $arguments['alias']);

break;

case 'topic':

$this->_data['topic'] = $arguments['topic'];

break;

case 'multiTopic':

$this->_data['topics'] = implode(";$;", $arguments['topics']);

$this->_data['topic_op'] = $arguments['topic_op'];

break;

case 'all':

$this->_data['topics'] = implode(";$;", $topics);

$this->_data['topic_op'] = 'UNION';

break;

default:

throw new \Exception('Sorry, This function is useless in this version', 404);

break;

}

$this->_data['description'] = $arguments['description'];

if($arguments['params']) {

foreach ($arguments['params'] as $k => $v) {

$this->_data['extra.'.$k] = $v;// 自定义参数

}

}

if ($this->_osType === 'android') {

$this->_data = array_merge($this->_data, $this->_options);

}

}

定义完小米推送实体后,我们只需要通过mipush这个实体,实例化生产不同设备类型的对象,再由curl并行的方式发起推送即可。/**

* 并行推送

*

* @param Mipush $mipush_ios ios端实体

* @param Mipush $mipush_android android端实体

* @return array 推送结果

*/

private static function curlRequest(Mipush $mipush_ios, Mipush $mipush_android)

{

$ch_ios = curl_init();

$ch_android = curl_init();

curl_setopt($ch_ios, CURLOPT_URL, $mipush_ios->_url);

curl_setopt($ch_ios, CURLOPT_POST, 1);

curl_setopt($ch_ios, CURLOPT_POSTFIELDS, $mipush_ios->_data);

curl_setopt($ch_ios, CURLOPT_HTTPHEADER, $mipush_ios->_headers);

curl_setopt($ch_ios, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch_android, CURLOPT_URL, $mipush_android->_url);

curl_setopt($ch_android, CURLOPT_POST, 1);

curl_setopt($ch_android, CURLOPT_POSTFIELDS, $mipush_android->_data);

curl_setopt($ch_android, CURLOPT_HTTPHEADER, $mipush_android->_headers);

curl_setopt($ch_android, CURLOPT_RETURNTRANSFER, 1);

$mh = curl_multi_init();

curl_multi_add_handle($mh, $ch_ios);

curl_multi_add_handle($mh, $ch_android);

$running=null;

do {

curl_multi_exec($mh,$running);

} while($running > 0);

$result['ios'] = json_decode(curl_multi_getcontent($ch_ios), true);

$result['android'] = json_decode(curl_multi_getcontent($ch_android), true);

curl_multi_remove_handle($mh, $ch_ios);

curl_multi_remove_handle($mh, $ch_android);

curl_multi_close($mh);

return $result;

}

以上就是这些了,通过以上的方式我们就用很少的代码封装了一个小米sdk,目前只实现了按regid(登记id),alias(别名),user_account(用户账号),topic(标签), multi_topic(多标签),all(全体)推送。

如何使用?

还没发布过packagist,我把这个发布到了packagist,有兴趣的同学可以自行google,haha~composer require tigerb/easy-mipush

使用格式:

try {

Push::init(

['secret' => 'string,必传,ios密钥'],

['secret' => 'string,必传,android密钥', 'package_name' => 'string,必传,android包名']

[

'title' => 'string,非必传,消息通知自定义title',

'pass_through' => 'int,非必传,0通知栏消息,1透传,默认0',

'notify_type' => 'int,非必传,-1:默认所有,1:使用默认提示音提示,2:使用默认震动提示,4:使用默认led灯光提示',

'time_to_send' => 'int,非必传,定时推送,单位毫秒,默认0',

],

'string,develop开发环境,product生产环境, 默认develop'

);

$res = Push::toUse('string,小米push方法名', 'array, 该方法对应的参数');

echo json_encode($res, JSON_UNESCAPED_UNICODE);

} catch (Exception $e) {

echo $e->getMessage();

}

使用示例:

use Mipush\Push;

require './vendor/autoload.php';

try {

Push::init(

['secret' => 'test'],

['secret' => 'test', 'package_name' => 'com.test'],

[

'title' => 'test',

'pass_through' => 0,

'notify_type' => -1,

'time_to_send' => 0,

],

'develop'

);

$res = Push::toUse('userAccount', [

'user_account' => [1],

'description' => 'test'

]);

echo json_encode($res, JSON_UNESCAPED_UNICODE);

} catch (Exception $e) {

echo $e->getMessage();

}

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

小米推送php文档,利用php重载和curl的并行方式优雅的封装小米推送sdk相关推荐

  1. 一封传话聚合推送API文档

    一封传话聚合推送API文档 前言 [一封传话]是一款聚合推送工具,提供微信公众号.飞书.钉钉.企业微信群机器人.企微通知应用.邮件.自定义Webhook消息推送API.主要API只有一个,必传参数也只 ...

  2. spring-boot整合smart-doc推送接口文档到torna报错Failure to find xxx... resolution will not be reattempted until

    spring-boot整合smart-doc推送接口文档到torna报错Failure to find xxx- resolution will not be reattempted until th ...

  3. 小米手机控制PPT文档、查看进度的那些事

    http://www.xiaomi.cn/content-132-11884-1.html 小米手机控制PPT文档.查看进度的那些事 原文链接:http://bbs.xiaomi.cn/thread- ...

  4. 推特开发者账号【推特开发者文档系列3】——推特标准接口API的请求频率限制说明

    本系列是对推特开发者文档进行的翻译,以便帮助开发人员使用API接口,难免有些地方存在不足,还请谅解. 关于推特开发者账号 elevated academic 请看此贴: 推特开发者账号申请权限 或 搜 ...

  5. Twitter开发者账号【推特开发者文档系列10】——API参考索引

    本系列是对推特开发者文档进行的翻译,以便帮助开发人员使用API接口,难免有些地方存在不足,还请谅解. 关于推特开发者账号 elevated academic 请看此贴: 推特开发者账号申请权限 或 搜 ...

  6. Twitter开发者账号申请被拒【推特开发者文档系列6】——Twitter IDs(snowflake)

    文章转自:https://www.jianshu.com/p/c199f8767d19 本系列是对推特开发者文档进行的翻译,以便帮助开发人员使用API接口,难免有些地方存在不足,还请谅解. 关于如何获 ...

  7. 推特开发者账号申请失败【推特开发者文档系列7】——通过API接口发布、检索推文

    文章转自:https://www.jianshu.com/p/2c208994ff9a 本系列是对推特开发者文档进行的翻译,以便帮助开发人员使用API接口,难免有些地方存在不足,还请谅解. 关于如何获 ...

  8. Twitter开发者账号申请【推特开发者文档系列5】——Response codes和错误代码

    本系列是对推特开发者文档进行的翻译,以便帮助开发人员使用API接口,难免有些地方存在不足,还请谅解. 关于推特开发者账号 elevated academic 请看此贴: 推特开发者账号申请权限 或 搜 ...

  9. 极光推送服务器端文档,Android SDK 集成指南

    极光统计 Android SDK 集成指南 使用提示 本文是JAnalytics Android SDK 标准的集成指南文档. 匹配的 SDK 版本为:v1.0.0及以后版本. 如果您想要快速地测试. ...

最新文章

  1. linux下中文的wchar转char,Linux 下char转换为wchar_t
  2. 【直播预告】如何设计性能更强的CNN模型
  3. OpenGL noperspective在窗口空间中线性插值的实例
  4. 【LSB】图片隐写文档大纲
  5. 字符串操作截取后面的字符串_对字符串的5个必知的熊猫操作
  6. Android开发笔记(一百二十九)使用变换图形
  7. 变量“componentresourcemanager”未声明或从未赋值_频繁出现在面试题中,却容易被人遗忘:变量、基本数据类型...
  8. 【知识科普】嵌入式软件开发是什么?
  9. 中国省份城市数据库表
  10. [渝粤教育] 西南科技大学 教育心理学 在线考试复习资料
  11. Word分栏出现空白怎么解决
  12. css层叠排版,请收下这72个炫酷的CSS技巧
  13. linux命令行自制屏保,Linux终端界面屏保
  14. 一次服务器硬盘损坏修复记录贴(顺便把服务器硬件信息都搞清楚了)
  15. Sketch基础学习
  16. Apache 配置------FastCGI方式使用PHP(包含:linux下编译安装fmod_fcgid,配置apache以支持FastCGI)
  17. python特殊符号
  18. c语言(15 5)是多少,试题五(共 15分) 阅读以下关于 C语言及 C代码的叙述,回答问题 1至..._考试资料网...
  19. MXNet预训练模型下载 ResNet 50 101
  20. python之父是( )_Python之父加入微软,一开口就知道是老“凡学家”了

热门文章

  1. wannafly挑战赛4C-水题思维-割草机
  2. kafka 在线修改副本数
  3. php 如何处理图片流,PHP 处理图片
  4. html页面阅读pdf,HTML5在线PDF格式文件阅读器
  5. 【笔记】行测——常识判断之经济常识总结与归纳(二)
  6. electron ant-design-vue 不能用_羽绒服上的脏怎么去除小窍门-羽绒服不能水洗要怎么洗...
  7. OpenMeetins音视频参数 设置及优化
  8. MusicPlay 音乐播放器(纯前端)
  9. Spring Profiles的几个小知识
  10. Linux网络-数据链路层,MAC帧解析,ARP协议