我和極光的那些事兒 | 基于 PHP&Cordova — 推送實現(xiàn)及角標的設(shè)置

沒想到做 PHP 還會接觸這方面的東西尉共,感覺風馬牛不相及迷郑,在這里碰頭了。從 PHP api到 Cordova 搭建打包 App再到里面的極光推送和小紅點的數(shù)值段标,真是禿了半邊頂力麸。(話說回來可款,我們 BOSS 和個推可是校友,我可是力排眾議末盔,毅然決然選擇了極光推筑舅,滑稽.jpg)
--萌新寄語

本篇主要介紹 Cordova 和 PHP 配合,完成極光推送消息( iOS 集成推送的證書申請, PHP 推送代碼實現(xiàn))及角標數(shù)值(badgeNum)的自我實現(xiàn)陨舱。多以截圖為主翠拣,直擊老鐵痛點。

這邊主要介紹 jpush ios 推送證書的申請游盲,申請好了的误墓,可以直接跳下面 PHP 部分

先介紹下我的環(huán)境蛮粮,我只用到了 jpush。所以申請極光賬號還是很簡單的谜慌,不需要什么身份認證然想。
一. 創(chuàng)建應用后的操作

創(chuàng)建成功后的信息

其中 AppKey 是 Cordova 安裝 jpush 插件的必須 也是后面推送的必須(還有隱藏的
Master Secret)

  • 下面就可以設(shè)置推送的相關(guān)信息了

推送設(shè)置頁面

安卓的無腦操作這里就不介紹了
注意包名一定要統(tǒng)一 避免不必要的麻煩,這里詳細介紹下 iOS 的證書設(shè)置(鑒權(quán)方式為 證書)我這里用的是個人開發(fā)者賬號 $99 沒有證書欣范、Mac 的之類的兄弟姐妹就早點兒下班休息吧航

首先需要用你的開發(fā)者賬號登陸蘋果開發(fā)者中心

  1. 然后打開這個慘絕人寰的頁面


    找到這個頁面詳見url
  2. Development 顧名思義即開發(fā)證書


    image.png
  3. 點擊加號后出現(xiàn)的頁面 選中開發(fā)的按鈕后就可以下一步 continue 了


    上面的就是開發(fā) 下面的是生產(chǎn) 一個個來吧
  4. 選擇以后繼續(xù) continue


    image.png
  5. 一直 continue 到這個頁面 選擇簽名 這個時候就需要 Mac 的鑰匙串去請求簽名證書了 這一步先放在這里


    image.png
  6. Mac 請求證書


    image.png
  7. 請求成功之后变泄,保存在本地,創(chuàng)建一個這個包名的文件夾 方便區(qū)分


    image.png
  8. 回到已經(jīng)打開的 蘋果開發(fā)者中心 選擇剛才存到本地的證書 down 下來
    image.png

    下載下來的 .cer 后綴的文件就是我們要的了恼琼。拖到鑰匙串中打開
    按流程走就行了

    下面就是導出 .p12 的文件了7劣肌!G缇骸蛙卤! 盼星星盼月亮 終于盼到這一步了
    部分情況會出現(xiàn)不能導出 .p12 沒有這個選項,請把證書拖到登陸里面,再次嘗試
  9. 走完下面這一步就大功告成了


    注意事項 見圖
  10. 都是明白人兒 放進去就行了噩死。雖然下面有提示 是否將生產(chǎn)證書用于開發(fā)環(huán)境颤难,想都別想,趁熱把另一個證書申請了吧
    image.png
  11. 開發(fā)證書和生產(chǎn)證書操作是一毛一樣的 兩個同時操作也行 也沒意見
    噥 就上面的區(qū)別
  12. 最終結(jié)果


    還不是美滋滋


PHP 端處理 badge 的思路的自我實現(xiàn)

關(guān)于推送的信息已维,一定要多看極光的控制臺行嗤。reg_id和msg_id 平臺信息等都在上面。方便你去查找錯誤信息


1. 是要區(qū)分你是什么推送方式 PHP接口處理推送當然是API嘍衣摩,還用想

幾個常用的信息昂验,給大家劃了出來

