公司的客户端的推送选用友盟推送,但是友盟的官方文档描述很少,对新手很不友好,所以特写此采坑纪录,废话不多说上代码。

公司业务只涉及单播和广播。所以只提供了单播和广播,业务拓展的话会补充其余部分。

消息推送代码:

 <?php
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidBroadcast.php');
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidFilecast.php');
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidGroupcast.php');
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidUnicast.php');
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidCustomizedcast.php');
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSBroadcast.php');
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSFilecast.php');
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSGroupcast.php');
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSUnicast.php');
require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSCustomizedcast.php'); class Be_Libs_UmengMsg {
protected static $appkey = '';
protected static $appMasterSecret = '';
protected static $validation_token = NULL;
protected static $device_tokens = '';
  
public static function __init($type) {
$configs = Be_Config::k('umeng.'.$type); //根据IOS/Android获取appkey和密钥
self::$appkey = $configs['appkey'];
self::$appMasterSecret = $configs['appMasterSecret'];
}
   //Android 单播
public static function sendAndroidUnicast($data) {
self::__init('android');
try {
$unicast = new AndroidUnicast();
$unicast->setAppMasterSecret(self::$appMasterSecret);
$unicast->setPredefinedKeyValue("appkey",self::$appkey);
$unicast->setPredefinedKeyValue("timestamp",strval(time()));
$unicast->setPredefinedKeyValue("device_tokens",$data['token']);
$unicast->setPredefinedKeyValue("ticker",$data['title']);
$unicast->setPredefinedKeyValue("title",$data['title']);
$unicast->setPredefinedKeyValue("text",$data['content']);
$unicast->setPredefinedKeyValue("after_open","go_app");
$unicast->setPredefinedKeyValue("production_mode", "false");
$unicast->setPredefinedKeyValue("mipush",true);
$unicast->setPredefinedKeyValue("mi_activity",'xxx');
$unicast->setExtraField("scheme",$data['scheme']);
$unicast->setExtraField("badge",$data['badge']);
$unicast->send();
} catch (Exception $e) {
return $e->getMessage();
}
return true;
}
   //Android广播
public static function sendAndroidBroadcast($data) {
self::__init(strtolower($data['platform']));
try {
$brocast = new AndroidBroadcast();
$brocast->setAppMasterSecret(self::$appMasterSecret);
$brocast->setPredefinedKeyValue("appkey", self::$appkey);
$brocast->setPredefinedKeyValue("timestamp", strval(time()));
$brocast->setPredefinedKeyValue("ticker", '测试副标题');
$brocast->setPredefinedKeyValue("title", '测试标题');
$brocast->setPredefinedKeyValue("text", '测试描述');
$brocast->setPredefinedKeyValue("after_open", "go_url");
$brocast->setPredefinedKeyValue("url", 'http://www.baidu.com');
$brocast->setPredefinedKeyValue("production_mode", "false");
$brocast->setExtraField("scheme", "xxxx");
$brocast->send();
} catch (Exception $e) {
return $e->getMessage();
}
return true;
}
   //IOS单播
public static function sendIOSUnicast($data) {
self::__init(strtolower('ios'));
$alert = array(
"title" => $data['title'],
"subtitle" => $data['subtitle'],
"body" => $data['content'],
"url" => $data['url'],
"scheme" => $data['scheme'],
);
try {
$unicast = new IOSUnicast();
$unicast->setAppMasterSecret(self::$appMasterSecret);
$unicast->setPredefinedKeyValue("appkey",self::$appkey);
$unicast->setPredefinedKeyValue("timestamp",strval(time()));
$unicast->setPredefinedKeyValue("device_tokens",$data['token']);
$unicast->setPredefinedKeyValue("badge",$data['badge']);
$unicast->setPredefinedKeyValue("sound", "default");
$unicast->setPredefinedKeyValue("alert", $alert);
$unicast->setPredefinedKeyValue("production_mode", "false");
$unicast->send();
} catch (Exception $e) {
return $e->getMessage();
}
return true;
}
   //IOS广播
public static function sendIOSBroadcast($data) {
self::__init(strtolower($data['platform']));
$alert = array(
"title" => '测试标题',
"subtitle" => '测试副标题',
"body" => '测试描述',
"url" => 'http://www.baidu.com',
"scheme" => "xxxx",
);
try {
$brocast = new IOSBroadcast();
$brocast->setAppMasterSecret($this->appMasterSecret);
$brocast->setPredefinedKeyValue("appkey", $this->appkey);
$brocast->setPredefinedKeyValue("timestamp", strval(time()));
$brocast->setPredefinedKeyValue("alert", $alert);
$brocast->setPredefinedKeyValue("badge", 0);
//$brocast->setPredefinedKeyValue("sound", "chime");
// Set 'production_mode' to 'true' if your app is under production mode
$brocast->setPredefinedKeyValue("production_mode", "false");
// Set customized fields
//$brocast->setCustomizedField("test", "helloworld");
$brocast->send();
} catch (Exception $e) {
return $e->getMessage();
}
return true;
} }

采坑纪录:

  1.IOS传值问题

    IOS传自定义参数的方式与Android不同,需要使用alert参数,自定义参数使用数组方式。详见IOS单播。

  2.Android设置 MIUI、EMUI、Flyme系统设备离线转为系统下发 报错

$unicast->setPredefinedKeyValue("mipush",true);
$unicast->setPredefinedKeyValue("mi_activity",'xxx');

  直接在代码中添加这两个参数会报错。处理方法:

  需要在UmengNotification.php文件内添加两个字段,否则会报错。

  原代码:

