摘要:我看可以發(fā)現(xiàn)小米推送目錄結(jié)構(gòu)是這樣的其中是底層的網(wǎng)絡(luò)庫,主要是封裝了的和方法請求遠(yuǎn)程的服務(wù)器并利用提供的類來接收服務(wù)器返回的數(shù)據(jù),代碼十分優(yōu)雅,我們可以看看。
小米推送框架
近期因?yàn)橛行枰晕⒖戳艘幌滦∶淄扑偷?php 版本服務(wù)端框架,這個(gè)推送平臺免費(fèi)的,我們只需要告訴小米平臺我們要推什么設(shè)備,它會自己幫我們推,而且還會統(tǒng)計(jì)很多信息給我們分析,如抵達(dá)率和點(diǎn)擊率等等,當(dāng)然客戶端也要用小米平臺提供的 sdk 來注冊設(shè)備。我感覺這個(gè)代碼寫得挺優(yōu)雅的,故分享一下我的看法。你可以去官網(wǎng)下載 sdk, 詳細(xì)的文檔在 這里。
我看可以發(fā)現(xiàn)小米推送目錄結(jié)構(gòu)是這樣的:
├── xmpush ?? ├── Builder.php ?? ├── Constants.php ?? ├── DevTools.php ?? ├── ErrorCode.php ?? ├── Feedback.php ? ├── HttpBase.php ?? ├── IOSBuilder.php ?? ├── Message.php ?? ├── Result.php ?? ├── Sender.php ?? ├── Stats.php ?? ├── Subscription.php ?? ├── TargetedMessage.php ?? └── Tracer.php
其中 HttpBase.php 是底層的網(wǎng)絡(luò)庫,主要是封裝了 HTTP 的 POST 和 GET 方法請求遠(yuǎn)程的服務(wù)器并利用 Result.php 提供的類來接收服務(wù)器返回的數(shù)據(jù),代碼十分優(yōu)雅,我們可以看看。
//發(fā)送請求,獲取result,帶重試 public function postResult($url,$fields,$retries){ $result = new Result($this->postReq($url, $fields)); if($result->getErrorCode() == ErrorCode::Success){ return $result; } //重試 for($i=0;$i<$retries;$i++){ $result = new Result($this->postReq($url, $fields)); if($result->getErrorCode() == ErrorCode::Success){ break; } } return $result; } //post方式發(fā)送請求 public function postReq($url,$fields,$timeout=10){ $headers = array("Authorization: key=" . $this->appSecret, "Content-Type: application/x-www-form-urlencoded"); // Open connection $ch = curl_init(); // Set the url, number of POST vars, POST data curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $timeout ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields)); print_r("HTTP Params
".urldecode(http_build_query($fields))); echo"
"; // Execute post $result = curl_exec($ch); // Close connection curl_close($ch); return $result; }
從名字就可以看出,上面是利用 POST 方法請求小米服務(wù)器,返回值用result包裝了一下,如果返回碼不為 0,那么久重試一下。在發(fā)送請求的時(shí)候把發(fā)送的 field 打印出來,讓開發(fā)者能看到請求的內(nèi)容。雖然代碼很簡單,但是值得新手區(qū)學(xué)習(xí)這樣的代碼規(guī)范。有時(shí)候你自己寫框架的時(shí)候也可以借鑒這種方式。
builder.php 實(shí)現(xiàn)的實(shí)例繼承了 message 可以承載著我們的發(fā)送給服務(wù)端的消息數(shù)據(jù),這就是我們消息體,所有數(shù)據(jù)承載的地方。
ErrorCode.php 是存放狀態(tài)碼的文件,我們在包含了這個(gè)文件后,可以通過 ErrorCode::Success 來訪問我們定義狀態(tài)碼。
Sender.php 是一個(gè)發(fā)送文件,和發(fā)送相關(guān)的函數(shù)都會在這個(gè)文件上,內(nèi)部會調(diào)用底層的網(wǎng)絡(luò)庫。
Result.php 是一個(gè)存放服務(wù)器返回結(jié)果的文件。
Constants.php 是一個(gè)存放常量和靜態(tài)變量的地方。
大致上最有用的就是上面描述的文件。
小米推送實(shí)踐因?yàn)樾∶淄扑椭С趾芏喾N推送方式,比如按 alias 推送,account 推送,全量推送,按標(biāo)簽推送(客戶端訂閱的方式)。這里僅僅介紹全量推送。
首先你需要在Constant類中配置好從小米平臺上注冊的 app 的包名和 secret
$secret = "your app secret"; $package = "your app packagename"; // 常量設(shè)置必須在new Sender()方法之前調(diào)用 Constants::setPackage($package); Constants::setSecret($secret);
如果有多個(gè)應(yīng)用,你可以在一個(gè)新的 config 類中存放好配置信息。
然后開始構(gòu)建消息體。
$message = new Builder(); $message->title($title); $message->description($desc); $message->notifyType(1); $message->passThrough($passThrough); $message->payload($payload); $message->extra(Builder::notifyEffect, 1); $message->notifyId(1); $message->timeToSend($timeToSend); $message->build();
然后你可以設(shè)置創(chuàng)建一個(gè)發(fā)送類,并調(diào)用全量推送的接口。
$sender = new Sender(); $res = $sender->broadcastAll($message); print_r($res->getRaw()); // 查看返回的數(shù)據(jù)
你看,是不是很簡單,輕輕松松實(shí)現(xiàn)小米推送,僅需要10分鐘左右的時(shí)間,但是一定要注意返回值得錯(cuò)誤檢查。不要讓程序崩了,也不要讓程序返回一些人類很難看懂的字符和錯(cuò)誤碼,養(yǎng)成良好的編程習(xí)慣,有助于提高開發(fā)效率。
返回的數(shù)組用 json_encode 函數(shù)轉(zhuǎn)為 json 格式
{ "result": "ok", "trace_id": "Xcm56b094851588122700z", "code": 0, "data": { "id": "tcm56b09485158812276t8" }, "description": "成功", "info": "Received push messages for 1 TOPIC" }
如果有同學(xué)在使用小米推送平臺的過程遇到問題的歡迎提出來大家一起交流!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30540.html
摘要:背景前段時(shí)間遷移小米推送部分代碼,這部分之前是其他人負(fù)責(zé)的。并行推送端實(shí)體端實(shí)體推送結(jié)果以上就是這些了,通過以上的方式我們就用很少的代碼封裝了一個(gè)小米,目前只實(shí)現(xiàn)了按登記別名用戶賬號標(biāo)簽多標(biāo)簽全體推送。 背景 前段時(shí)間遷移小米推送部分代碼,這部分之前是其他人負(fù)責(zé)的。讀了代碼,發(fā)現(xiàn)了兩點(diǎn): 所有接口的實(shí)現(xiàn)除了url和傳參基本都是一致的 android和ios的設(shè)備需要分別推送一次 剛...
摘要:下面我們正式開始嘗試小米推送,首先,找出其業(yè)務(wù)邏輯中的一個(gè)節(jié)點(diǎn)。因?yàn)樾∶淄扑褪巧虡I(yè)產(chǎn)品,這里不便于探索太多內(nèi)容,但是通過這個(gè)插件可以比較方便的進(jìn)行類似的研究。 前言 有時(shí)候我們在Java開發(fā)過程中可能有這樣的需求:需要研究或者修改工程依賴的Jar包中的一些邏輯,查看代碼運(yùn)行中Jar包代碼內(nèi)部的取值情況(比如了解SDK與其服務(wù)器通信的請求報(bào)文加密前的情況)。 這個(gè)需求類似于Hook。 但...
摘要:介紹下一個(gè)新項(xiàng)目,后端該如何從零去搭建。我們先假設(shè)這個(gè)項(xiàng)目由兩部組成提供給站點(diǎn)使用的提供給運(yùn)營人員使用的管理后臺。因此通過回顧,我們得出我們的后端項(xiàng)目需要一個(gè)的層次,來存放業(yè)務(wù)邏輯。 這是 后端開發(fā)者從零做一個(gè)移動應(yīng)用 的后端部分第二篇。介紹下一個(gè)新項(xiàng)目,后端該如何從零去搭建。我們先假設(shè)這個(gè)項(xiàng)目由兩部組成 提供給wap站點(diǎn)、app使用的api; 提供給運(yùn)營人員使用的管理后臺。 整個(gè)...
閱讀 1084·2021-11-25 09:43
閱讀 706·2021-11-22 14:45
閱讀 3833·2021-09-30 09:48
閱讀 1072·2021-08-31 09:41
閱讀 1979·2019-08-30 13:52
閱讀 1986·2019-08-30 11:24
閱讀 1354·2019-08-30 11:07
閱讀 961·2019-08-29 12:15