推送原理解析 極光推送使用詳解

推送技術(shù)產(chǎn)生場景:

--服務(wù)器端主動性: 客戶端與服務(wù)器交互都是客戶端主動的, 服務(wù)器一般不能主動與客戶端進(jìn)行數(shù)據(jù)交互, 因為服務(wù)器端無法得知客戶端的 IP 地址 及 狀態(tài);

--數(shù)據(jù)實時性: 如果服務(wù)器端有緊急數(shù)據(jù)要傳遞給客戶端, 就必須主動向客戶端發(fā)送數(shù)據(jù);

--基本原理: 使客戶端實時獲取服務(wù)器端消息, Pull 方式, 小周期輪詢, 費(fèi)電費(fèi)流量; 另一個就是 Push 方式, 服務(wù)器端向客戶端主動推送數(shù)據(jù), 可以省電省流量;

一. 推送原理

1. Android 推送原理簡介

(1) SMS 方式推送

SMS 推送:

--SMS: Short Message Service 縮寫, 即短信服務(wù);

--實現(xiàn)方式: 服務(wù)器端向手機(jī)端發(fā)送短信, 手機(jī)監(jiān)聽短信廣播, 然后將攔截的短信信息進(jìn)行顯示;

--優(yōu)點(diǎn): 省電, 省流量, 在沒有網(wǎng)絡(luò)的偏遠(yuǎn)地點(diǎn)也能接收到推送消息;

--缺點(diǎn): 費(fèi)錢, 一毛錢一條;

(2) 輪詢 方式推送

輪詢推送:

--實現(xiàn)方式: 周期性主動獲取網(wǎng)絡(luò)中的數(shù)據(jù);

--缺點(diǎn): 費(fèi)電, 費(fèi)流量;

(3) 長鏈接 方式推送

長鏈接推送: 主流方法;

--實現(xiàn)方式: 手機(jī)端與服務(wù)器端建立一條長時間的數(shù)據(jù)流鏈接, 手機(jī)客戶端一直等待服務(wù)器端的數(shù)據(jù);

--優(yōu)點(diǎn): 有一條長鏈接, 有數(shù)據(jù)的時候才發(fā)送數(shù)據(jù), 沒有時不消耗流量, 比較省流量;

--缺點(diǎn): 由于要保存一條長鏈接, 比較費(fèi)電; 在網(wǎng)絡(luò)不穩(wěn)定的情況下, 推送容易失敗;

2. Android 推送解決方案簡介

(1) C2DM 推送 (Google)

C2DM 推送簡介: 全稱 Cloudto Device Messaging, Google 提供的 推送解決方案;

--運(yùn)行方式: 提供一個輕量級機(jī)制, 允許服務(wù)器通知應(yīng)用程序, 主動與客戶端進(jìn)行數(shù)據(jù)交互, 處理消息排隊, 并向運(yùn)行于目標(biāo)設(shè)備的應(yīng)用程序分發(fā)消息;

--優(yōu)點(diǎn): Google 提供的原生框架, 無需在應(yīng)用中添加第三方代碼 和 部署服務(wù)器端;

--缺點(diǎn): 1.該推送依賴 Google 服務(wù)器, 需要綁定 Google 帳號, 目前在中國 Google 被屏蔽, 無法使用; 2. 許多手機(jī)廠商去掉了軟件中的該模塊;

--運(yùn)行機(jī)制圖:

(2) MQTT 推送 (IBM)

MQTT 推送簡介: MQTT 是輕量級的消息發(fā)布"訂閱協(xié)議,

--優(yōu)點(diǎn): 省電, 省流量, 輕量級, 有 C++ 版的服務(wù)器端組件 RSMB;

--缺點(diǎn): RSMB 不開源, 部署成本高, 比較復(fù)雜;

--IBM相關(guān)MQTT官網(wǎng): http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006 ;

RSMB 服務(wù)器端: 全稱 Really Small Message Broker, IBM 提供;

