PHP友盟推送消息踩坑及处理

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

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

消息推送代码:

  1 <?php
  2 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidBroadcast.php');
  3 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidFilecast.php');
  4 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidGroupcast.php');
  5 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidUnicast.php');
  6 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/android/AndroidCustomizedcast.php');
  7 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSBroadcast.php');
  8 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSFilecast.php');
  9 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSGroupcast.php');
 10 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSUnicast.php');
 11 require_once(dirname(__FILE__) . '/' . 'umengmsg/notification/ios/IOSCustomizedcast.php');
 12 
 13 
 14 class Be_Libs_UmengMsg {
 15     protected static $appkey  = ''; 
 16     protected static $appMasterSecret = '';
 17     protected static $validation_token = NULL;
 18     protected static $device_tokens = '';
 19   
 20     public static function __init($type) {
 21         $configs = Be_Config::k('umeng.'.$type); //根据IOS/Android获取appkey和密钥
 22         self::$appkey = $configs['appkey'];
 23         self::$appMasterSecret = $configs['appMasterSecret'];
 24     }
 25    //Android 单播
 26     public static function sendAndroidUnicast($data) {
 27         self::__init('android');
 28         try {
 29             $unicast = new AndroidUnicast();
 30             $unicast->setAppMasterSecret(self::$appMasterSecret);
 31             $unicast->setPredefinedKeyValue("appkey",self::$appkey);
 32             $unicast->setPredefinedKeyValue("timestamp",strval(time()));
 33             $unicast->setPredefinedKeyValue("device_tokens",$data['token']); 
 34             $unicast->setPredefinedKeyValue("ticker",$data['title']);
 35             $unicast->setPredefinedKeyValue("title",$data['title']);
 36             $unicast->setPredefinedKeyValue("text",$data['content']);
 37             $unicast->setPredefinedKeyValue("after_open","go_app");
 38             $unicast->setPredefinedKeyValue("production_mode", "false");
 39             $unicast->setPredefinedKeyValue("mipush",true);
 40             $unicast->setPredefinedKeyValue("mi_activity",'xxx');
 41             $unicast->setExtraField("scheme",$data['scheme']);
 42             $unicast->setExtraField("badge",$data['badge']);
 43             $unicast->send();
 44         } catch (Exception $e) {
 45             return $e->getMessage();
 46         }
 47         return true;
 48     }
 49    //Android广播
 50     public static function sendAndroidBroadcast($data) {
 51         self::__init(strtolower($data['platform']));
 52         try {
 53             $brocast = new AndroidBroadcast();
 54             $brocast->setAppMasterSecret(self::$appMasterSecret);
 55             $brocast->setPredefinedKeyValue("appkey", self::$appkey);
 56             $brocast->setPredefinedKeyValue("timestamp", strval(time()));
 57             $brocast->setPredefinedKeyValue("ticker", '测试副标题');
 58             $brocast->setPredefinedKeyValue("title",  '测试标题');
 59             $brocast->setPredefinedKeyValue("text",  '测试描述');
 60             $brocast->setPredefinedKeyValue("after_open", "go_url");
 61             $brocast->setPredefinedKeyValue("url",  'http://www.baidu.com');
 62             $brocast->setPredefinedKeyValue("production_mode", "false");
 63             $brocast->setExtraField("scheme", "xxxx");
 64             $brocast->send();
 65         } catch (Exception $e) {
 66             return $e->getMessage();
 67         }
 68         return true;
 69     }
 70    //IOS单播
 71     public static function sendIOSUnicast($data) {
 72         self::__init(strtolower('ios'));
 73         $alert = array(
 74             "title" => $data['title'],
 75             "subtitle" => $data['subtitle'],
 76             "body" => $data['content'],
 77             "url" => $data['url'],
 78             "scheme" => $data['scheme'],
 79         );
 80         try {
 81             $unicast = new IOSUnicast();
 82             $unicast->setAppMasterSecret(self::$appMasterSecret);
 83             $unicast->setPredefinedKeyValue("appkey",self::$appkey);
 84             $unicast->setPredefinedKeyValue("timestamp",strval(time()));
 85             $unicast->setPredefinedKeyValue("device_tokens",$data['token']); 
 86             $unicast->setPredefinedKeyValue("badge",$data['badge']);
 87             $unicast->setPredefinedKeyValue("sound", "default");
 88             $unicast->setPredefinedKeyValue("alert", $alert);
 89             $unicast->setPredefinedKeyValue("production_mode", "false");
 90             $unicast->send();
 91         } catch (Exception $e) {
 92             return $e->getMessage();
 93         }
 94         return true;    
 95     }
 96    //IOS广播
 97     public static function sendIOSBroadcast($data) {
 98         self::__init(strtolower($data['platform']));
 99         $alert = array(
100             "title" => '测试标题',
101             "subtitle" => '测试副标题',
102             "body" => '测试描述',
103             "url" => 'http://www.baidu.com',
104             "scheme" => "xxxx",
105         );
106         try {
107             $brocast = new IOSBroadcast();
108             $brocast->setAppMasterSecret($this->appMasterSecret);
109             $brocast->setPredefinedKeyValue("appkey", $this->appkey);
110             $brocast->setPredefinedKeyValue("timestamp", strval(time()));
111             $brocast->setPredefinedKeyValue("alert", $alert);
112             $brocast->setPredefinedKeyValue("badge", 0);
113             //$brocast->setPredefinedKeyValue("sound", "chime");
114             // Set 'production_mode' to 'true' if your app is under production mode
115             $brocast->setPredefinedKeyValue("production_mode", "false");
116             // Set customized fields
117             //$brocast->setCustomizedField("test", "helloworld");
118             $brocast->send();
119         } catch (Exception $e) {
120             return $e->getMessage();
121         }
122         return true;
123     }
124 
125 }

采坑纪录:

  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");

  

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

    

原文地址:https://www.cnblogs.com/yuanwanli/p/12661128.html