ReactNative jPush集成的坑
最近項目需要適配小米、華為、魅族三方的推送,在集成的時候遇到了很多坑,目前將曾經遇到的坑整理一下,今后方便其它同學們集成。在集成之前應該仔細閱讀jPush官方文檔,特別是API的相關變更,建議抽一個jPushHelper中間層以適應jPush接口的變化。
- 確保推送的配置(
AppID,AppKey,AppSecret
)正確
登錄三個平臺相應的開發者網站獲取這三個配置的信息。一般就放在管理控制臺中,然后選擇推送服務,里面會有相應的推送信息,這三個應用配置很重要,如果配置出錯,極光后臺的日志會打印顯示REGISTER FAILED
。
小米推送相關信息.jpg
- 確保jPush插件所帶的jPush庫與build.gradle中引入的推送庫版本號一致。不一致有可能會導致收不到推送。
- 華為集成的坑
在集成華為推送后,華為上就會優先走華為的推送渠道。根據文檔我們需要自己處理推送的消息體,傳回給JS層。在這個時候遇到了很多問題。
1.如果獲取消息體
只需在onCreate
中取出保存在intent
中的消息體,并處理成自己想要的格式。
if( getIntent().getData()) {
String pushInfo = getIntent().getData().toString();
}
2.消息體如果回傳給JS端
獲取reactContext
,并調用emit
方法監聽回調給JS端,
public static void sendEvent(ReactContext reactContext, String eventName, WritableMap params) {
// eventName:監聽事件名稱 params:回調參數(推薦使用WritableMap)
ReactContext reactContext = getReactInstanceManager().getCurrentReactContext();
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, params);
}
3.消息體如果回傳時報錯
當emit時,發現應用一直閃退,打印日志開出,此時的reactContext
為null,需要等待reactContext
初始完畢后,方可發送監聽回調。所以需要暴露一個ReactMethod
給JS端,當這個方法執行時,發送廣播給MainActivity
再執行推送點擊的回調。
/**
* 當RN端加載完畢發送廣播通知原聲端
*
*/
@ReactMethod
public void loadingFinished() {
Log.e(TAG,"廣播發送成功");
Intent intent = new Intent();
intent.setAction("com.loadingFinished"); //設置Action
intent.putExtra("msg", "接收動態注冊廣播成功!"); //添加附加信息
context.sendBroadcast(intent);
}
MainActivity
部分代碼:
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.loadingFinished") && pushInfoString != null) { //動作檢測
WritableMap map = Arguments.createMap();
map.putString("extras", getPushExtraString(pushInfoString));
sendPushInfoToJs(map);
}
}
};
- 其它的坑
1.部分華為手機需要開啟自啟動權限
才能在后臺推送成功(華為系統做了限制,如果不是受信任的信用,不會再后臺開啟相應應用)有些系統較老的即使開啟也不能在后臺收到推送,好坑。。。
2.魅族推送有時會有一定延遲,大概相隔3-5min
才會收到推送(雖說事件不長,但要調試的時候要等一會就挺煩心的= =)
3.調用jPushModule
的setAlias
之前需確保推送當前是開啟的,假如推送關閉會報errorCode:6012
(在JPush服務stop狀態下設置了tag或alias或手機號碼 )
4.在3的基礎下,假如第一次想清除之前App的alias
,則需要確保新的alias
注冊成功后才能調用stop push
。