--工作方式: 在服務(wù)器端, 接收消息, 并將 消息 傳輸給指定移動設(shè)備;

--地址: http://www.alphaworks.ibm.com/tech/rsmb ;

MQTT 推送示例:

--客戶端: https://github.com/tokudu/AndroidPushNotificationsDemo ;

--服務(wù)器端 PHP: https://github.com/tokudu/PhpMQTTClient ;

(3) 基于 XMPP 的 AndroidPN 推送 (開源)

XMPP 推送簡介:

--XMPP 簡介: 全稱 Extensible Messaging and Presence Protocol (可擴(kuò)展通訊和表示協(xié)議), 基于可擴(kuò)展標(biāo)記語言(XML)的協(xié)議,它用于即時消息(IM)以及在線探測, 該協(xié)議允許因特網(wǎng)用戶向因特網(wǎng)上的其他任何人發(fā)送即時消息;

--AndroidPN: 基于 XMPP 協(xié)議開發(fā)的 Java 開源 Android 推送通知實現(xiàn), 包含了完整的客戶端 和 服務(wù)器端;

--項目主頁: http://sourceforge.net/projects/androidpn/ ;

--原理圖:

AndroidPN 缺陷: 如果使用該框架進(jìn)行推送, 需要在了解 XMPP 和 anroidPN 基礎(chǔ)上進(jìn)行大量的二次開發(fā);

--連接中斷: 連接時間過長, 連接會中斷, 收不到消息;

--穩(wěn)定性差: 該框架不是很穩(wěn)定;

--糾錯機(jī)制: 消息推送出去后, 不檢查是否推送到客戶端, 推送出去就不管了;

3. 推送 4s 評價標(biāo)準(zhǔn)

4S 標(biāo)準(zhǔn):Safe(安全),Stable(穩(wěn)定),Save(省電省流量省成本),Slim(體積小);

(1) Safe (安全)

推送安全標(biāo)準(zhǔn):

--透明傳輸: 只負(fù)責(zé)點(diǎn)對點(diǎn)的傳輸?shù)馁|(zhì)量, 不關(guān)心中間的傳輸介質(zhì) 與 傳輸業(yè)務(wù)邏輯 協(xié)議等;

--加密方案: 信息需要加密, 另外推送的 ID 系統(tǒng)需要獨(dú)立與后臺已有的 ID 系統(tǒng);

(2) Stable (穩(wěn)定)

服務(wù)器穩(wěn)定: 長鏈接方案對服務(wù)器開銷要求很高, 服務(wù)器端開發(fā)難度很大;

--在線峰值: 同時在線連接數(shù)到達(dá)100萬的穩(wěn)定性;

--并發(fā)時延: 高并發(fā)時的消息平均延遲, 一分鐘處理 100萬 條數(shù)據(jù);

--服務(wù)器穩(wěn)定: 穩(wěn)定性時延占總時間的 99.9%, 有備份和負(fù)載均衡的機(jī)制;

客戶端穩(wěn)定: 中國網(wǎng)絡(luò)狀況復(fù)雜, 手機(jī)長時間聯(lián)網(wǎng)比較難, 穩(wěn)定性比較難, 開發(fā)時要考慮每個省的每個運(yùn)營商, 每款手機(jī)的機(jī)型;

--聯(lián)網(wǎng)時間: 每日聯(lián)網(wǎng)時間 23.5 小時以上;

--消息到達(dá)率: 消息收到后 9 小時內(nèi)客戶端的消息到達(dá)率;

(3) Save (節(jié)省)

節(jié)省評判:

--電量節(jié)省: 注意 CPU 休眠率, 服務(wù)短待機(jī)時間百分比評判;

--流量節(jié)省: 處理協(xié)議 和 冗余數(shù)據(jù)包, 使用空載待機(jī)月流量評判;

--成本節(jié)省: 單服務(wù)器同時承載連接數(shù), 同時承載連接數(shù)越多, 成本越低, 個推單服務(wù)器連接 300 萬(業(yè)內(nèi)頂尖水平);

