国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

給APP接入極光推送 — 后端(PHP)

kamushin233 / 1919人閱讀

摘要:開發者可以通過指定具體的來進行對單一設備的推送。同一個應用程序內,對不同的用戶,建議取不同的別名。其關鍵字分別為。確認推送設備對象,提供了多種方式,比如別名標簽注冊分群廣播等。

作者:黃志成(小黃)

作者博客:博客地址

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

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

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

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

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

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

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

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

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

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

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

先了解幾個概念

Registration ID

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

別名

每個用戶只能指定一個別名。 同一個應用程序內,對不同的用戶,建議取不同的別名。這樣,盡可能根據別名來唯一確定用戶。

標簽

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

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

首先 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 安裝完后 就可以通過命名空間直接引用了.

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

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, // 擴展字段 根據自己業務場景來定.
    ])

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

在開發的過程中發現了一個坑.就是我們的業務需求不需要Ios顯示角標,根據文檔所述,設置badge為0就可以了.但是我們設置后還是沒效果.查看網頁控制端的API調用記錄時,發現傳遞還是顯示角標的參數.

最后跟蹤方法,發現是他們SDK的問題.類的路徑是 /JPush/PushPayload.php

if (isset($notification["badge"]) && (int)$notification["badge"]) {
    $ios["badge"] = $notification["badge"];
}

當傳遞為0的時候就不走這一步,然后默認就是

if (!isset($ios["badge"])) {
    $ios["badge"] = "+1";
}

太坑了,最后修改SDK解決了這個問題.當然在最新版的SDK中官方已經解決了這個問題.我這個包是之前別的項目里的.我直接拿來用的.

最后就調用封裝的代碼

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29359.html

相關文章

發表評論

0條評論

kamushin233

|高級講師

TA的文章

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