React-native之友盟(UMeng)推送集成(超詳細)(android版)
集成環境:
React-native: 0.61.5
Umeng push sdk:6.0.5
測試環境:
Android模擬器版本:5.x(成功)
Android真機版本:6.x、8.x、9.x(成功)(包括:紅米、華爲、VIVO)
集成開始:
- 首先登陸umeng官網(https://message.umeng.com),創建友盟push應用,獲取Appkey和Umeng Message Secret:
- 下面正式進入友盟push集成步驟:
- 下載友盟sdk(https://developer.umeng.com/sdk/androidbeta):
注:這裏要注意一下,最新的push sdk 是6.x的版本,也就是android公測版,不過這裏可以放心下載,這個就是上線的正式版本,解決市面是最新機型(可以理解爲andorid 6.0以後設備)收不到消息的問題,如果您下載的是6.x以下的sdk,會在現在的新手機上 收不到推送的消息
2.在項目android/app 下創建libs 文件夾,把下載的sdk放到libs目錄下:
並在android/app/build.gradle 中加入如下代碼:
- 在 Project 根目錄的gradle.properties文件中添加:
android.useDeprecatedNdk=true
- APP工程的build.gradle中配置jniLibs的目錄:
android {
...
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
-
Android支持包添加
工程中添加android-support-v4.jar支持包(v2.3.0以上),關於v4支持包的說明請參考:https://developer.android.com/topic/libraries/support-library/features.html#v4;
在AndroidManifest.xml中添加權限:
<!-- 以下爲需要的基本權限,需要自行添加至您的AndroidManifest文件中 start-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_ADDED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_INSTALL" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- 以下爲需要的基本權限,需要自行添加至您的AndroidManifest文件中 end-->
在application中添加如下內容:
<service
android:name="com.taobao.accs.ChannelService"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.SERVICE" />
</intent-filter>
<intent-filter>
<action android:name="com.taobao.accs.intent.action.ELECTION" />
</intent-filter>
</service>
<service
android:name="com.taobao.accs.data.MsgDistributeService"
android:exported="true">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.RECEIVE" />
</intent-filter>
</service>
<receiver
android:name="com.taobao.accs.EventReceiver"
android:process=":channel">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver
android:name="com.taobao.accs.ServiceReceiver"
android:process=":channel">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.COMMAND" />
</intent-filter>
<intent-filter>
<action android:name="com.taobao.accs.intent.action.START_FROM_AGOO" />
</intent-filter>
</receiver>
<service
android:name="com.taobao.accs.internal.AccsJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:process=":channel"/>
<service
android:name="com.taobao.accs.ChannelService$KernelService"
android:process=":channel" />
<service
android:name="org.android.agoo.accs.AgooService"
android:exported="true">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.RECEIVE" />
</intent-filter>
</service>
<service
android:name="com.umeng.message.UmengIntentService"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="org.agoo.android.intent.action.RECEIVE" />
</intent-filter>
</service>
<service
android:name="com.umeng.message.XiaomiIntentService"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="org.agoo.android.intent.action.RECEIVE" />
</intent-filter>
</service>
<receiver
android:name="com.taobao.agoo.AgooCommondReceiver"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="${applicationId}.intent.action.COMMAND" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<service
android:name="com.umeng.message.UmengMessageIntentReceiverService"
android:exported="true"
android:process=":channel">
<intent-filter>
<action android:name="org.android.agoo.client.MessageReceiverService" />
</intent-filter>
</service>
<receiver
android:name="com.umeng.message.NotificationProxyBroadcastReceiver"
android:exported="false" />
<service
android:name="com.umeng.message.UmengMessageCallbackHandlerService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false">
<intent-filter>
<action android:name="com.umeng.messge.registercallback.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.enablecallback.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.disablecallback.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.message.handler.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.message.sendmessage.action" />
</intent-filter>
</service>
<service
android:name="com.umeng.message.UmengDownloadResourceService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false" />
<provider
android:name="com.umeng.message.provider.MessageProvider"
android:authorities="${applicationId}.umeng.message"
android:exported="false">
<grant-uri-permission android:pathPattern=".*" />
</provider>
<meta-data android:value="你的appkey" android:name="APPKEY"/>
<meta-data android:value="Umeng" android:name="UMENG_CHANNEL"/>
4.下載react-native集成環境的交接文件:
導入交接文件到項目中:
在MainApplication.java導入文件:
import com.freemusice.push.DplusReactPackage;
import com.freemusice.push.RNUMConfigure;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.message.PushAgent;
import com.umeng.message.IUmengRegisterCallback;
在onCreate方法中初始化umeng:
具體代碼:
RNUMConfigure.init(this, "你的appkey", "Umeng", UMConfigure.DEVICE_TYPE_PHONE,
"你的Umeng Message Secret ");
UMConfigure.setLogEnabled(true);
此處開啓,可以查看正式包的deviceToken,方便後期進行單播模式的推送
具體代碼:
registerUPush();
private void registerUPush() {
PushAgent mPushAgent = PushAgent.getInstance(this);
mPushAgent.setResourcePackageName("你的包名");
//註冊推送服務
mPushAgent.register(new IUmengRegisterCallback() {
@Override
public void onSuccess(String deviceToken) {
Log.e("獲取token成功: " ,deviceToken);
}
@Override
public void onFailure(String s, String s1) {
Log.e("獲取token失敗: " , s);
}
});
PushAgent.getInstance(this).onAppStart();
}
- 在MainActivity.java中添加:
import com.facebook.react.ReactActivity;
import com.freemusice.push.PushModule;(注意換成你自己的包名)
import com.umeng.message.PushAgent;
具體代碼:
PushModule.initPushSDK(this);
PushAgent.getInstance(this).onAppStart();
到這裏react-native android端Umeng push集成完成,下邊就可以測試了!
- 推送測試(這裏需要android studio 來啓動項目,查看deviceToken)
- 測試包:
- 用as 啓動項目,在控制檯查看deviceToken:
- 進入Umeng 工作臺:(先查看當前token設備是否在線,必須保持設備在線狀態)
點擊測試模式,創建測試設備:(輸入token,綁定測試設備)
創建測試推送:
·第一步:填寫帶星號內容
·第二部:選擇獨立用戶,填寫deviceToken
·第三部:點擊完成,確認發送
注:測試模式可能會有1~2個小時的延遲,如果一開始不能立刻收不到推送消息,可以等過一兩個小時在測試
如果你能正常收到推送的消息那麼恭喜你,集成成功,可以進行真機測試了!!!
- 真機測試:
- 刪除剛剛添加的測試設備,然後打正式包(過程就不說了)
- 打開應用,如果是android 6.0 以上系統,需要去設置中打開允許通知
- 打開手機文件管理,找到該應用對應的包名,在裏面會有一個deviceToken的文件,裏面就是當前應用的正式token(具體位置:文件管理 -> 本地文件 -> Android -> data->com.xxx -> files -> deviceToken)
- 用當前的deviceToken 確定設備是否在線(保證設備在線纔行)
- 按照測試發推送的步驟重新走一遍即可
注:
- 同一手機測試包和正式包的token是不一樣的,如果正式包卸載後重新安裝應用,token也有可能不一樣,這個需要重新確認一遍
- 正式環境測試慢的話大概會有1天的時間延遲,所以測試時不能立刻收到通知,也不一定是集成環境的問題
推送效果:
在確認發送通知時,怎麼判斷這條推送消息發送的是測試消息還是正式消息呢?
就是下圖中的production_mode字段來確定的:true爲正式消息;false爲測試消息
如果真機測試沒問題,能收到通知,那麼恭喜你,推送集成成功,之後發送推送,只需要把第二步的獨立用戶切換成全部用戶就可以了。
本教程是本人經過了三天的時間,從開始集成push到最後成功,期間也遇到了各種問題,最終不負衆望,終於完成。文檔儘量全面,也可能會有遺漏的地方,如果你在集成過程中遇到什麼問題,或者有不明白的地方歡迎留言探討,歡迎收藏,謝謝!
demo下載鏈接:
鏈接:https://pan.baidu.com/s/1P-RDbD8eGlSLM4X_ubjJsA
提取碼:cusr