protected $DATA_KEYS = array("appkey", "timestamp", "type", "device_tokens", "alias", "alias_type", "file_id", "filter", "production_mode",
"feedback", "description", "thirdparty_id");

  改为:

protected $DATA_KEYS = array("appkey", "timestamp", "type", "device_tokens", "alias", "alias_type", "file_id", "filter", "production_mode",
"feedback", "description", "thirdparty_id", "mipush", "mi_activity");

  

详情的参数不知道的小伙伴可以私聊~

    

PHP友盟推送消息踩坑及处理的更多相关文章

  1. 友盟推送SDK集成测试、常见问题以及注意事项总结

    最近为了解决公司APP在一些手机出现的推送问题重新集成了最新版的友盟推送SDK,花费了几天时间终于把集成和测试工作完成,最终在华为,Nexus,三星,小米,HTC,魅族等10多部手机上测试并达到了预想 ...

  2. 使用极光/友盟推送,APP进程杀死后为什么收不到推送(转)

    为什么会存在这样的 问题,刚开始的时候我也搞不清楚,之前用极光的时候杀死程序后也会收到推送,但最近重新再去集成时就完全不好使了,这我就纳闷了,虽然Google在高版本上的android上面不建议线程守 ...

  3. 友盟推送里面的Alias怎么用?可以理解成账号吗?

    友盟推送里面的Alias怎么用?可以理解成账号吗? 我们的App有自己的账号体系的,想在每次用户登陆的时候,给用户发一个欢迎消息. 看了一下友盟推送,里面有一个概念叫做Alias(别名),但是官方文档 ...

  4. iOS app 集成友盟推送问题

    之前做app推送主要是集成友盟SDK,在程序获取deviceToken时,老是提示如下错误: Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用 ...

  5. AppDelegate减负之常用三方封装 - 友盟推送篇

    之前分享过集成友盟推送的方法, 需要的朋友可以查看一下链接: http://www.cnblogs.com/zhouxihi/p/6533058.html 一般开发中我们比较多使用的三方有友盟推送, ...

  6. iOS 友盟推送,应用内推送启动图推送闪动黑屏,插屏推送方法报错

    以前都是用的极光推送,应公司需求要求使用友盟推送,为了以后是有分享都适用,,, 友盟推送文档,下载demo 感觉比极光用着要简单顺手 一切就绪后,开始发送消息测试,,,,,搞了半天没有发过来消息 原来 ...

  7. java 集成友盟推送

    原文:https://blog.csdn.net/Athena072213/article/details/83414743 最近应公司业务需求需要完善友盟推送,认真看了官方文档后其实很简单,只需要细 ...

  8. 极光推送和友盟推送,ios端和安卓端的后端调试设置

    我是最后端的,这两天搞了一个app项目,前端安卓使用友盟很方便,调试比较顺利,然后ios就遇到各种问题了,证书.发送成功推送不成功,测试时用的TestMode(),ios上架之后就必须用product ...

  9. 友盟推送 .NET (C#) 服务端 SDK rest api 调用库

    友盟推送 .NET SDK rest api 介绍 该版本是基于友盟推送2.3版本封装的,网上查询了下发现没有.NET版本的调用库,官方也没有封装.NET的版本,只有python.java.php版本 ...

随机推荐

  1. 关于毕业五年PHP成长疑惑

    1.PHP语法基础是否都会,比如异常捕捉,面向对象,数组操作语法,字符串操作,cookie,session,全局变量,超全局数组,防止sql注入,mysql预处理 2.MYSQL基础语法,字段设计,原 ...

  2. 【一统江湖的大前端(8)】matter.js 经典物理

    目录 [一统江湖的大前端(8)]matter.js 经典物理 一.经典力学回顾 二. 仿真的实现原理 2.1 基本动力学模拟 2.2 碰撞模拟 三. 物理引擎matter.js 3.1 <愤怒的 ...

  3. vuex和localStorage,全局变量的区别

    vuex是状态管理,是为了解决跨组件之间数据共享问题的,一个组件的数据变化会映射到使用这个数据的其他组件当中.如果刷新页面,之前存储的vuex数据全部都会被初始化掉. localStorage是H5提 ...

  4. 这样阅读STM32参考手册更高效

    <STM32F103xxx参考手册>不需要全部阅读——没有时间的.建议选读,但是前几章必读.存储器和总线架构.电源控制.备份寄存器.复位和时钟控制,通用和复用功能I/O,中断和时间等等前几 ...

  5. cocos2d-x android 入门

    前一段时间使用传统方式做了一个CS软件,发现 UI 显示的比较慢,突发奇起,开始研究起来 GPU 加速,最后开始学习 cocos2dx. 开发环境以最新的 Cocos2d-x 3.17.1 Andro ...

  6. MySQL字符集不一致导致性能下降25%,你敢信?

    故事是这样的: 我在对MySQL进行性能测试时,发现CPU使用率接近100%,其中80%us, 16%sys,3%wa,iostat发现磁盘iops2000以下,avgqu-sz不超过3,%util最 ...

  7. [android]p7-1 fragment学习笔记

    本文源自<android权威编程指南第3版>第7章UI fragment与fragment 第7章主要内容是实现一个记录不良行为的APP(部分实现),有列表,有具体的行为内容显示.第7章主 ...

  8. drf分页功能

    什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不 ...

  9. javascript 自动选中容器里的文字

    前些时间有这么个需求,需要实现选中div里面的文字,选中了的文字可直接按ctrl+v(或者右键)实现黏贴操作. html代码: <div id="text" class=&q ...

  10. Python基础篇_实例练习1

    1.逢7跳过小游戏:从1-100之间,遇到带7的数字或者7的倍数跳过. for i in range(1,101): if i == 7 or i % 10 == 7 or i // 10 == 7: ...