成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從小米推送 php 服務(wù)端框架中看看代碼該怎么寫

loonggg / 1605人閱讀

摘要:我看可以發(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

相關(guān)文章

  • 利用php重載和curl的并行方式優(yōu)雅的封裝小米推送sdk

    摘要:背景前段時(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è)備需要分別推送一次 剛...

    Guakin_Huang 評論0 收藏0
  • Java字節(jié)碼修改神器HiBeaver:黑掉你的SDK

    摘要:下面我們正式開始嘗試小米推送,首先,找出其業(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。 但...

    Lavender 評論0 收藏0
  • PHP組織項(xiàng)目結(jié)構(gòu)的思考

    摘要:介紹下一個(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è)...

    cikenerd 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<