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

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

消息推送代码:

 <?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. 第四章、深入理解vue组件

    4-1.使用组件的细节 a.使用is解决html出现bug 如下 table下面应该为tr,所以页面渲染的时候没有找到tr是有问题的,所以是有小bug,所以table中必须是tr b.改上面bug,t ...

  2. 使用flask-dropzone 上传图片文件

    引用  http://greyli.com/flask-dropzone/ 现在需要上传图片文件的页面使用jijin2渲染,由于是使用flask-dropzone的,所以我们使用dropzone的cs ...

  3. 数据挖掘入门系列教程(四)之基于scikit-lean实现决策树

    目录 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris 加载数据集 数据特征 训练 随机森林 调参工程师 结尾 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理 ...

  4. unittest测试框架详解

    单元测试的定义 1. 什么是单元测试? ​ 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类,一般是开发来做的,按照测试 ...

  5. 解析Laravel框架下的Contracts契约

    Contracts Laravel 的契约是一组定义框架提供的核心服务的接口, 例如我们在介绍用户认证的章节中到的用户看守器契约IllumninateContractsAuthGuard 和用户提供器 ...

  6. 因为我说:volatile 是轻量级的 synchronized,面试官让我回去等通知!

    因为我说:volatile 是轻量级的 synchronized,面试官让我回去等通知! volatile 是并发编程的重要组成部分,也是面试常被问到的问题之一.不要向小强那样,因为一句:volati ...

  7. Natas26 Writeup(PHP反序列化漏洞)

    Natas26: 打开页面是一个输入坐标点进行绘图的页面. <html> <head> <!-- This stuff in the header has nothing ...

  8. json到底是什么??????

    JSON(JavaScript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格式.JSON是基于文本的,轻量级的,通常被认为易于读/写. 通俗解释: 1.j ...

  9. Swift:字符串(String)分割之Substring优雅转换

    认识Substring类型 这是一个全新的类型,看类名像是String的子类,但是大家千万别被误导了,Substring并不是String的子类,这是两个不同的类型,但是它们都继承了StringPro ...

  10. python编写“求最大值”

    # 求最大值 def large(*num): # 定义一个large函数,函数的参数为可变参数 ma = num[0] # 初始化最大值 for n in num: if ma < n: # ...