后端:給APP接入極光推送

新版本推送的需求變的更加復雜.需要接入一個專業(yè)的推送了.之前一直基于APP的IM來實現(xiàn)的.

目前市面上主流的推送平臺有 極光毅人、友盟肋殴、信鴿等等..

通過調研最后選擇了 極光推送平臺

什么是推送平臺呢?下面通過一張圖來舉例

我們業(yè)務服務器請求極光平臺提供的接口.請求他們,然后由極光平臺將信息推送給我們的用戶.

一直提到的推送,可能有些新手朋友還是很懵.什么是推送?以故?

通常HTTP請求中,都是由客戶端向服務端請求,然后服務器響應數(shù)據(jù).可是有些情況下,需要我們主動向客戶端響應數(shù)據(jù).

而這個主動響應數(shù)據(jù)的過程就是推送.

那么是如何實現(xiàn)推送的呢蜗细?

簡單點說就是建立一條長連接.平常的HTTP都是短連接,響應完數(shù)據(jù)后就會被關閉.而長連接卻一直連接著.既然是一直連接著的,我們就可以找到這條連接,然后主動給他推送消息.

好了.回到正題.下面我們來繼續(xù)說如何接入極光推送.

先了解幾個概念

  • Registration ID

客戶端初始化 JPush 成功后,JPush 服務端會分配一個 Registration ID怒详,作為此設備的標識(同一個手機不同 APP 的 Registration ID 是不同的)炉媒。開發(fā)者可以通過指定具體的 Registration ID 來進行對單一設備的推送踪区。

  • 別名

每個用戶只能指定一個別名。 同一個應用程序內橱野,對不同的用戶朽缴,建議取不同的別名。這樣水援,盡可能根據(jù)別名來唯一確定用戶密强。

  • 標簽

為安裝了應用程序的用戶打上標簽,其目的主要是方便開發(fā)者根據(jù)標簽蜗元,來批量下發(fā) Push 消息或渤。 可為每個用戶打多個標簽。

咱們在通過一張圖來理解之間的關系

首先 Registration ID 是唯一的.我們可以給這個Id設置一個別名,也就是一個備注.這個別名可以設置成與我們平臺的用戶賬號相同.這樣可以方便我們推送.

當然逐個推送是很麻煩的.我們可以給這些用戶打一個 Tag 標簽. 比如北京的用戶放在北京的Tag標簽下.單身的用戶放在單身的Tag標簽下.我們以Tag來推送,就能達到群發(fā)效果.

了解概念后.我們應該清楚這個時候需要把 JPush 注冊用戶與開發(fā)者App 用戶綁定起來奕扣。

這個綁定有兩個基本思路:

  • 把綁定關系保存到 JPush 服務器端

  • 把綁定關系保存到開發(fā)者應用服務器中

第一種就是之前說到的別名和標簽薪鹦。由客戶端來設置別名.

客戶端開發(fā)者會調用 setAlias或者setTags API 來設置關系

SDK 把該關系設置保存到 JPush Server 上

在服務器端推送消息時,指定向之前設置過的別名或者標簽推送.

第二種就相對麻煩一些.由客戶端將Registration ID傳遞給服務端,然后由服務端來處理對應關系.

我們這里采用的是第一種,通過客戶端來設置別名或者標題.

JPush提供四種消息形式:通知惯豆,自定義消息池磁,富媒體和本地通知。

這里我們主要介紹通知消息.只要理解了第一種,其他在文檔中看看就能很輕松理解.

  • 通知

或者說 Push Notification楷兽,即指在手機的通知欄(狀態(tài)欄)上會顯示的一條通知信息地熄。 通知主要用于提示用戶的目的,應用于新聞內容芯杀、促銷活動端考、產品信息、版本更新提醒揭厚、訂單狀態(tài)提醒等多種場景

這里先附上官網(wǎng)文檔的地址,下面所說的內容都是基于這個文檔的.

