1. 程式人生 > >騰訊-信鴿實現訊息推送

騰訊-信鴿實現訊息推送

信鴿Android SDK是一個能夠提供Push服務的開發平臺,提供給開發者簡便、易用的API介面,方便快速接入。
目前支援Android 2.2及以上版本系統。

本文件將引導使用者以最快的速度嵌入信鴿SDK。

註冊&下載SDK

前往前臺 信鴿首頁,使用QQ號碼登陸,開啟註冊頁面,填寫“應用名稱”和“應用包名”(必須要跟APP一致),選擇“作業系統”和“分類”,最後點選“建立應用”。
應用建立成功後,點選“應用配置”即可看到APP專屬的AccessId和AccessKey等資訊。
10min demo regi.png

註冊完成後,請下載最新版本的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日誌列印

10 min demo token.png

注意;可能.so包有問題。所以好看一些步驟:


驗證

前往信鴿前臺,選擇“建立通知”,輸入“標題”和“內容”,點選“確認推送”。稍等幾秒後,如果順利的話,終端裝置應該能夠收到這條通知。

  • 圖:前臺下發通知介面

10min demo pushprocess.png

  • 圖:終端裝置收到通知介面

10 min demo arrived.png

通過上面的接入,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”章節。