摘要:我看可以發現小米推送目錄結構是這樣的其中是底層的網絡庫,主要是封裝了的和方法請求遠程的服務器并利用提供的類來接收服務器返回的數據,代碼十分優雅,我們可以看看。
小米推送框架
近期因為有需要稍微看了一下小米推送的 php 版本服務端框架,這個推送平臺免費的,我們只需要告訴小米平臺我們要推什么設備,它會自己幫我們推,而且還會統計很多信息給我們分析,如抵達率和點擊率等等,當然客戶端也要用小米平臺提供的 sdk 來注冊設備。我感覺這個代碼寫得挺優雅的,故分享一下我的看法。你可以去官網下載 sdk, 詳細的文檔在 這里。
我看可以發現小米推送目錄結構是這樣的:
├── 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 是底層的網絡庫,主要是封裝了 HTTP 的 POST 和 GET 方法請求遠程的服務器并利用 Result.php 提供的類來接收服務器返回的數據,代碼十分優雅,我們可以看看。
//發送請求,獲取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方式發送請求 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 方法請求小米服務器,返回值用result包裝了一下,如果返回碼不為 0,那么久重試一下。在發送請求的時候把發送的 field 打印出來,讓開發者能看到請求的內容。雖然代碼很簡單,但是值得新手區學習這樣的代碼規范。有時候你自己寫框架的時候也可以借鑒這種方式。
builder.php 實現的實例繼承了 message 可以承載著我們的發送給服務端的消息數據,這就是我們消息體,所有數據承載的地方。
ErrorCode.php 是存放狀態碼的文件,我們在包含了這個文件后,可以通過 ErrorCode::Success 來訪問我們定義狀態碼。
Sender.php 是一個發送文件,和發送相關的函數都會在這個文件上,內部會調用底層的網絡庫。
Result.php 是一個存放服務器返回結果的文件。
Constants.php 是一個存放常量和靜態變量的地方。
大致上最有用的就是上面描述的文件。
小米推送實踐因為小米推送支持很多種推送方式,比如按 alias 推送,account 推送,全量推送,按標簽推送(客戶端訂閱的方式)。這里僅僅介紹全量推送。
首先你需要在Constant類中配置好從小米平臺上注冊的 app 的包名和 secret
$secret = "your app secret"; $package = "your app packagename"; // 常量設置必須在new Sender()方法之前調用 Constants::setPackage($package); Constants::setSecret($secret);
如果有多個應用,你可以在一個新的 config 類中存放好配置信息。
然后開始構建消息體。
$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();
然后你可以設置創建一個發送類,并調用全量推送的接口。
$sender = new Sender(); $res = $sender->broadcastAll($message); print_r($res->getRaw()); // 查看返回的數據
你看,是不是很簡單,輕輕松松實現小米推送,僅需要10分鐘左右的時間,但是一定要注意返回值得錯誤檢查。不要讓程序崩了,也不要讓程序返回一些人類很難看懂的字符和錯誤碼,養成良好的編程習慣,有助于提高開發效率。
返回的數組用 json_encode 函數轉為 json 格式
{ "result": "ok", "trace_id": "Xcm56b094851588122700z", "code": 0, "data": { "id": "tcm56b09485158812276t8" }, "description": "成功", "info": "Received push messages for 1 TOPIC" }
如果有同學在使用小米推送平臺的過程遇到問題的歡迎提出來大家一起交流!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30540.html
摘要:背景前段時間遷移小米推送部分代碼,這部分之前是其他人負責的。并行推送端實體端實體推送結果以上就是這些了,通過以上的方式我們就用很少的代碼封裝了一個小米,目前只實現了按登記別名用戶賬號標簽多標簽全體推送。 背景 前段時間遷移小米推送部分代碼,這部分之前是其他人負責的。讀了代碼,發現了兩點: 所有接口的實現除了url和傳參基本都是一致的 android和ios的設備需要分別推送一次 剛...
摘要:下面我們正式開始嘗試小米推送,首先,找出其業務邏輯中的一個節點。因為小米推送是商業產品,這里不便于探索太多內容,但是通過這個插件可以比較方便的進行類似的研究。 前言 有時候我們在Java開發過程中可能有這樣的需求:需要研究或者修改工程依賴的Jar包中的一些邏輯,查看代碼運行中Jar包代碼內部的取值情況(比如了解SDK與其服務器通信的請求報文加密前的情況)。 這個需求類似于Hook。 但...
摘要:介紹下一個新項目,后端該如何從零去搭建。我們先假設這個項目由兩部組成提供給站點使用的提供給運營人員使用的管理后臺。因此通過回顧,我們得出我們的后端項目需要一個的層次,來存放業務邏輯。 這是 后端開發者從零做一個移動應用 的后端部分第二篇。介紹下一個新項目,后端該如何從零去搭建。我們先假設這個項目由兩部組成 提供給wap站點、app使用的api; 提供給運營人員使用的管理后臺。 整個...
閱讀 1072·2021-11-25 09:43
閱讀 696·2021-11-22 14:45
閱讀 3816·2021-09-30 09:48
閱讀 1061·2021-08-31 09:41
閱讀 1970·2019-08-30 13:52
閱讀 1976·2019-08-30 11:24
閱讀 1341·2019-08-30 11:07
閱讀 950·2019-08-29 12:15