騰訊-信鴿實現訊息推送
信鴿Android SDK是一個能夠提供Push服務的開發平臺,提供給開發者簡便、易用的API介面,方便快速接入。
目前支援Android 2.2及以上版本系統。
本文件將引導使用者以最快的速度嵌入信鴿SDK。
註冊&下載SDK
前往前臺 信鴿首頁,使用QQ號碼登陸,開啟註冊頁面,填寫“應用名稱”和“應用包名”(必須要跟APP一致),選擇“作業系統”和“分類”,最後點選“建立應用”。
應用建立成功後,點選“應用配置”即可看到APP專屬的AccessId和AccessKey等資訊。
註冊完成後,請下載最新版本的Android SDK到本地,並解壓。
工程配置
以eclipse為開發的IDE為例,將SDK匯入到工程的步驟為:
1、建立或開啟Android工程(關於如何建立Android工程,請參照開發環境的章節)。
2、將信鴿 SDK目錄下的libs目錄所有檔案拷貝到工程的libs(或lib)目錄下。
3、選中libs(或lib)目錄下的信鴿jar包,右鍵選單中選擇Build Path, 選擇Add to Build Path將SDK新增到工程的引用目錄中。
4、開啟Androidmanifest.xml,新增以下配置(建議參考下載包的Demo修改),其中YOUR_ACCESS_ID和YOUR_ACCESS_KEY替換為APP對應的accessId和accessKey
<application <!-- APP專案的其它配置... --> <!-- 【必須】 信鴿receiver廣播接收 --> <receiver android:name="com.tencent.android.tpush.XGPushReceiver" android:process=":xg_service_v2" > <intent-filter android:priority="0x7fffffff" > <!-- 【必須】 信鴿SDK的內部廣播 --> <action android:name="com.tencent.android.tpush.action.SDK" /> <action android:name="com.tencent.android.tpush.action.INTERNAL_PUSH_MESSAGE" /> <!-- 【必須】 系統廣播:開屏和網路切換 --> <action android:name="android.intent.action.USER_PRESENT" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <!-- 【可選】 一些常用的系統廣播,增強信鴿service的復活機會,請根據需要選擇。當然,你也可以新增APP自定義的一些廣播讓啟動service --> <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" /> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> </intent-filter> </receiver> <!-- 【必須】 (2.30及以上版新增)展示通知的activity --> <!-- 【注意】 如果被開啟的activity是啟動模式為SingleTop,SingleTask或SingleInstance,請根據通知的異常自查列表第8點處理--> <activity android:name="com.tencent.android.tpush.XGPushActivity" android:exported="true" > <intent-filter> <!-- 若使用AndroidStudio,請設定android:name="android.intent.action"--> <action android:name="" /> </intent-filter> </activity> <!-- 【必須】 信鴿service --> <service android:name="com.tencent.android.tpush.service.XGPushService" android:exported="true" android:persistent="true" android:process=":xg_service_v2" /> <!-- 【必須】 通知service,此選項有助於提高抵達率 --> <service android:name="com.tencent.android.tpush.rpc.XGRemoteService" android:exported="true" > <intent-filter> <action android:name="應用包名.PUSH_ACTION" /> </intent-filter> </service> <!-- 【必須】 請將YOUR_ACCESS_ID修改為APP的AccessId,“21”開頭的10位數字,中間沒空格 --> <meta-data android:name="XG_V2_ACCESS_ID" android:value="YOUR_ACCESS_ID" /> <!-- 【必須】 請將YOUR_ACCESS_KEY修改為APP的AccessKey,“A”開頭的12位字串,中間沒空格 --> <meta-data android:name="XG_V2_ACCESS_KEY" android:value="YOUR_ACCESS_KEY" /> </application> <!-- 【必須】 信鴿SDK所需許可權 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RESTART_PACKAGES" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.VIBRATE" /> <!-- 【可選】 信鴿SDK所需許可權 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BATTERY_STATS" />
啟動並註冊App
完成工程配置後,開啟工程的主Activity,在其onCreate(Bundle savedInstanceState)過載方法內,新增以下程式碼,完成信鴿服務的啟動與APP註冊過程。
// 開啟logcat輸出,方便debug,釋出時請關閉 // XGPushConfig.enableDebug(this, true); // 如果需要知道註冊是否成功,請使用registerPush(getApplicationContext(), XGIOperateCallback)帶callback版本 // 如果需要繫結賬號,請使用registerPush(getApplicationContext(),account)版本 // 具體可參考詳細的開發指南 // 傳遞的引數為ApplicationContext Context context = getApplicationContext(); XGPushManager.registerPush(context); // 2.36(不包括)之前的版本需要呼叫以下2行程式碼 Intent service = new Intent(context, XGPushService.class); context.startService(service); // 其它常用的API: // 繫結賬號(別名)註冊:registerPush(context,account)或registerPush(context,account, XGIOperateCallback),其中account為APP賬號,可以為任意字串(qq、openid或任意第三方),業務方一定要注意終端與後臺保持一致。 // 取消繫結賬號(別名):registerPush(context,"*"),即account="*"為取消繫結,解綁後,該針對該賬號的推送將失效 // 反註冊(不再接收訊息):unregisterPush(context) // 設定標籤:setTag(context, tagName) // 刪除標籤:deleteTag(context, tagName)
程式碼嵌入完成後,啟動APP,如果在logcat中的TPush標籤看到以下類似的輸出,說明已經註冊成功,並返回token。
- 圖:註冊成功本地標籤為“TPush”標籤的logcat日誌列印
注意;可能.so包有問題。所以好看一些步驟:
驗證
前往信鴿前臺,選擇“建立通知”,輸入“標題”和“內容”,點選“確認推送”。稍等幾秒後,如果順利的話,終端裝置應該能夠收到這條通知。
- 圖:前臺下發通知介面
- 圖:終端裝置收到通知介面
通過上面的接入,APP已經具備接收通知推送的能力。
當然,如果還需要更高階的功能,請繼續閱讀或引數《SDK開發指南》
通知的異常自查列表
信鴿的釋出包都是經過嚴格測試的,遇到問題時,尤其是開發環境問題,建議先自行搜尋網上解決方案。
常見的檢查列表:
1.裝置是否正常聯網?
2.檢查AndroidManifest.xml是否配置正確?建議直接參考demo的例子改
2.1. accessId、accessKey設定是否與前臺註冊的一致? 2.2. 相關許可權是否齊全? 2.3. receiver、service和activity相關元件是否配置好?
3.裝置是否註冊成功?
4.當前APP包名是否與前臺註冊的一致,如果不一致請在前臺選中“使用多包名”選項?
5.前臺下發通知時,“時段控制”選項裡的時間段是否符合終端裝置當前時間?
6.請根據“常見問題與解答”,看看是否有解決方案。
7.2.30及以上版本請檢查xml配置檔案是否新增com.tencent.android.tpush.XGPushActivity相關的內容
8.停留在後臺的APP點選通知不能開啟APP:被開啟的activity(特別是LAUNCHER)啟動模式為SingleTop,SingleTask或SingleInstance,請在該activity過載onNewIntent方法:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent);// 必須要呼叫這句 }
9.對於使用AndriodStudio的同學,若AndroidManifest.xml編譯不通過,XGPushActivity配置改為: <action android:name="android.intent.action" />
10.請檢查AndroidManifest.xml是否已正確配置XGRemoteService,且intent-filter中是否正確設定: <action android:name="應用包名.PUSH_ACTION" />,應用包名為當前APP包名,如com.tencent.xgdemo
11.是否已設定APP預設的icon?由於系統原因,若沒有icon,通知將不能展示。
12.(2.36之前的版本)已知MIUI V6上會禁用所有靜態廣播,若出現有類似的情況,請新增以下程式碼相容該系統。
// 在XGPushManager.registerPush(context)或其它版本的註冊介面之後呼叫以下程式碼 // 使用ApplicationContext Context context = getApplicationContext(); Intent service = new Intent(context, XGPushService.class); context.startService(service);
13.點選通知,出現不能開啟activity的情況,請在AndroidManifest.xml中將XGPushActivity的exported屬性設定為true。
14.點選通知,出現重複開啟APP的情況,請將被開啟的Activity啟動模式改為SingleTop,SingleTask或SingleInstance。
15.點選通知,不希望觸發activity被開啟的動作,可以:1.推送時,填寫一個不存在的頁面名稱;2.使用訊息透傳(命令字)推送,收到訊息後,自己彈出通知。
16.註冊出現-10005錯誤,請在AndroidMenifest.xml新增XGRemoteService。
如果還不能排查問題,請加入信鴿開發者技術QQ群:333782566,會有專門的人員協助。
包衝突
1.jar包衝突:
如果提示jar包衝突,請刪除衝突的包,保留一份即可,建議保留版本高的。 常見的衝突有: 1)MSDK與信鴿衝突:刪除wup.jar 2)MTA與信鴿衝突:刪除低版本的mid.jar
2. .so檔案匯入:.so檔案是信鴿必須的元件,支援armeabi、armeabi-v7a、misp和x86平臺,請根據自己當前.so支援的平臺新增
1)如果你的專案中沒有使用其它.so,建議複製四個平臺目錄到自己工程中 2)如果已有.so檔案,只需要複製信鴿對應目錄下的檔案 3)若是MSDK接入的遊戲,通常只需要armeabi目錄下的.so 4)若當前工程已經有armeabi,那麼只需要新增信鴿的armeabi下的.so,其它目錄無需新增。其它情況類似,只添加當前平臺存在的平臺即可。
程式碼混淆
如果你的專案中使用proguard等工具做了程式碼混淆,請保留以下選項,否則將導致信鴿服務不可用。
-keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep class com.tencent.android.tpush.** {*;} -keep class com.tencent.mid.** {*;}
關於抵達量/點選量和自定義key-value的統計
2.30及以上版本
2.30及以上版本:使用信鴿SDK內建的activity展示頁面,預設已經統計通知/訊息的抵達量、通知的點選和清除動作。但如果開發者要監聽這些事件,可參考“Android SDK開發指南”中的“【2.30及以上版本】通知效果監聽和自定義key-value”章節。
XGPushManager.onActivityStarted(this)獲取通知被點選及自定義key-value由原來的onStart()改為onResume()
@Override protected void onResume() { super.onResume(); XGPushClickedResult click = XGPushManager.onActivityStarted(this); if (click != null) { // 判斷是否來自信鴿的開啟方式 // 根據實際情況處理... // 如獲取自定義key-value } }
同理,XGPushManager.onActivityStoped(this)由onStop()改為onPause()內呼叫,即:
@Override protected void onPause() { super.onPause(); XGPushManager.onActivityStoped(this); }
注意:
1)需要將onActivityStarted和onActivityStoped嵌入到所有可能被開啟的activity,建議所有activity都加上。
2)如果被開啟的activity啟動模式為SingleTop,SingleTask或SingleInstance,請根據以下在該activity過載onNewIntent方法:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent);// 必須要呼叫這句 }
通知在通知欄被點選或清除時的回撥,即自定義Receiver(需過載XGPushBaseReceiver)的onNotifactionClickedResult過載方法中區分點選和清除動作,XGPushClickedResult新增getActionType(),其中XGPushClickedResult.NOTIFACTION_CLICKED_TYPE表示點選操作,XGPushClickedResult.NOTIFACTION_DELETED_TYPE表示清除操作。即:
@Override public void onNotifactionClickedResult(Context context, XGPushClickedResult message) { if (context == null || message == null) { return; } if (message.getActionType() == XGPushClickedResult.NOTIFACTION_CLICKED_TYPE) { // 通知在通知欄被點選啦。。。。。 // APP自己處理點選的相關動作 // 這個動作可以在activity的onResume也能監聽,請看第3點相關內容 } else if (message.getActionType() == XGPushClickedResult.NOTIFACTION_DELETED_TYPE) { // 通知被清除啦。。。。 // APP自己處理通知被清除後的相關動作 } }
2.30版本之前
2.0/2.1x/2.2x版本:SDK預設統計通知/訊息的抵達量,但對於點選量和自定義key-value,需要所有activity的onStart過載方法中呼叫 XGPushManager.onActivityStarted(this);才能統計,具體請參考“Android SDK開發指南”中的“【2.30以前版本】通知開啟效果和自定義key-value”章節。