摘要:我看可以發(fā)現(xiàn)小米推送目錄結(jié)構(gòu)是這樣的其中是底層的網(wǎng)絡(luò)庫(kù),主要是封裝了的和方法請(qǐng)求遠(yuǎn)程的服務(wù)器并利用提供的類來(lái)接收服務(wù)器返回的數(shù)據(jù),代碼十分優(yōu)雅,我們可以看看。
小米推送框架
近期因?yàn)橛行枰晕⒖戳艘幌滦∶淄扑偷?php 版本服務(wù)端框架,這個(gè)推送平臺(tái)免費(fèi)的,我們只需要告訴小米平臺(tái)我們要推什么設(shè)備,它會(huì)自己幫我們推,而且還會(huì)統(tǒng)計(jì)很多信息給我們分析,如抵達(dá)率和點(diǎn)擊率等等,當(dāng)然客戶端也要用小米平臺(tái)提供的 sdk 來(lái)注冊(cè)設(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ò)庫(kù),主要是封裝了 HTTP 的 POST 和 GET 方法請(qǐng)求遠(yuǎn)程的服務(wù)器并利用 Result.php 提供的類來(lái)接收服務(wù)器返回的數(shù)據(jù),代碼十分優(yōu)雅,我們可以看看。
//發(fā)送請(qǐng)求,獲取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ā)送請(qǐng)求 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 方法請(qǐng)求小米服務(wù)器,返回值用result包裝了一下,如果返回碼不為 0,那么久重試一下。在發(fā)送請(qǐng)求的時(shí)候把發(fā)送的 field 打印出來(lái),讓開發(fā)者能看到請(qǐng)求的內(nèi)容。雖然代碼很簡(jiǎn)單,但是值得新手區(qū)學(xué)習(xí)這樣的代碼規(guī)范。有時(shí)候你自己寫框架的時(shí)候也可以借鑒這種方式。
builder.php 實(shí)現(xiàn)的實(shí)例繼承了 message 可以承載著我們的發(fā)送給服務(wù)端的消息數(shù)據(jù),這就是我們消息體,所有數(shù)據(jù)承載的地方。
ErrorCode.php 是存放狀態(tài)碼的文件,我們?cè)诎诉@個(gè)文件后,可以通過(guò) ErrorCode::Success 來(lái)訪問(wèn)我們定義狀態(tài)碼。
Sender.php 是一個(gè)發(fā)送文件,和發(fā)送相關(guān)的函數(shù)都會(huì)在這個(gè)文件上,內(nèi)部會(huì)調(diào)用底層的網(wǎng)絡(luò)庫(kù)。
Result.php 是一個(gè)存放服務(wù)器返回結(jié)果的文件。
Constants.php 是一個(gè)存放常量和靜態(tài)變量的地方。
大致上最有用的就是上面描述的文件。
小米推送實(shí)踐因?yàn)樾∶淄扑椭С趾芏喾N推送方式,比如按 alias 推送,account 推送,全量推送,按標(biāo)簽推送(客戶端訂閱的方式)。這里僅僅介紹全量推送。
首先你需要在Constant類中配置好從小米平臺(tái)上注冊(cè)的 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ù)
你看,是不是很簡(jiǎn)單,輕輕松松實(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é)在使用小米推送平臺(tái)的過(guò)程遇到問(wèn)題的歡迎提出來(lái)大家一起交流!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30540.html
摘要:背景前段時(shí)間遷移小米推送部分代碼,這部分之前是其他人負(fù)責(zé)的。并行推送端實(shí)體端實(shí)體推送結(jié)果以上就是這些了,通過(guò)以上的方式我們就用很少的代碼封裝了一個(gè)小米,目前只實(shí)現(xiàn)了按登記別名用戶賬號(hào)標(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)容,但是通過(guò)這個(gè)插件可以比較方便的進(jìn)行類似的研究。 前言 有時(shí)候我們?cè)贘ava開發(fā)過(guò)程中可能有這樣的需求:需要研究或者修改工程依賴的Jar包中的一些邏輯,查看代碼運(yùn)行中Jar包代碼內(nèi)部的取值情況(比如了解SDK與其服務(wù)器通信的請(qǐng)求報(bào)文加密前的情況)。 這個(gè)需求類似于Hook。 但...
摘要:介紹下一個(gè)新項(xiàng)目,后端該如何從零去搭建。我們先假設(shè)這個(gè)項(xiàng)目由兩部組成提供給站點(diǎn)使用的提供給運(yùn)營(yíng)人員使用的管理后臺(tái)。因此通過(guò)回顧,我們得出我們的后端項(xiàng)目需要一個(gè)的層次,來(lái)存放業(yè)務(wù)邏輯。 這是 后端開發(fā)者從零做一個(gè)移動(dòng)應(yīng)用 的后端部分第二篇。介紹下一個(gè)新項(xiàng)目,后端該如何從零去搭建。我們先假設(shè)這個(gè)項(xiàng)目由兩部組成 提供給wap站點(diǎn)、app使用的api; 提供給運(yùn)營(yíng)人員使用的管理后臺(tái)。 整個(gè)...
閱讀 1141·2021-11-25 09:43
閱讀 753·2021-11-22 14:45
閱讀 3905·2021-09-30 09:48
閱讀 1121·2021-08-31 09:41
閱讀 2041·2019-08-30 13:52
閱讀 2030·2019-08-30 11:24
閱讀 1409·2019-08-30 11:07
閱讀 1016·2019-08-29 12:15