文檔地址:極光推送

還是先了解幾個概念

  • platform:推送平臺

JPush 當前支持 Android, iOS, Windows Phone 三個平臺的推送却特。其關鍵字分別為:"android", "ios", "winphone"。

如果目標平臺為 iOS 平臺 需要在 options 中通過 apns_production 字段來設定推送環(huán)境筛圆。True 表示推送生產環(huán)境裂明,F(xiàn)alse 表示要推送開發(fā)環(huán)境; 如果不指定則為推送生產環(huán)境

推送到所有平臺:

{ "platform" : "all" }

指定特定推送平臺:

{ "platform" : ["android", "ios"] }

通常情況下指定 android 和 ios 就可以了太援。如果產品有winphone版本的也可以選擇推送到所有平臺,這里沒有什么太多問題.

  • audience:推送目標

推送設備對象漾岳,表示一條推送可以被推送到哪些設備列表。確認推送設備對象粉寞,JPush 提供了多種方式尼荆,比如:別名、標簽唧垦、注冊ID捅儒、分群、廣播等。

這里具體的參數(shù)就請看文檔吧.

我們在封裝推送方法的使用巧还,需要對Android 和 ios 的配置進行分別設置.下面我會在我封裝的方法里進行說明.

首先先去集成sdk.通過Composer就可以了

在項目中的 composer.json 文件中添加 jpush 依賴:

"require": {
    "jpush/jpush": "^3.5"
}

執(zhí)行

composer install** 進行安裝鞭莽。

也可以直接下載.下載地址去文檔中找吧~

composer 安裝完后 就可以通過命名空間直接引用了.

下面是我簡單封裝的一個推送方法.

<?php
/**
 * Created by PhpStorm.
 * User: huangzhicheng
 * Date: 2018/8/28
 * Time: 下午3:12
 */

namespace data\tools;

use data\tools\config\Output;
use JPush\Client as Client;

class JPush
{
    /**
     * 通過別名發(fā)送極光推送消息
     * @param $title // 標題
     * @param $content // 內容
     * @param $alias // 別名
     * @param array $params // 擴展字段
     * @param string $ios_badge // ios 角標數(shù)
     * @param array $platform // 推送設備
     * @return array|bool
     * @author huangzhicheng 2018年08月29日
     */
    public static function pushMessageByAlias ($title, $content, $alias, $params = [], $ios_badge = '0', $platform = ['ios', 'android'])
    {

        if (!is_array ($alias)) return false;
        $jpush_conf = Output::getJPushKey (); // 獲取配置信息 app_key 和 master_secret

        $app_key = $jpush_conf[ 'app_key' ];
        $master_secret = $jpush_conf[ 'master_secret' ];
        try {
            // 初始化
            $client = new Client($app_key, $master_secret);

            $result = $client->push ()
                ->setPlatform ($platform)
                ->addAlias ($alias)
                ->iosNotification (
                    $content, [
                    'sound' => '1',
                    'badge' => (int)$ios_badge,
                    'content-available' => true,
                    'category' => 'jiguang',
                    'extras' => $params,
                ])
                ->androidNotification ($content, [
                    'title' => $title,
                    //'build_id' => 2,
                    'extras' => $params,
                ])
                ->options ([
                    'sendno' => 100,
                    'time_to_live' => 86400,
                    'apns_production' => true, // ios推送證書的選擇,True 表示推送生產環(huán)境麸祷,F(xiàn)alse 表示要推送開發(fā)環(huán)境
                    //'big_push_duration' => 10,
                ])
                ->send ();
            return $result;
        } catch (\Exception $e) {
            // 寫入錯誤日志
            // 這里根據(jù)自己的業(yè)務來定
        }
    }
}

可以根據(jù)代碼看出來.我使用 iosNotificationandroidNotification 方法進行兩個設備的推送設置.