之前一直不懂 Jpush 服務器的角標值是怎么玩的捂敌,現(xiàn)在大概明白了艾扮。關(guān)于推送的 badge數(shù)量在我上面截圖紅圈的 badge 參數(shù)。這樣我們不要自己去計算角標值占婉,根據(jù)下面的兩個接口定義 就可以根據(jù)用戶是否點擊泡嘴,在原有的基數(shù)上去對應的增加減少即可 但是如果我們想要看到消息日志的話和推送日志方便自己管理的話 就要自己去建表存儲狀態(tài)了

客戶端設(shè)置角標.png

大概思路是 這里我用了三張表去控制 大概實現(xiàn)了角標的核銷。


數(shù)據(jù)表的設(shè)計
  • 用戶每一次登陸都會去獲取一下設(shè)備的 id逆济,也就是極光的 registration_id 酌予。(防止設(shè)備 ID 改變,極光介紹,或者用戶更換手機奖慌,能準確的推送到該設(shè)備)
  • message 表主要做存儲發(fā)送消息的記錄抛虫。方便后臺管理員了解曾經(jīng)推送過得信息。
  • message_log 表主要就是存儲推送的消息日志(用戶太多的話肯定要優(yōu)化數(shù)據(jù)表的简僧,暫時不做考慮)建椰,根據(jù)表里的 status 就可以判斷是否已讀,用戶每次點擊消息詳情頁都要去訪問下接口去修改 status 的狀態(tài)岛马,從而完成核銷棉姐。核銷的基礎(chǔ)是該用戶的 id 和消息 id屠列,因為這兩個都是唯一的。
    PHP 邏輯代碼簡單的封裝了一下詳見 jpushPHPdemo
    protected function pi_push($member_id,$content,$badgeNum,$array){
        try {
            // 配置引入
            $app_key         = PI_Config::APP_KEY;
            $master_secret   = PI_Config::MASTER_SECRET;
            // use jpush
            $client  = new JPush($app_key, $master_secret);
            $response = $client->push()
                        ->setPlatform("all")
                        ->addRegistrationId( $member_id )
                        ->iosNotification( $content, array(
                            'sound' => 'sound.caf',
                            'badge' => "$badgeNum" + 1,
                            'content-available' => true,
                            'mutable-content' => true,
                            'extras' => $array
                        ))
                        ->androidNotification( $content, array(
                            // 'title' => ,
                            'extras' => $array
                        ))
                        ->options(array(      
                       // !!!! apns_production:這里我試過去掉 option參數(shù) 以為默認推送生產(chǎn)環(huán)境伞矩,其實不然笛洛。需要生產(chǎn)環(huán)境的推送的時候,最好指定D死ぁ?寥谩! 
                       // True 表示推送生產(chǎn)環(huán)境湿诊,F(xiàn)alse 表示要推送開發(fā)環(huán)境蝌诡;如果不指定則默認為推送生產(chǎn)環(huán)境
                            'apns_production' => true,
                        ))
                        ->send();
            if ( $response['http_code'] == 200) {
                return $response['body']['msg_id'];
            }else{
                return false;
            }
        } catch (\JPush\Exceptions\APIConnectionException $e) {
                return false;
        } catch (\JPush\Exceptions\APIRequestException $e) {
                return false;
        }
    }

下面執(zhí)行推送的代碼