(4) Slim (體積小)

集成 SDK 大小: 客戶端推送的 SDK 的大小盡量小, 一般要小于 300K;

二. 極光推送概述

1. 功能概述

極光推送基本功能:主動即時的向用戶發(fā)起交互, 可以發(fā)送聊天消息;

--作用: 通過向精準(zhǔn)的目標(biāo)用戶推送有價值的消息, 可以提供用戶忠誠度, 提高留存率;

(1) 推送方式

推送方式簡介:

--通知: 推送文本內(nèi)容, 展示在通知欄中;

--自定義消息: 推送自定義消息, 給用戶自行處理;

--富媒體: 推送 HTML 頁面內(nèi)容;

(2) 推送目標(biāo)

推送目標(biāo)簡介:

--廣播推送: 向所有用戶發(fā)送廣播消息;

--標(biāo)簽推送: 根據(jù)用戶設(shè)置的標(biāo)簽分組, 向某一組推送消息;

--別名推送: 客戶端綁定用戶別名, 向單個用戶推送信息;

(3) 用戶分群

用戶分群簡介: 可以根據(jù) JPush 提供的多條件組合, 對用戶進(jìn)行群組劃分, 實現(xiàn)實時篩選推送;

(4) 推送歷史

推送歷史簡介: 通過 WEB 或者 API 發(fā)出的推送, 都可以在推送歷史記錄中查詢到, 并可以實時顯示推送結(jié)果;

2. 推送框架

推送框架:

--推送數(shù)據(jù)源: 自己開發(fā)的服務(wù)器端 或者 使用 極光推送官網(wǎng)的 WEB 后臺;

--JPush API: 部署在服務(wù)器端, 開發(fā)者的服務(wù)器端發(fā)起推送時, 將數(shù)據(jù)傳到 JPush API 中, 然后再向下傳遞;

--建立長鏈接: 集成 JPush 的 SDK 客戶端啟動后會建立一個到 JPush Cloud 的長鏈接, 提供 App 永遠(yuǎn)在線的能力;

--原理圖:

3. 極光推送原理

參考文章(極光推送官方博客): http://blog.jpush.cn/jpush_wireless_push_principle/ ;

(1) 客戶端原理

IP地址 分配原理:

--IP 地址有限: IPv4 的 IP 地址數(shù)量有限, 運(yùn)營商要動態(tài)地為 手機(jī)分配 IP 地址, 這些 IP 地址都是運(yùn)營商的內(nèi)網(wǎng) IP;

--網(wǎng)絡(luò)地址轉(zhuǎn)換 (NAT): 全稱 Network Address Translation, 網(wǎng)關(guān)維護(hù)一個外網(wǎng) IP 地址, 與 內(nèi)網(wǎng) IP 地址對應(yīng);

--外網(wǎng) IP 不固定: 由于運(yùn)營商持有的外網(wǎng) IP 數(shù)量有限, 需要動態(tài)的分配給接入運(yùn)營商的用戶, 因此在手機(jī)一段時間沒有數(shù)據(jù)傳輸時會將該手機(jī)分配的外網(wǎng) IP 地址收回, 分配給其它用戶;

--解決方案: Android 手機(jī)端想要保持長鏈接, 首先外網(wǎng) IP 地址不能變, 不能讓運(yùn)營商收回 這個 IP 地址;

Android 手機(jī)端實現(xiàn)方案:

--心跳: 為了長時間保持外網(wǎng) IP, 需要客戶端定期發(fā)送心跳給運(yùn)營商, 以便刷新 NAT 列表;

--Timer 定時方法: 該類計劃循環(huán)執(zhí)行定時任務(wù), 但是使用該類會使 CPU 保持喚醒狀態(tài), 比較費(fèi)電;