// Ios的通知配置項
->iosNotification (
    $content, // 推送的內容
    [
        'sound' => '1', // 是否有聲音
        'badge' => (int)$ios_badge, // 顯示的角標數(shù)
        'content-available' => true, // 去文檔中查看具體用處,一般設置為true或者1
        'category' => 'jiguang', // 這里也去文檔中查看吧
        'extras' => $params, // 擴展字段 根據(jù)自己業(yè)務場景來定.
    ])

安卓的推送也是類似的.更多具體的配置項去文檔中查看澎怒。

最后就調用封裝的代碼

const PUSH_TYPE = [
        'push_new_info' => '1',
        'push_visitor_alert' => '2'

    ];

const APP_NAME = "****";

public static function pushNewInfoNotice ($uids, $title, $url, $txt, $type = '1')
{

    $ext = [
        'push_type' => strval (self::PUSH_TYPE[ 'push_new_info' ]),
        'info_type' => strval ($type),//1-資訊,2-項目
        'title' => empty($title) ? self::APP_NAME : $title,
        'content' => $txt,
        'redirect_url' => $url
    ];

    $res = JPush::pushMessageByAlias ($title, $txt, $uids, $ext);
    return $res;
}

我們只要調用這個方法就能實現(xiàn)推送了.

$ext 就是我們與客戶端定義的信息格式.他們會根據(jù)push_type來執(zhí)行不同操作.

最后再補充一點.就是我們開發(fā)和生產使用的是一個極光應用.所以不能隨便發(fā)送廣播消息在開發(fā)環(huán)境中.

那如何區(qū)分生產環(huán)境和開發(fā)環(huán)境呢?

下面是官方給出的建議:

1.使用相同的 Appkey 和 包名,推送時使用 registrationID阶牍、tag喷面、alias 針對性的對測試機進行推送測試

2.如果你一定要測試廣播推送,那么在官網(wǎng)新建一個測試應用走孽,Appkey 和包名不一樣惧辈,專門用作測試

3.如果你還需要包名一樣并測試廣播推送,那么在官網(wǎng)新建一個極光賬號磕瓷,新建一個測試應用盒齿,配相同的包名進行測試。

作者:Ade小黃
鏈接:http://www.reibang.com/p/60f92a9fe176
來源:簡書
簡書著作權歸作者所有困食,任何形式的轉載都請聯(lián)系作者獲得授權并注明出處边翁。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硕盹,隨后出現(xiàn)的幾起案子符匾,更是在濱河造成了極大的恐慌,老刑警劉巖莱睁,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芒澜,居然都是意外死亡仰剿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門痴晦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來南吮,“玉大人,你說我怎么就攤上這事誊酌〔看眨” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵碧浊,是天一觀的道長涂邀。 經常有香客問我,道長箱锐,這世上最難降的妖魔是什么比勉? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上浩聋,老公的妹妹穿的比我還像新娘观蜗。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凑队,像睡著了一般鼎姊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上导盅,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音,去河邊找鬼厂画。 笑死,一個胖子當著我的面吹牛拷邢,可吹牛的內容都是我干的袱院。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼瞭稼,長吁一口氣:“原來是場噩夢啊……” “哼忽洛!你這毒婦竟也來了?” 一聲冷哼從身側響起环肘,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤欲虚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悔雹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體复哆,經...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年腌零,在試婚紗的時候發(fā)現(xiàn)自己被綠了梯找。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡益涧,死狀恐怖锈锤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情闲询,我是刑警寧澤久免,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站扭弧,受9級特大地震影響阎姥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜鸽捻,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一丁寄、第九天 我趴在偏房一處隱蔽的房頂上張望氨淌。 院中可真熱鬧,春花似錦伊磺、人聲如沸盛正。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豪筝。三九已至,卻和暖如春摘能,著一層夾襖步出監(jiān)牢的瞬間续崖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工团搞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留严望,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓逻恐,卻偏偏與公主長得像像吻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子复隆,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容