給APP接入極光推送:後端(PHP)

做者:黃志成(小黃)php

做者博客:博客地址android

新版本推送的需求變的更加複雜.須要接入一個專業的推送了.以前一直基於APP的IM來實現的.ios

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

經過調研最後選擇了 極光推送平臺json

什麼是推送平臺呢?下面經過一張圖來舉例api

image

咱們業務服務器請求極光平臺提供的接口.請求他們,而後由極光平臺將信息推送給咱們的用戶.bash

一直提到的推送,可能有些新手朋友仍是很懵.什麼是推送??服務器

一般HTTP請求中,都是由客戶端向服務端請求,而後服務器響應數據.但是有些狀況下,須要咱們主動向客戶端響應數據.app

而這個主動響應數據的過程就是推送.composer

那麼是如何實現推送的呢?

簡單點說就是創建一條長鏈接.日常的HTTP都是短鏈接,響應完數據後就會被關閉.而長鏈接卻一直鏈接着.既然是一直鏈接着的,咱們就能夠找到這條鏈接,而後主動給他推送消息.

好了.回到正題.下面咱們來繼續說如何接入極光推送.

先了解幾個概念

  • Registration ID

客戶端初始化 JPush 成功後,JPush 服務端會分配一個 Registration ID,做爲此設備的標識(同一個手機不一樣 APP 的 Registration ID 是不一樣的)。開發者能夠經過指定具體的 Registration ID 來進行對單一設備的推送。

  • 別名

每一個用戶只能指定一個別名。 同一個應用程序內,對不一樣的用戶,建議取不一樣的別名。這樣,儘量根據別名來惟一肯定用戶。

  • 標籤

爲安裝了應用程序的用戶打上標籤,其目的主要是方便開發者根據標籤,來批量下發 Push 消息。 可爲每一個用戶打多個標籤。

我們在經過一張圖來理解之間的關係

image

首先 Registration ID 是惟一的.咱們能夠給這個Id設置一個別名,也就是一個備註.這個別名能夠設置成與咱們平臺的用戶帳號相同.這樣能夠方便咱們推送.

固然逐個推送是很麻煩的.咱們能夠給這些用戶打一個 Tag 標籤. 好比北京的用戶放在北京的Tag標籤下.單身的用戶放在單身的Tag標籤下.咱們以Tag來推送,就能達到羣發效果.

瞭解概念後.咱們應該清楚這個時候須要把 JPush 註冊用戶與開發者App 用戶綁定起來。

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

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

  • 把綁定關係保存到開發者應用服務器中

第一種就是以前說到的別名和標籤。由客戶端來設置別名.

客戶端開發者會調用 setAlias或者setTags API 來設置關係

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

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

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

咱們這裏採用的是第一種,經過客戶端來設置別名或者標題.

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

這裏咱們主要介紹通知消息.只要理解了第一種,其餘在文檔中看看就能很輕鬆理解.

  • 通知

或者說 Push Notification,即指在手機的通知欄(狀態欄)上會顯示的一條通知信息。 通知主要用於提示用戶的目的,應用於新聞內容、促銷活動、產品信息、版本更新提醒、訂單狀態提醒等多種場景

這裏先附上官網文檔的地址,下面所說的內容都是基於這個文檔的.

文檔地址:極光推送

仍是先了解幾個概念

  • platform:推送平臺

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

若是目標平臺爲 iOS 平臺 須要在 options 中經過 apns_production 字段來設定推送環境。True 表示推送生產環境,False 表示要推送開發環境; 若是不指定則爲推送生產環境

推送到全部平臺:

{ "platform" : "all" }
複製代碼

指定特定推送平臺:

{ "platform" : ["android", "ios"] }
複製代碼

一般狀況下指定 android 和 ios 就能夠了。若是產品有winphone版本的也能夠選擇推送到全部平臺,這裏沒有什麼太多問題.

  • audience:推送目標

推送設備對象,表示一條推送能夠被推送到哪些設備列表。確認推送設備對象,JPush 提供了多種方式,好比:別名、標籤、註冊ID、分羣、廣播等。

這裏具體的參數就請看文檔吧.

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

首先先去集成sdk.經過Composer就能夠了

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

"require": {
    "jpush/jpush": "^3.5"
}
複製代碼

執行 php composer.phar install** 或 ** 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
{
    /**
     * 經過別名發送極光推送消息
     * @param $title // 標題
     * @param $content // 內容
     * @param $alias // 別名
     * @param array $params // 擴展字段
     * @param string $ios_badge // ios 角標數
     * @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 表示推送生產環境,False 表示要推送開發環境
                    //'big_push_duration' => 10,
                ])
                ->send ();
            return $result;
        } catch (\Exception $e) {
            // 寫入錯誤日誌
            // 這裏根據本身的業務來定
        }
    }
}
複製代碼

能夠根據代碼看出來.我使用 iosNotificationandroidNotification 方法進行兩個設備的推送設置.

// Ios的通知配置項
->iosNotification (
    $content, // 推送的內容
    [
        'sound' => '1', // 是否有聲音
        'badge' => (int)$ios_badge, // 顯示的角標數
        'content-available' => true, // 去文檔中查看具體用處,通常設置爲true或者1
        'category' => 'jiguang', // 這裏也去文檔中查看吧
        'extras' => $params, // 擴展字段 根據本身業務場景來定.
    ])
複製代碼

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

最後就調用封裝的代碼

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;
}
複製代碼

咱們只要調用這個方法就能實現推送了.

$ext 就是咱們與客戶端定義的信息格式.他們會根據push_type來執行不一樣操做.

最後再補充一點.就是咱們開發和生產使用的是一個極光應用.因此不能隨便發送廣播消息在開發環境中.

那如何區分生產環境和開發環境呢?

下面是官方給出的建議

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

2.若是你必定要測試廣播推送,那麼在官網新建一個測試應用,Appkey 和包名不同,專門用做測試

3.若是你還須要包名同樣並測試廣播推送,那麼在官網新建一個極光帳號,新建一個測試應用,配相同的包名進行測試。

這篇文章就記錄到這,之後有想補充的在更新了.

完成於:2018年09月01日00:22:32

相關文章
相關標籤/搜索