以前也用過友盟推送,但是整合的方法當時沒整理
結果前段時間在使用的時候,找不到了誒
友盟推送文檔地址:https://developer.umeng.com/docs/67966/detail/68343
於是再次百度了一番
找到了現在這篇,整合的比較不錯,適合我這種面向百度編程的
廢話不多說
直接開始
首先對應配置
在友盟 的 應用中找到對應Android與ios的 AppKey 和 App Master Secret
或者對應配置信息並在配置中配置
'umeng' => [ 'android_app_key' => '####', //友盟android AppKey 'android_app_secret' => '####', //友盟android App Master Secret 'ios_app_key' => '####', //友盟ios AppKey 'ios_app_secret' => '####', //友盟android App Master Secret ],
然后推送核心類庫
代碼如下:
<?php namespace umeng; /** * 友盟消息 安卓 IOS 推送類 * */ class Push { protected $host; //發送地址 protected $app_key; //appkey protected $appMasterSecret; //app secret protected $description; //app secret // public function __construct($options = null) { if (is_array($options)) { $this->host = 'https://msgapi.umeng.com/api/send'; $this->app_key = $options['app_key']; $this->appMasterSecret = $options['appMasterSecret']; $this->description = "友盟接口推送"; } else { return false; } } /** * @param $info * @param $device_token * @return mixed|string * 用戶單播 和 列播 */ public function Android_Device_Push($info, $device_token) { $data['appkey'] = $this->app_key; $data['timestamp'] = time(); //時間戳 if (is_array($device_token)) { //批量用戶列播 $data['type'] = 'listcast'; $data['device_tokens'] = implode(',', $device_token); //數組轉字符串 } else { //一個用戶單播 $data['type'] = 'unicast'; $data['device_tokens'] = $device_token; } //payload內容 $data['payload']['display_type'] = 'notification'; //通知消息 //payload body內容 $data['payload']['body']['after_open'] = "go_custom"; //后續操作打開app $data['payload']['body']['ticker'] = $info['ticker']; $data['payload']['body']['title'] = $info['title']; $data['payload']['body']['text'] = $info['title']; //廣播通知不能為空補填 //這里可以寫附加字段 $data['payload']['extra']['type'] = $info['type']; //附加字段類型 $data['production_mode'] = $info['production_mode']; $data['description'] = $this->description; return $this->send($data, $this->host, $this->appMasterSecret); } /** * @param $info * @return mixed|string * 廣播 */ public function Android_Broadcast($info) { $data['appkey'] = $this->app_key; $data['timestamp'] = time(); //時間戳 //廣播消息 $data['type'] = 'broadcast'; //payload內容 $data['payload']['display_type'] = 'notification'; //通知消息 //payload body內容 $data['payload']['body']['after_open'] = "go_custom"; //后續操作打開app $data['payload']['body']['ticker'] = $info['ticker']; $data['payload']['body']['title'] = $info['title']; $data['payload']['body']['text'] = $info['title']; //廣播通知不能為空補填 $data['payload']['extra']['type'] = $info['type']; //附加字段類型1 跳轉消息詳情 $data['payload']['extra']['prod_id'] = $info['prod_id']; //附加字段消息詳情id $data['payload']['extra']['text'] = $info['text']; // $data['production_mode'] = $info['production_mode']; $data['description'] = $this->description; return $this->send($data, $this->host, $this->appMasterSecret); } /** * @param $info * @param $device_token * @return mixed|string * 單播 和 列播 */ public function Ios_Device_Push($info, $device_token) { $data = array(); $data['appkey'] = $this->app_key; $data['timestamp'] = time(); //時間戳 if (is_array($device_token)) { //批量用戶列播 $data['type'] = 'listcast'; $data['device_tokens'] = implode(',', $device_token); //數組轉字符串 } else { //一個用戶單播 $data['type'] = 'unicast'; $data['device_tokens'] = $device_token; } //payload內容 $data['payload']['aps']['alert'] = $info['text']; //消息主體 $data['payload']['aps']['sound'] = 'default'; //聲音 $data['payload']['type'] = $info['type']; //消息類型 0打開消息詳情 $data['payload']['prod_id'] = $info['prod_id']; //消息id $data['payload']['title'] = $info['title']; $data['payload']['text'] = $info['text']; // $data['production_mode'] = $info['production_mode']; $data['description'] = $this->description; return $this->send($data, $this->host, $this->appMasterSecret); } public function Ios_Broadcast($info) { $data = array(); $data['appkey'] = $this->app_key; $data['timestamp'] = time(); //時間戳 //廣播消息 $data['type'] = 'broadcast'; //payload內容 $data['payload']['aps']['alert'] = $info['title']; //消息主體 $data['payload']['aps']['sound'] = 'chime'; //聲音 $data['payload']['aps']['badge'] = 1; //顯示角標 $data['payload']['type'] = $info['type']; //消息類型 0打開消息詳情 $data['payload']['prod_id'] = $info['prod_id']; //消息id $data['payload']['title'] = $info['title']; $data['payload']['text'] = $info['ticker']; // $data['production_mode'] = $info['production_mode']; $data['description'] = $this->description; return $this->send($data, $this->host, $this->appMasterSecret); } /** * @param $data * @param $url_s * @param $appMasterSecret * @return mixed|string * curl 請求 */ private function send($data, $url_s, $appMasterSecret) { $postBody = json_encode($data); //加密 $sign = md5("POST" . $url_s . $postBody . $appMasterSecret); $url = $url_s . "?sign=" . $sign; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_POSTFIELDS, $postBody); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlErrNo = curl_errno($ch); $curlErr = curl_error($ch); curl_close($ch); // print_r($result); // exit; if ($httpCode == "0") { // Time out return ("Curl error number:" . $curlErrNo . " , Curl error details:" . $curlErr . "\r\n"); } else if ($httpCode != "200") { return ("Http code:" . $httpCode . " details:" . $result . "\r\n"); } else { return $result; } } } ?>
調用方法示例:
use umeng\Push; function umengsend($device_token) { $info['ticker'] = '推送測試提示欄'; #提示欄文字 $info['title'] ='推送測試標題'; #通知標題 $info['text'] = '推送測試文字描述'; #文字描述 $info['type'] = 4; //附加字段類型1 跳轉消息詳情 $info['production_mode'] = 'false'; $info['prod_id'] = ""; #IOS 單播與廣播 $options_ios = [ 'app_key' => config('umeng.ios_app_key'), 'appMasterSecret' => config('umeng.ios_app_secret'), ]; $ios_umeng = new Push($options_ios); #IOS單播 $ios_umeng->Ios_Device_Push($info,$device_token); #IOS廣播 $ios_umeng->Ios_Broadcast($info); #Android 單播與廣播 $options_android = [ 'app_key' => config('umeng.android_app_key'), 'appMasterSecret' => config('umeng.android_app_secret'), ]; $android_umeng = new Push($options_android); #安卓單播 $android_umeng->Android_Device_Push($info,$device_token); #安卓廣播 $android_umeng->Android_Broadcast($info); }
自己使用:
#推送相關設定 use umeng\Push; #公共測試 #$title 通知標題 #$text 文字描述 #$type 類型 1單播2廣播 #$userlist device_token 列表 function umengpublic($title,$text,$type="1",$userlist=[]) { $info = []; $info['ticker'] = $title; #提示欄文字 $info['title'] = $title; #通知標題 $info['text'] = $text; #文字描述 $info['type'] = 4; //附加字段類型1 跳轉消息詳情 $info['production_mode'] = 'false'; #false 測試 true 正式 $info['prod_id'] = ""; if($type == '1') { umengpushuser($info,$userlist); }else{ umengpushpublic($info); } return true; } #公共推送 -- 廣播 function umengpushpublic($info) { #安卓廣播 $android_umeng = new Push(['app_key' => config('umeng.android_app_key'),'appMasterSecret' => config('umeng.android_app_secret')]); $android_umeng->Android_Broadcast($info); ######################################### #IOS廣播 $ios_umeng = new Push(['app_key' => config('umeng.ios_app_key'),'appMasterSecret' => config('umeng.ios_app_secret')]); $ios_umeng->Ios_Broadcast($info); return true; } #公共推送 -- 單播 function umengpushuser($info,$userlist) { #對應相關用戶 $userlists = []; #獲取device_token 列表 foreach($userlists as $key=>$val) { #安卓單推 if($val['ismodel'] == '1') { #安卓配置 $android_umeng = new Push(['app_key' => config('umeng.android_app_key'),'appMasterSecret' => config('umeng.android_app_secret')]); $android_umeng->Android_Device_Push($info,$val['device_token']); } #ios 單推 else if($val['ismodel'] == '2') { #IOS配置 $ios_umeng = new Push(['app_key' => config('umeng.ios_app_key'),'appMasterSecret' => config('umeng.ios_app_secret')]); $ios_umeng->Ios_Device_Push($info,$val['device_token']); } else { // return } } return true; }
附錄::
推送相關參數
Android:
{ "appkey":"xx", // 必填,應用唯一標識 "timestamp":"xx", // 必填,時間戳,10位或者13位均可,時間戳有效期為10分鍾 "type":"xx", // 必填,消息發送類型,其值可以為: // unicast-單播 // listcast-列播,要求不超過500個device_token // filecast-文件播,多個device_token可通過文件形式批量發送 // broadcast-廣播 // groupcast-組播,按照filter篩選用戶群, 請參照filter參數 // customizedcast,通過alias進行推送,包括以下兩種case: // - alias: 對單個或者多個alias進行推送 // - file_id: 將alias存放到文件后,根據file_id來推送 "device_tokens":"xx", // 當type=unicast時, 必填, 表示指定的單個設備 // 當type=listcast時, 必填, 要求不超過500個, 以英文逗號分隔 "alias_type": "xx", // 當type=customizedcast時, 必填 // alias的類型, alias_type可由開發者自定義, 開發者在SDK中 // 調用setAlias(alias, alias_type)時所設置的alias_type "alias":"xx", // 當type=customizedcast時, 選填(此參數和file_id二選一) // 開發者填寫自己的alias, 要求不超過500個alias, 多個alias以英文逗號間隔 // 在SDK中調用setAlias(alias, alias_type)時所設置的alias "file_id":"xx", // 當type=filecast時,必填,file內容為多條device_token,以回車符分割 // 當type=customizedcast時,選填(此參數和alias二選一) // file內容為多條alias,以回車符分隔。注意同一個文件內的alias所對應 // 的alias_type必須和接口參數alias_type一致。 // 使用文件播需要先調用文件上傳接口獲取file_id,參照"文件上傳" "filter":{}, // 當type=groupcast時,必填,用戶篩選條件,如用戶標簽、渠道等,參考附錄G。 // filter的內容長度最大為3000B) "payload": { // 必填,JSON格式,具體消息內容(Android最大為1840B) "display_type":"xx", // 必填,消息類型: notification(通知)、message(消息) "body": { // 必填,消息體。 // 當display_type=message時,body的內容只需填寫custom字段。 // 當display_type=notification時,body包含如下參數: // 通知展現內容: "ticker":"xx", // 必填,通知欄提示文字 "title":"xx", // 必填,通知標題 "text":"xx", // 必填,通知文字描述 // 自定義通知圖標: "icon":"xx", // 可選,狀態欄圖標ID,R.drawable.[smallIcon], // 如果沒有,默認使用應用圖標。 // 圖片要求為24*24dp的圖標,或24*24px放在drawable-mdpi下。 // 注意四周各留1個dp的空白像素 "largeIcon":"xx", // 可選,通知欄拉開后左側圖標ID,R.drawable.[largeIcon], // 圖片要求為64*64dp的圖標, // 可設計一張64*64px放在drawable-mdpi下, // 注意圖片四周留空,不至於顯示太擁擠 "img": "xx", // 可選,通知欄大圖標的URL鏈接。該字段的優先級大於largeIcon。 // 該字段要求以http或者https開頭。 // 自定義通知聲音: "sound": "xx", // 可選,通知聲音,R.raw.[sound]。 // 如果該字段為空,采用SDK默認的聲音,即res/raw/下的 // umeng_push_notification_default_sound聲音文件。如果 // SDK默認聲音文件不存在,則使用系統默認Notification提示音。 // 自定義通知樣式: "builder_id": xx, // 可選,默認為0,用於標識該通知采用的樣式。使用該參數時, // 開發者必須在SDK里面實現自定義通知欄樣式。 // 通知到達設備后的提醒方式,注意,"true/false"為字符串 "play_vibrate":"true/false", // 可選,收到通知是否震動,默認為"true" "play_lights":"true/false", // 可選,收到通知是否閃燈,默認為"true" "play_sound":"true/false", // 可選,收到通知是否發出聲音,默認為"true" // 點擊"通知"的后續行為,默認為打開app。 "after_open": "xx", // 可選,默認為"go_app",值可以為: // "go_app": 打開應用 // "go_url": 跳轉到URL // "go_activity": 打開特定的activity // "go_custom": 用戶自定義內容。 "url": "xx", // 當after_open=go_url時,必填。 // 通知欄點擊后跳轉的URL,要求以http或者https開頭 "activity":"xx", // 當after_open=go_activity時,必填。 // 通知欄點擊后打開的Activity "custom":"xx"/{} // 當display_type=message時, 必填 // 當display_type=notification且 // after_open=go_custom時,必填 // 用戶自定義內容,可以為字符串或者JSON格式。 }, extra:{ // 可選,JSON格式,用戶自定義key-value。只對"通知" // (display_type=notification)生效。 // 可以配合通知到達后,打開App/URL/Activity使用。 "key1": "value1", "key2": "value2", ... } }, "policy":{ // 可選,發送策略 "start_time":"xx", // 可選,定時發送時,若不填寫表示立即發送。 // 定時發送時間不能小於當前時間 // 格式: "yyyy-MM-dd HH:mm:ss"。 // 注意,start_time只對任務類消息生效。 "expire_time":"xx", // 可選,消息過期時間,其值不可小於發送時間或者 // start_time(如果填寫了的話), // 如果不填寫此參數,默認為3天后過期。格式同start_time "max_send_num": xx, // 可選,發送限速,每秒發送的最大條數。最小值1000 // 開發者發送的消息如果有請求自己服務器的資源,可以考慮此參數。 "out_biz_no": "xx" // 可選,消息發送接口對任務類消息的冪等性保證。 // 強烈建議開發者在發送任務類消息時填寫這個字段,友盟服務端會根據這個字段對消息做去重避免重復發送。 // 同一個appkey下面的多個消息會根據out_biz_no去重,不同發送任務的out_biz_no需要保證不同,否則會出現后發消息被去重過濾的情況。 // 注意,out_biz_no只對任務類消息有效。 }, "production_mode":"true/false", // 可選,正式/測試模式。默認為true // 測試模式只對“廣播”、“組播”類消息生效,其他類型的消息任務(如“文件播”)不會走測試模式 // 測試模式只會將消息發給測試設備。測試設備需要到web上添加。 // Android: 測試設備屬於正式設備的一個子集。 "description": "xx", // 可選,發送消息描述,建議填寫。 //系統彈窗,只有display_type=notification生效 "mipush": "true/false", // 可選,默認為false。當為true時,表示MIUI、EMUI、Flyme系統設備離線轉為系統下發 "mi_activity": "xx", // 可選,mipush值為true時生效,表示走系統通道時打開指定頁面acitivity的完整包路徑。 "channel_properties":{ //可選,廠商通道相關的特殊配置 "xiaomi_channel_id":"",//小米channel_id,具體使用及限制請參考小米推送文檔 https://dev.mi.com/console/doc/detail?pId=2086 "vivo_classification":"1" , //vivo消息分類:0 運營消息,1 系統消息, 需要到vivo申請,具體使用及限制參考[vivo消息推送分類功能說明]https://dev.vivo.com.cn/documentCenter/doc/359 "oppo_channel_id":"xx" //可選, android8以上推送消息需要新建通道,否則消息無法觸達用戶。push sdk 6.0.5及以上創建了默認的通道:upush_default,消息提交廠商通道時默認添加該通道。如果要自定義通道名稱或使用私信,請自行創建通道,推送消息時攜帶該參數 具體可參考 [oppo通知通道適配] https://open.oppomobile.com/wiki/doc#id=10289 } }
IOS相關參數:
{ "appkey":"xx", // 必填,應用唯一標識 "timestamp":"xx", // 必填,時間戳,10位或者13位均可,時間戳有效期為10分鍾 "type":"xx", // 必填,消息發送類型,其值可以為: // unicast-單播 // listcast-列播,要求不超過500個device_token // filecast-文件播,多個device_token可通過文件形式批量發送 // broadcast-廣播 // groupcast-組播,按照filter篩選用戶群, 請參照filter參數 // customizedcast,通過alias進行推送,包括以下兩種case: // - alias: 對單個或者多個alias進行推送 // - file_id: 將alias存放到文件后,根據file_id來推送 "device_tokens":"xx", // 當type=unicast時, 必填, 表示指定的單個設備 // 當type=listcast時, 必填, 要求不超過500個, 以英文逗號分隔 "alias_type": "xx", // 當type=customizedcast時, 必填 // alias的類型, alias_type可由開發者自定義, 開發者在SDK中 // 調用setAlias(alias, alias_type)時所設置的alias_type "alias":"xx", // 當type=customizedcast時, 選填(此參數和file_id二選一) // 開發者填寫自己的alias, 要求不超過500個alias, 多個alias以英文逗號間隔 // 在SDK中調用setAlias(alias, alias_type)時所設置的alias "file_id":"xx", // 當type=filecast時,必填,file內容為多條device_token,以回車符分割 // 當type=customizedcast時,選填(此參數和alias二選一) // file內容為多條alias,以回車符分隔。注意同一個文件內的alias所對應 // 的alias_type必須和接口參數alias_type一致。 // 使用文件播需要先調用文件上傳接口獲取file_id,參照"2.4文件上傳接口" "filter":{}, // 當type=groupcast時,必填,用戶篩選條件,如用戶標簽、渠道等,參考附錄G。 "payload": // 必填,JSON格式,具體消息內容(iOS最大為2012B) { "aps": // 必填,嚴格按照APNs定義來填寫 { "alert":""/{ // 當content-available=1時(靜默推送),可選; 否則必填。 // 可為JSON類型和字符串類型 "title":"title", "subtitle":"subtitle", "body":"body" } "badge": xx, // 可選 "sound": "xx", // 可選 "content-available":1 // 可選,代表靜默推送 "category": "xx", // 可選,注意: ios8才支持該字段。 }, "key1":"value1", // 可選,用戶自定義內容, "d","p"為友盟保留字段, // key不可以是"d","p" "key2":"value2", ... }, "policy": // 可選,發送策略 { "start_time":"xx", // 可選,定時發送時間,若不填寫表示立即發送。 // 定時發送時間不能小於當前時間 // 格式: "yyyy-MM-dd HH:mm:ss"。 // 注意,start_time只對任務生效。 "expire_time":"xx", // 可選,消息過期時間,其值不可小於發送時間或者 // start_time(如果填寫了的話), // 如果不填寫此參數,默認為3天后過期。格式同start_time "out_biz_no": "xx" // 可選,消息發送接口對任務類消息的冪等性保證。 // 強烈建議開發者在發送任務類消息時填寫這個字段,友盟服務端會根據這個字段對消息做去重避免重復發送。 // 同一個appkey下面的多個消息會根據out_biz_no去重,不同發送任務的out_biz_no需要保證不同,否則會出現后發消息被去重過濾的情況。 // 注意,out_biz_no只對任務類消息有效。 "apns_collapse_id": "xx" // 可選,多條帶有相同apns_collapse_id的消息,iOS設備僅展示 // 最新的一條,字段長度不得超過64bytes }, "production_mode":"true/false" // 可選,正式/測試模式。默認為true // 測試模式只對“廣播”、“組播”類消息生效,其他類型的消息任務(如“文件播”)不會走測試模式 // 測試模式只會將消息發給測試設備。測試設備需要到web上添加。 "description": "xx" // 可選,發送消息描述,建議填寫。 }
分享完畢..
漫漫人生路,終究還是要找合得來的人...
2020年08月28日