// 手動推送的設(shè)置
    public function post_push( $request ){
        $res['title']       =   $request['title'];          // 推送的標題
        $res['content']     =   $request['content'];    // 推送的內(nèi)容
        $res['remark']      =   $request['remark'];    // 推送的備注
        $res['create_date'] =   date( "Y-m-d H:i:s" );
        // 推送類型
        $push_type  =   $request['push_type'];  
        // 推送前插入 推送記錄表 (WordPress的mysql insert方法)
        if ( $push_type === '0' ) {
            $info = $this->wpdb->insert(
                $this->pi_message,
                $res,
                array( '%s', '%s', '%s' )
            );
        }
        // 插入成功 推送并插日志表
        if( $info ){
            // 查找所有設(shè)備ID 上面接受過 每次登陸或者注冊 都要重新獲取一下reg_id
            $find_sql   = "SELECT device_id FROM $this->pi_bindinguser";
            //設(shè)備ID的數(shù)組集合
            $total_user = $this->wpdb->get_results( $find_sql, ARRAY_A  );
            // 找到所有的設(shè)備id 發(fā)送數(shù)據(jù)
            foreach ($total_user as $key => $value) {
                // 每個設(shè)備id
                $device_id  =    $value['device_id'];
                // 通過設(shè)備id 去查找 member_id 從而計算該用戶的未讀和已讀
                $sql        =   "SELECT member_id FROM $this->pi_bindinguser WHERE device_id = ". " '$device_id' ";
                // 計算badge_num的數(shù)值
                $member_id   =  $this->wpdb->get_var( $sql );
                // 獲取當前的狀態(tài)為零 未讀取的小紅點
                $total_sql  =   "SELECT count(id) FROM $this->pi_message_log WHERE member_id = $member_id AND status = 0" ;
                //如果該用戶消息為空的話 即默認為0開始
                $badge_num  =   empty( $this->wpdb->get_var( $total_sql ) ) ? '0' :  $this->wpdb->get_var( $total_sql );
                $msg_id = $this->pi_push($device_id,$res['content'],$badge_num,$array);
                // var_dump( $msg_id );
                //推送成功之后 拿到msg_id 和 member_id 也就是消息id和用戶id 兩個對應的數(shù)據(jù)唯一 去存入消息列表 做核銷使用
                if( $msg_id ){
                    $time = date( "Y-m-d H:i:s" );
                    $info = $this->wpdb->insert(
                        $this->pi_message_log,
                        array('member_id'=>$member_id,'msg_id'=>$msg_id,'content'=>$res['content'],'create_date'=>$time,'push_type'=>$push_type),
                        array( '%s', '%s', '%s', '%s', '%s' )
                    );
                }
            }
            return PI_Response::init( 0 );
        }else{
            return PI_Response::init( 1003 );
        }

    }

到此 推送和本地計算角標值也就差不多了》惆桑客戶端的 badge 改動就要他們自己去掉 jpush 的接口了浦旱。因為每查看一次消息就去訪問接口的,這樣的話客戶端和服務端的角標值的數(shù)值就對應上了九杂,有點像 ajax 的無刷新刪除


我是用蒲公英做的內(nèi)測版 App 發(fā)布的颁湖。事先打包了 ipa 。這種情況的推送例隆,必須要生產(chǎn)證書甥捺,也就是上面說的'apns_production' => true,

多看文檔


推送成功的條件:設(shè)備id、正確的 AppKey master secret 镀层、環(huán)境和對應的證書是否一致等镰禾。重要的事情說三遍 多看推送歷史詳情和社區(qū)

推送成功的前提


做完一套流程到后面才發(fā)現(xiàn)不需要自己控制消息日志,調(diào)用 jpush 的接口就可以去完成角標數(shù)值的增刪設(shè)置唱逢、顯示對應的小紅點吴侦。我問老大,我們這樣做是不是多余的坞古。老大:相信極光,也相信我們自己备韧。


「本文系極光征文 | 寫寫文章就能贏 Filco,豈不美滋滋的參賽文章」

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痪枫,一起剝皮案震驚了整個濱河市织堂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奶陈,老刑警劉巖易阳,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吃粒,居然都是意外死亡潦俺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黑竞,“玉大人踱卵,你說我怎么就攤上這事衅疙“タ牵” “怎么了咏瑟?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遏匆。 經(jīng)常有香客問我法挨,道長,這世上最難降的妖魔是什么幅聘? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任凡纳,我火速辦了婚禮,結(jié)果婚禮上帝蒿,老公的妹妹穿的比我還像新娘荐糜。我一直安慰自己,他們只是感情好葛超,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布暴氏。 她就那樣靜靜地躺著,像睡著了一般绣张。 火紅的嫁衣襯著肌膚如雪答渔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天侥涵,我揣著相機與錄音沼撕,去河邊找鬼。 笑死芜飘,一個胖子當著我的面吹牛务豺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燃箭,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼冲呢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了招狸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤邻薯,失蹤者是張志新(化名)和其女友劉穎裙戏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厕诡,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡累榜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壹罚。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡葛作,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猖凛,到底是詐尸還是另有隱情赂蠢,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布辨泳,位于F島的核電站虱岂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菠红。R本人自食惡果不足惜第岖,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望试溯。 院中可真熱鬧蔑滓,春花似錦、人聲如沸遇绞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽试读。三九已至杠纵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钩骇,已是汗流浹背比藻。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留倘屹,地道東北人银亲。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像纽匙,于是被迫代替她去往敵國和親务蝠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容