推送技術(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);