--AlarmManager 定時方法: 該類封裝了 Android 手機(jī)的 RTC 硬件時鐘模塊, 可以在 CPU 休眠時正常運(yùn)行, 定時任務(wù)執(zhí)行時再喚醒 CPU, 這樣做到了電量節(jié)省;

(2) 服務(wù)器原理

C10K 問題: 單臺服務(wù)器解決 同時保持一萬長鏈接的性能問題;

4. Android SDK 簡介

Android SDK 本質(zhì): JPush SDK 集成到 Android APP 中后,作為一個 Service 在 Android 端長期運(yùn)行, 始終與 服務(wù)器端 保持者長鏈接, 相當(dāng)與永遠(yuǎn)在線;

(1) 多平臺支持

多平臺支持:

--手機(jī)芯片類型: 一般的手機(jī)是 ARM 芯片, 但是有些手機(jī)是 MIPS 芯片 或者 x86 芯片;

--so 庫支持: 每個 CPU 芯片類型對應(yīng)的 so 庫, 都需要特殊編譯, 無法跨平臺調(diào)用, 如 ARM 平臺的 so 庫在 x86 平臺就無法運(yùn)行;

(2) 電量與流量說明

流量消耗: JPush 的協(xié)議是自定義的, 協(xié)議的數(shù)據(jù)量經(jīng)過了精簡, 流量消耗非常少;

電量消耗: JPush 心跳保持連接時可以在 CPU 不喚醒的情況下執(zhí)行, 減少了不必要的代碼運(yùn)行, 電量非常節(jié)省;

(3) 相關(guān)庫說明

JPush 依賴庫:

--.so 依賴庫內(nèi)容: JPush 需要一個 so 動態(tài)庫, 該庫是 C 語言編寫, 在 Linux 下進(jìn)行交叉編譯而來, 可以在 ARM 芯片的手機(jī)上運(yùn)行;

--jar 依賴庫內(nèi)容: 對 Java 代碼的封裝;

三. 極光推送簡單 Demo

Demo 概述: JPush 官方提供了一個簡單 Demo, 向我們演示了 JPush 基本的推送流程, 基本步驟分為下面幾塊, 即

--Web 配置操作部分: 包括 注冊開發(fā)者帳號, 創(chuàng)建應(yīng)用;

--下載手機(jī)示例: 下載系統(tǒng)自動生成的 Android 應(yīng)用示例;

--發(fā)送推送指令: 在 Web 端發(fā)送推送指令, 手機(jī)端接收該指令;

--官方地址: 關(guān)于該模塊詳細(xì)信息可參考官方文檔, http://docs.jpush.io/guideline/android_3m/ ;

1. Web 配置操作

(1) 帳號創(chuàng)建

該步驟就不再贅述, 普通的帳號注冊即可;

(2) 創(chuàng)建應(yīng)用

創(chuàng)建應(yīng)用步驟:

--創(chuàng)建應(yīng)用界面: https://www.jpush.cn/common/apps ;

--創(chuàng)建應(yīng)用: 點(diǎn)擊 創(chuàng)建應(yīng)用 按鈕即可;

--配置應(yīng)用信息: 輸入應(yīng)用名稱, 上傳一個圖標(biāo), 然后填寫一個包名, JPush 系統(tǒng)會在后臺根據(jù)你輸入的包名生成的推送的 Android 應(yīng)用 Demo, 該 Demo 包含了該配置的信息;

查看應(yīng)用設(shè)置界面:

2. 下載導(dǎo)入 Android 應(yīng)用源碼

(1) 下載 Android 應(yīng)用源碼

下載源碼: 在應(yīng)用設(shè)置的 Android 模塊, 有 "下載 Android Example" 按鈕, 點(diǎn)擊該按鈕即可下載 Android 應(yīng)用;

(2) 導(dǎo)入 Android 應(yīng)用源碼

將下載后的源碼解壓, 不用任何修改, 即可導(dǎo)入到應(yīng)用中運(yùn)行;

3. 發(fā)送推送

(1) 不初始化推送無效

