PHP友盟推送消息踩坑及处理
公司的客户端的推送选用友盟推送,但是友盟的官方文档描述很少,对新手很不友好,所以特写此采坑纪录,废话不多说上代码。
公司业务只涉及单播和广播。所以只提供了单播和广播,业务拓展的话会补充其余部分。
消息推送代码:
<?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友盟推送消息踩坑及处理的更多相关文章
- 友盟推送SDK集成测试、常见问题以及注意事项总结
最近为了解决公司APP在一些手机出现的推送问题重新集成了最新版的友盟推送SDK,花费了几天时间终于把集成和测试工作完成,最终在华为,Nexus,三星,小米,HTC,魅族等10多部手机上测试并达到了预想 ...
- 使用极光/友盟推送,APP进程杀死后为什么收不到推送(转)
为什么会存在这样的 问题,刚开始的时候我也搞不清楚,之前用极光的时候杀死程序后也会收到推送,但最近重新再去集成时就完全不好使了,这我就纳闷了,虽然Google在高版本上的android上面不建议线程守 ...
- 友盟推送里面的Alias怎么用?可以理解成账号吗?
友盟推送里面的Alias怎么用?可以理解成账号吗? 我们的App有自己的账号体系的,想在每次用户登陆的时候,给用户发一个欢迎消息. 看了一下友盟推送,里面有一个概念叫做Alias(别名),但是官方文档 ...
- iOS app 集成友盟推送问题
之前做app推送主要是集成友盟SDK,在程序获取deviceToken时,老是提示如下错误: Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用 ...
- AppDelegate减负之常用三方封装 - 友盟推送篇
之前分享过集成友盟推送的方法, 需要的朋友可以查看一下链接: http://www.cnblogs.com/zhouxihi/p/6533058.html 一般开发中我们比较多使用的三方有友盟推送, ...
- iOS 友盟推送,应用内推送启动图推送闪动黑屏,插屏推送方法报错
以前都是用的极光推送,应公司需求要求使用友盟推送,为了以后是有分享都适用,,, 友盟推送文档,下载demo 感觉比极光用着要简单顺手 一切就绪后,开始发送消息测试,,,,,搞了半天没有发过来消息 原来 ...
- java 集成友盟推送
原文:https://blog.csdn.net/Athena072213/article/details/83414743 最近应公司业务需求需要完善友盟推送,认真看了官方文档后其实很简单,只需要细 ...
- 极光推送和友盟推送,ios端和安卓端的后端调试设置
我是最后端的,这两天搞了一个app项目,前端安卓使用友盟很方便,调试比较顺利,然后ios就遇到各种问题了,证书.发送成功推送不成功,测试时用的TestMode(),ios上架之后就必须用product ...
- 友盟推送 .NET (C#) 服务端 SDK rest api 调用库
友盟推送 .NET SDK rest api 介绍 该版本是基于友盟推送2.3版本封装的,网上查询了下发现没有.NET版本的调用库,官方也没有封装.NET的版本,只有python.java.php版本 ...
随机推荐
- java线程并发工具类
本次内容主要讲Fork-Join.CountDownLatch.CyclicBarrier以及Callable.Future和FutureTask,最后再手写一个自己的FutureTask,绝对干货满 ...
- Vue Snackbar 消息条队列显示,依次动画消失的实现
效果预览 思路 封装 Snackbar 组件: 在根路由页面下建立全局 Snackbar 控制器,统一管理 Snackbar: 通过事件通知全局 Snackbar 控制器显示消息: 实现 1. 封装 ...
- django数据库分库migrate
最近在研究微服务和分布式,设计到了数据库分库,记录一下 首先,创建多个数据库,如果是已经生成的数据库,可以分库,这里我是新创建的项目,刚好可以用来尝试 我是用docker创建的mysql数据库容器 拉 ...
- Spring源码阅读笔记05:自定义xml标签解析
在上篇文章中,提到了在Spring中存在默认标签与自定义标签两种,并且详细分析了默认标签的解析,本文就来分析自定义标签的解析,像Spring中的AOP就是通过自定义标签来进行配置的,这里也是为后面学习 ...
- python之二分法求平方根
前几天学完python的程序分支结构后,老师课后留了一个问题,用两种方法计算一个大于或等于 1 的实数 n 数的平方根. 描述设计一个用二分法计算一个大于或等于 1 的实数 n 的平方根的函数sqrt ...
- go-admin基于Gin + Vue + Element UI的前后端分离权限管理系统
✨ 特性 遵循 RESTful API 设计规范 基于 GIN WEB API 框架,提供了丰富的中间件支持(用户认证.跨域.访问日志.追踪ID等) 基于Casbin的 RBAC 访问控制模型 JWT ...
- vue管理平台的动态路由(后台传递路由,前端拿到并生成侧边栏)
前端的路由从后台获取,包括权限: 大体步骤包括:路由拦截(钩子函数)---->后台获取路由数据 ----> 保存到本地或vuex中. 在router-->index.js中: rou ...
- 【tomcat系列】详解tomcat架构(上篇)
java中,常用的web服务器一般由tomcat,weblogic,jetty,undertwo等,但从用户使用广泛度来说,tomcat用户量相对比较大一些,当然这也基于它开源和免费的特点. 从软件架 ...
- word文档常用的格式操作(分页、分节、每一节如何设置页码、以及生成目录)
分页: 分节: 自动生成目录:
- Jenkins的凭证管理
Jenkins的凭证管理 什么是凭证? 凭证(cridential)是Jenkins进行受限操作时的凭据.比如使用SSH登录远程机器时,用户名和密码或SSH key就是凭证.而这些凭证不可能以明文写在 ...