摘要:開發(fā)者可以通過指定具體的來進(jìn)行對單一設(shè)備的推送。同一個(gè)應(yīng)用程序內(nèi),對不同的用戶,建議取不同的別名。其關(guān)鍵字分別為。確認(rèn)推送設(shè)備對象,提供了多種方式,比如別名標(biāo)簽注冊分群廣播等。
作者:黃志成(小黃)作者博客:博客地址
新版本推送的需求變的更加復(fù)雜.需要接入一個(gè)專業(yè)的推送了.之前一直基于APP的IM來實(shí)現(xiàn)的.
目前市面上主流的推送平臺有 極光、友盟、信鴿等等..
通過調(diào)研最后選擇了 極光推送平臺
什么是推送平臺呢?下面通過一張圖來舉例
我們業(yè)務(wù)服務(wù)器請求極光平臺提供的接口.請求他們,然后由極光平臺將信息推送給我們的用戶.
一直提到的推送,可能有些新手朋友還是很懵.什么是推送??
通常HTTP請求中,都是由客戶端向服務(wù)端請求,然后服務(wù)器響應(yīng)數(shù)據(jù).可是有些情況下,需要我們主動向客戶端響應(yīng)數(shù)據(jù).
而這個(gè)主動響應(yīng)數(shù)據(jù)的過程就是推送.
那么是如何實(shí)現(xiàn)推送的呢?
簡單點(diǎn)說就是建立一條長連接.平常的HTTP都是短連接,響應(yīng)完數(shù)據(jù)后就會被關(guān)閉.而長連接卻一直連接著.既然是一直連接著的,我們就可以找到這條連接,然后主動給他推送消息.
好了.回到正題.下面我們來繼續(xù)說如何接入極光推送.
先了解幾個(gè)概念
Registration ID
客戶端初始化 JPush 成功后,JPush 服務(wù)端會分配一個(gè) Registration ID,作為此設(shè)備的標(biāo)識(同一個(gè)手機(jī)不同 APP 的 Registration ID 是不同的)。開發(fā)者可以通過指定具體的 Registration ID 來進(jìn)行對單一設(shè)備的推送。
別名
每個(gè)用戶只能指定一個(gè)別名。 同一個(gè)應(yīng)用程序內(nèi),對不同的用戶,建議取不同的別名。這樣,盡可能根據(jù)別名來唯一確定用戶。
標(biāo)簽
為安裝了應(yīng)用程序的用戶打上標(biāo)簽,其目的主要是方便開發(fā)者根據(jù)標(biāo)簽,來批量下發(fā) Push 消息。 可為每個(gè)用戶打多個(gè)標(biāo)簽。
咱們在通過一張圖來理解之間的關(guān)系
首先 Registration ID 是唯一的.我們可以給這個(gè)Id設(shè)置一個(gè)別名,也就是一個(gè)備注.這個(gè)別名可以設(shè)置成與我們平臺的用戶賬號相同.這樣可以方便我們推送.
當(dāng)然逐個(gè)推送是很麻煩的.我們可以給這些用戶打一個(gè) Tag 標(biāo)簽. 比如北京的用戶放在北京的Tag標(biāo)簽下.單身的用戶放在單身的Tag標(biāo)簽下.我們以Tag來推送,就能達(dá)到群發(fā)效果.
了解概念后.我們應(yīng)該清楚這個(gè)時(shí)候需要把 JPush 注冊用戶與開發(fā)者App 用戶綁定起來。
這個(gè)綁定有兩個(gè)基本思路:
把綁定關(guān)系保存到 JPush 服務(wù)器端
把綁定關(guān)系保存到開發(fā)者應(yīng)用服務(wù)器中
第一種就是之前說到的別名和標(biāo)簽。由客戶端來設(shè)置別名.
客戶端開發(fā)者會調(diào)用 setAlias或者setTags API 來設(shè)置關(guān)系SDK 把該關(guān)系設(shè)置保存到 JPush Server 上
在服務(wù)器端推送消息時(shí),指定向之前設(shè)置過的別名或者標(biāo)簽推送.
第二種就相對麻煩一些.由客戶端將Registration ID傳遞給服務(wù)端,然后由服務(wù)端來處理對應(yīng)關(guān)系.
我們這里采用的是第一種,通過客戶端來設(shè)置別名或者標(biāo)題.
JPush提供四種消息形式:通知,自定義消息,富媒體和本地通知。
這里我們主要介紹通知消息.只要理解了第一種,其他在文檔中看看就能很輕松理解.
通知
或者說 Push Notification,即指在手機(jī)的通知欄(狀態(tài)欄)上會顯示的一條通知信息。 通知主要用于提示用戶的目的,應(yīng)用于新聞內(nèi)容、促銷活動、產(chǎn)品信息、版本更新提醒、訂單狀態(tài)提醒等多種場景
這里先附上官網(wǎng)文檔的地址,下面所說的內(nèi)容都是基于這個(gè)文檔的.
文檔地址:極光推送
還是先了解幾個(gè)概念
platform:推送平臺
JPush 當(dāng)前支持 Android, iOS, Windows Phone 三個(gè)平臺的推送。其關(guān)鍵字分別為:"android", "ios", "winphone"。
如果目標(biāo)平臺為 iOS 平臺 需要在 options 中通過 apns_production 字段來設(shè)定推送環(huán)境。True 表示推送生產(chǎn)環(huán)境,F(xiàn)alse 表示要推送開發(fā)環(huán)境; 如果不指定則為推送生產(chǎn)環(huán)境
推送到所有平臺:
{ "platform" : "all" }
指定特定推送平臺:
{ "platform" : ["android", "ios"] }
通常情況下指定 android 和 ios 就可以了。如果產(chǎn)品有winphone版本的也可以選擇推送到所有平臺,這里沒有什么太多問題.
audience:推送目標(biāo)
推送設(shè)備對象,表示一條推送可以被推送到哪些設(shè)備列表。確認(rèn)推送設(shè)備對象,JPush 提供了多種方式,比如:別名、標(biāo)簽、注冊ID、分群、廣播等。
這里具體的參數(shù)就請看文檔吧.
我們在封裝推送方法的使用,需要對Android 和 ios 的配置進(jìn)行分別設(shè)置.下面我會在我封裝的方法里進(jìn)行說明.
首先先去集成sdk.通過Composer就可以了
在項(xiàng)目中的 composer.json 文件中添加 jpush 依賴:
"require": { "jpush/jpush": "^3.5" }
執(zhí)行 $ php composer.phar install** 或 **$ composer install 進(jìn)行安裝。
也可以直接下載.下載地址去文檔中找吧~
composer 安裝完后 就可以通過命名空間直接引用了.
下面是我簡單封裝的一個(gè)推送方法.
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 表示推送生產(chǎn)環(huán)境,F(xiàn)alse 表示要推送開發(fā)環(huán)境 //"big_push_duration" => 10, ]) ->send (); return $result; } catch (Exception $e) { // 寫入錯(cuò)誤日志 // 這里根據(jù)自己的業(yè)務(wù)來定 } } }
可以根據(jù)代碼看出來.我使用 iosNotification 和 androidNotification 方法進(jìn)行兩個(gè)設(shè)備的推送設(shè)置.
// Ios的通知配置項(xiàng) ->iosNotification ( $content, // 推送的內(nèi)容 [ "sound" => "1", // 是否有聲音 "badge" => (int)$ios_badge, // 顯示的角標(biāo)數(shù) "content-available" => true, // 去文檔中查看具體用處,一般設(shè)置為true或者1 "category" => "jiguang", // 這里也去文檔中查看吧 "extras" => $params, // 擴(kuò)展字段 根據(jù)自己業(yè)務(wù)場景來定. ])
安卓的推送也是類似的.更多具體的配置項(xiàng)去文檔中查看。
在開發(fā)的過程中發(fā)現(xiàn)了一個(gè)坑.就是我們的業(yè)務(wù)需求不需要Ios顯示角標(biāo),根據(jù)文檔所述,設(shè)置badge為0就可以了.但是我們設(shè)置后還是沒效果.查看網(wǎng)頁控制端的API調(diào)用記錄時(shí),發(fā)現(xiàn)傳遞還是顯示角標(biāo)的參數(shù).
最后跟蹤方法,發(fā)現(xiàn)是他們SDK的問題.類的路徑是 /JPush/PushPayload.php
if (isset($notification["badge"]) && (int)$notification["badge"]) { $ios["badge"] = $notification["badge"]; }
當(dāng)傳遞為0的時(shí)候就不走這一步,然后默認(rèn)就是
if (!isset($ios["badge"])) { $ios["badge"] = "+1"; }
太坑了,最后修改SDK解決了這個(gè)問題.當(dāng)然在最新版的SDK中官方已經(jīng)解決了這個(gè)問題.我這個(gè)包是之前別的項(xiàng)目里的.我直接拿來用的.
最后就調(diào)用封裝的代碼
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-項(xiàng)目 "title" => empty($title) ? self::APP_NAME : $title, "content" => $txt, "redirect_url" => $url ]; $res = JPush::pushMessageByAlias ($title, $txt, $uids, $ext); return $res; }
我們只要調(diào)用這個(gè)方法就能實(shí)現(xiàn)推送了.
$ext 就是我們與客戶端定義的信息格式.他們會根據(jù)push_type來執(zhí)行不同操作.
最后再補(bǔ)充一點(diǎn).就是我們開發(fā)和生產(chǎn)使用的是一個(gè)極光應(yīng)用.所以不能隨便發(fā)送廣播消息在開發(fā)環(huán)境中.
那如何區(qū)分生產(chǎn)環(huán)境和開發(fā)環(huán)境呢?
下面是官方給出的建議
1.使用相同的 Appkey 和 包名,推送時(shí)使用 registrationID、tag、alias 針對性的對測試機(jī)進(jìn)行推送測試
2.如果你一定要測試廣播推送,那么在官網(wǎng)新建一個(gè)測試應(yīng)用,Appkey 和包名不一樣,專門用作測試
3.如果你還需要包名一樣并測試廣播推送,那么在官網(wǎng)新建一個(gè)極光賬號,新建一個(gè)測試應(yīng)用,配相同的包名進(jìn)行測試。
這篇文章就記錄到這,以后有想補(bǔ)充的在更新了.完成于:2018年09月01日00:22:32
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29359.html
閱讀 2241·2021-11-18 10:02
閱讀 3496·2021-11-15 11:36
閱讀 1122·2019-08-30 14:03
閱讀 738·2019-08-30 11:08
閱讀 2767·2019-08-29 13:20
閱讀 3293·2019-08-29 12:34
閱讀 1380·2019-08-28 18:30
閱讀 1646·2019-08-26 13:34