直接在后臺推送: 我們在 Android 手機(jī)界面不做任何操作, 直接在網(wǎng)頁后臺推送消息;

--發(fā)送通知: 在應(yīng)用的 "推送" 模塊, 點(diǎn)擊發(fā)送通知按鈕;

--輸入推送內(nèi)容: 輸入任意推送內(nèi)容 "Jpush Demo Send By octopus 1.", 點(diǎn)擊頁面最下方的 "立即發(fā)送" 按鈕;

--對話框選擇: Web 界面會彈出對話框, 提示是否發(fā)送, 選 "發(fā)送吧" 即可;

--查看推送結(jié)果: 點(diǎn)擊之后又彈出對話框, 點(diǎn)擊 "去看看" 可以查看推送結(jié)果;

--推送結(jié)果分析: 點(diǎn)擊上面的 "去看看" 可以查看推送結(jié)果, 點(diǎn)擊 "推送歷史" 按鈕, 也可一查看推送結(jié)果; 由于我們沒有在 客戶端進(jìn)行初始化, 因此推送沒有成功;

(2) 初始化后推送

初始化之后推送:

--手機(jī)端初始化: 點(diǎn)擊手機(jī)端的 "initPush" 按鈕, 進(jìn)行初始化;

--發(fā)送消息: 發(fā)送 "Jpush Demo Send By octopus 2." 消息, 此時連上一次推送的消息也送達(dá), 網(wǎng)絡(luò)不同會延遲一定時間;

--查看發(fā)送結(jié)果: 此時顯示的推送, 兩次都成功了;

(3) 停止 和 恢復(fù) 推送功能

停止恢復(fù)推送功能: 當(dāng)點(diǎn)擊停止推送 "stopPush" 按鈕時, 推送手機(jī)端就不會再接收推送內(nèi)容, 當(dāng)點(diǎn)擊恢復(fù)推送時, 會將期間積攢的所有推送內(nèi)容一次性推送到手機(jī)中;

四. Android 應(yīng)用集成 JPush

1. 依賴庫拷貝

(1) SDK 簡介

SDK 下載: 最新的 SDK 壓縮包 Jpush-Android-sdk-1.7.3.zip ;

--JPush SDK 下載頁面: http://docs.jpush.io/resources/ ;

--Android SDK 下載地址: https://www.jpush.cn/downloads/sdk/android/ ;

詳細(xì)文件說明: 將 Jpush-Android-sdk-1.7.3.zip 解壓, 解壓后的目錄是 Jpush-Android-sdk;

--查看文檔目錄: 使用 tree -L 3 命令, 查看深度為 3 的路徑結(jié)構(gòu);

octopus@octopus:~/JPush/Jpush-Android-sdk$ tree -L 3

.

├── AndroidManifest.xml

├── ChangeLog.txt

├── doc

│? └── Jpush-sdk-集成指南.pdf

├── example

│? ├── AndroidManifest.xml

│? ├── libs

│? │? ├── armeabi

│? │? ├── armeabi-v7a

│? │? └── jpush-sdk-release1.7.3.jar

│? ├── proguard-project.txt

│? ├── project.properties

│? ├── res

│? │? ├── drawable-hdpi

│? │? ├── drawable-ldpi

│? │? ├── drawable-mdpi

│? │? ├── drawable-xhdpi

│? │? ├── layout

│? │? ├── values

│? │? └── values-zh

│? └── src

│? ? ? └── com

└── libs

├── armeabi

│? └── libjpush173.so

├── armeabi-v7a

│? └── libjpush173.so

└── jpush-sdk-release1.7.3.jar

--AndroidManifest.xml (配置文件): 這是 Android 應(yīng)用的主要配置文件示例;

--ChangeLog.txt (升級說明): SDK 版本升級的說明;

--doc (文檔): doc 目錄下 有個 "Jpush-sdk-集成指南.pdf" 文檔, 這是集成 JPush 文檔;

--example (代碼示例): example 明顯是個 Android 示例 demo;

--libs (依賴庫): Android 應(yīng)用中相關(guān)庫, 放在這個目錄中, libjpush173.so 是依賴的 C 底層庫, jpush-sdk-release1.7.3.jar 是依賴的 Java 庫;

(2) 拷貝 依賴庫 到 Android 應(yīng)用中

執(zhí)行過程:

--創(chuàng)建應(yīng)用: 創(chuàng)建一個空應(yīng)用, 注意應(yīng)用最小版本應(yīng)大于 2.1, 否則不能支持極光推送, 應(yīng)用的包名為 cn.org.octopus.jpush.demo 即可, 不用在后臺另外創(chuàng)建一個

--拷貝依賴庫: 在工程根目錄下創(chuàng)建一個 libs 目錄, 拷貝jpush-sdk-release1.7.3.jar到 libs 目錄中, 將armeabi/libjpush173.so和armeabi-v7a/libjpush173.so拷貝到 libs 目錄, 注意要連文件夾一起拷貝, 拷貝完后如下圖;

2. 配置 AndroidManifest.xml 文件

(1) 權(quán)限配置

JPush 定義權(quán)限: JPush 定義了一個權(quán)限, 允許應(yīng)用接收 JPush 代碼發(fā)送的廣播消息, You Package.permission.JPUSH_MESSAGE, 注意要使用你的包名替換其中的 Your Package;


用戶權(quán)限:


可選用戶權(quán)限 :


(2) 配置 JPush 服務(wù)

JPush 服務(wù):

--推送服務(wù):


android:name="cn.jpush.android.service.PushService"

android:enabled="true"

android:exported="false" >

--下載服務(wù):


android:name="cn.jpush.android.service.DownloadService"

android:enabled="true"

android:exported="false" >

(3) 配置 JPush 廣播接收者

JPush 廣播接收者配置:

--推送接收者:


android:name="cn.jpush.android.service.PushReceiver"

android:enabled="true" >


-- 時鐘相關(guān)接收者 :


(4) 配置 渠道 和 推送標(biāo)識

渠道 和 AppKey 配置:








(5) 最終的配置文件

配置好的文件:


package="cn.org.octopus.jpush.demo"

android:versionCode="1"

android:versionName="1.0" >

android:minSdkVersion="17"

android:targetSdkVersion="19" />

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

android:name=".MainActivity"

android:label="@string/app_name" >

android:name="cn.jpush.android.service.PushService"

android:enabled="true"

android:exported="false" >

android:name="cn.jpush.android.service.DownloadService"

android:enabled="true"

android:exported="false" >

android:name="cn.jpush.android.service.PushReceiver"

android:enabled="true" >

3. 推送測試

后臺推送:

--控制臺地址: https://www.jpush.cn/common/apps/ ;

--發(fā)起推送: 進(jìn)入控制臺, 點(diǎn)擊對應(yīng)的應(yīng)用, 進(jìn)入推送頁面;

--查看結(jié)果:

--推送統(tǒng)計:

五. JPush 相關(guān) API

1. 初始化 停止 恢復(fù) 推送

推送控制方法:

--初始化推送: JPushInterface.init(Context context), 初始化之后才能接收推送消息;

--恢復(fù)推送: JPushInterface.resumePush(Context context), 停止推送后, 調(diào)用該方法, 即可恢復(fù)推送;

--停止推送: JPushInterface.stopPush(Context context), 調(diào)用該方法之后, 手機(jī)便收不到推送信息了;

代碼示例 :

public void onClick(View view) {

int id = view.getId();

switch (id) {

case R.id.init_jpush:

//初始化 JPush, 初始化之后才可以進(jìn)行推送, 否則推送失敗

JPushInterface.init(this);

//設(shè)置調(diào)試模式, 可以在 LogCat 中查看 JPush 日志

JPushInterface.setDebugMode(true);

break;

case R.id.start_jpush:

//恢復(fù)推送

JPushInterface.resumePush(getApplicationContext());

break;

case R.id.stop_jpush:

//停止推送

JPushInterface.stopPush(getApplicationContext());

break;

default:

break;

}

}

界面效果及說明:

--界面效果:

--按鈕說明: 點(diǎn)擊 "初始化" 按鈕就可以接收推送消息, 點(diǎn)擊 "停止推送" 按鈕手機(jī)停止接收消息推送, 點(diǎn)擊 "恢復(fù)推送" 即開始接收推送消息;

2. 根據(jù) 別名 和 標(biāo)簽 分組推送

參考文檔: http://docs.jpush.cn/pages/viewpage.action?pageId=557241

(1) 概念介紹

別名:

--作用: 別名用于代表安裝了應(yīng)用的用戶, 每個用戶對應(yīng)著一個別名;

--用戶與別名對應(yīng)性 (多對一): 每個用戶只能指定一個別名, 一個別名可以同時指定給多個用戶, 給別名發(fā)消息時, 會同時給所有設(shè)置該別名的用戶發(fā)消息;

標(biāo)簽:

--作用: 方便開發(fā)者根據(jù)標(biāo)簽發(fā)送推送消息;

--用戶與標(biāo)簽對應(yīng)性(多對多): 一個用戶可以有多個標(biāo)簽, 一個標(biāo)簽可以設(shè)置給多個用戶;

(2) 設(shè)置別名標(biāo)簽接口方法

設(shè)置別名與標(biāo)簽方法:

--方法接口:

public static void setAliasAndTags(

Context context, //上下文對象

String alias, //別名, 只能設(shè)置一個別名

Set tags, //標(biāo)簽集合, 可設(shè)置多個標(biāo)簽

TagAliasCallback callback) //回調(diào)接口, 其中有一個 gotResult 接口方法, 系統(tǒng)回傳入錯誤碼給 responseCode 參數(shù)

-- 別名設(shè)置說明 : a. 設(shè)置 null(沒有地址) 即不設(shè)值值; b. 設(shè)置 "" (初始化后) 即清空之前的設(shè)置; c. 設(shè)置會覆蓋之前的設(shè)置; d. 長度 40字節(jié) UTF8 編碼;

--標(biāo)簽設(shè)置說明:a. 設(shè)置 null(沒有地址) 即不設(shè)值值; b. 設(shè)置 空集合(沒有數(shù)據(jù), 已經(jīng)初始化) 即清空之前的設(shè)置; c. 設(shè)置會覆蓋之前的設(shè)置; d. 每個標(biāo)簽長度 40字節(jié) UTF8 編碼, 最多 100 個標(biāo)簽;

設(shè)置別名方法:

--方法接口:

public static void setAlias(

Context context, //上下文對象

String alias, //別名內(nèi)容

TagAliasCallback callback) //回調(diào)接口

-- 參數(shù)說明 : 該參數(shù)與 setAliasAndTags 方法參數(shù)相同;

設(shè)置標(biāo)簽方法:

--方法接口:

public static void setTags(

Context context,

Set tags,

TagAliasCallback callback)

--參數(shù)說明:該參數(shù)與setAliasAndTags 方法參數(shù)相同;

過濾無效標(biāo)簽: 感覺這純屬 JPush API 定義缺陷, 這個應(yīng)該對我們隱藏才對;

--方法接口:

public static Set filterValidTags(Set tags)

--作用: 設(shè)置標(biāo)簽時如果 標(biāo)簽Set集合 中有一個是無效的, 那么整個設(shè)置都無效, 應(yīng)該是設(shè)計缺陷, 后期修補(bǔ) BUG 的權(quán)益之際;

回調(diào)接口: TagAliasCallback 回調(diào)接口;

--方法接口:

public void gotResult(

int responseCode, //錯誤碼

String alias, //別名

Set tags); //標(biāo)簽集合

代碼示例:

--設(shè)置方法代碼:

String alias = set_alias.getText().toString();

String tag = set_tag.getText().toString();

Set set = new HashSet();

set.add(tag);

JPushInterface.setAliasAndTags(

getApplicationContext(),

alias,

set,

this);

Log.i(TAG, "已設(shè)置別名 與 標(biāo)簽");

-- 回調(diào)方法 :

@Override

public void gotResult(int arg0, String arg1, Set arg2) {

Log.i(TAG, "錯誤碼 : " + arg0 + " , 別名 : " + arg1);

}

--手機(jī)端設(shè)置:

-- 后臺發(fā)送極光推送 :

--設(shè)置標(biāo)簽:

--標(biāo)簽報錯: 如果設(shè)置的標(biāo)簽沒有手機(jī)注冊, 會出現(xiàn)如下報錯;

--推送結(jié)果:

--推送通知消息:

3. 根據(jù) RegistrationID 進(jìn)行單機(jī)推送

參考文檔 : http://docs.jpush.cn/pages/viewpage.action?pageId=8814639

(1) 概念介紹

RegistrationID 簡介: 應(yīng)用第一次注冊到 JPush 后臺時, 會生成一個唯一的設(shè)備標(biāo)識 RegistrationID, 每個設(shè)備不重復(fù);

(2) 獲取RegistrationID

方法接口:

//SDK 初次注冊成功后,開發(fā)者通過在自定義的 Receiver 里監(jiān)聽 Action - cn.jpush.android.intent.REGISTRATION 來獲取對應(yīng)的 RegistrationID。注冊成功后,也可以通過此函數(shù)獲取

public static String getRegistrationID(Context context)

-- 獲取 RegistrationID 代碼 :

//獲取 RegistrationID

String registrationid = JPushInterface.getRegistrationID(getApplicationContext());

tv_registrationid.setText("RegistrationID : " + registrationid);

--界面示例:

--后臺推送設(shè)置:

4. 清除通知

清除通知簡介 :

-- 方法接口 :

public static void clearAllNotifications(Context context);

-- 代碼示例 :

case R.id.clear_notification:

//清除所有通知

JPushInterface.clearAllNotifications(getApplicationContext());

break;

-- 效果 : 在后臺發(fā)送一條消息, 點(diǎn)擊清除按鈕, 所有的推送通知都清除;

5. 推送時間限制

(1) 設(shè)置允許推送時間

方法接口:

public static void setPushTime(

Context context, //上下文對象

Set weekDays, //允許接收推送的 一周天數(shù)

int startHour, //開始時間

int endHour) //結(jié)束時間

-- 代碼示例 :

Set days = new HashSet();

days.add(1);

days.add(2);

days.add(3);

days.add(4);

days.add(5);

JPushInterface.setPushTime(getApplicationContext(), days, 10, 23);

(2) 設(shè)置禁止推送時間

方法接口:

public static void setSilenceTime(

Context context, //上下文對象

int startHour, //開始時間-小時

int startMinute, //開始時間-分鐘

int endHour, //結(jié)束時間-小時

int endMinute) //結(jié)束時間-分鐘

-- 代碼示例 :

JPushInterface.setSilenceTime(getApplicationContext(), 22, 30, 8, 30);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,268評論 25 708
  • 版本記錄 前言 ??現(xiàn)在很多APP都有推送功能,其中極光推送就是很多APP的首選。我們最近的幾個APP也是用的極光...
    刀客傳奇閱讀 8,520評論 0 8
  • 版本記錄 前言 前一篇已經(jīng)對ios新特性進(jìn)行了介紹,這一篇則對ios的SDK進(jìn)行說明。1. 極光推送集成(一)2....
    刀客傳奇閱讀 1,336評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 生活中,很多年輕人靠自己的奮斗去實現(xiàn)夢想,去滿足自己的物質(zhì)需求。他們既不能拼爹,也不能拼媽,那么,對于年輕人來說,...
    謝筱言閱讀 1,023評論 2 2