- 先到極光推送後臺開通廠商推送功能(此功能需要收費,需要聯繫商務開通)
- 到各廠商開發者平臺註冊應用,然後對應開啓推送功能,獲取對應的key和secret
需要注意的是,有些廠商在申請推送功能時審覈時間有點長,最好提前申請
- 到極光後臺推送設置-廠商通道頁面裏填寫申請的對應的key和secret
- 到極光官網獲取廠商推送SDK
廠商推送功能其實是極光幫忙幫廠商推送的SKD進行封裝後集成到極光的SDK裏,所以需要按照極光提供的文檔進行接入,不需要再考慮對應平臺的計入方法
// 極光
api 'cn.jiguang.sdk:jpush:3.3.8'
api 'cn.jiguang.sdk:jcore:2.1.6'
//huawei push
api 'cn.jiguang.sdk.plugin:huawei:3.3.8'
//xiaomi push
api 'cn.jiguang.sdk.plugin:xiaomi:3.3.8'
//oppo push
api 'cn.jiguang.sdk.plugin:oppo:3.3.8'
//vivo push
api 'cn.jiguang.sdk.plugin:vivo:3.3.8'
- 到應用中集成SDK,並按照極光的模板填寫申請的不同平臺的key和secret
需要注意的是小米推送的APPID和APPKEY,以MI-開頭,OPPO的APPID、APPKEY和APPSECRET,以OP-開頭
manifestPlaceholders = [ UMENG_APPKEY : "xxxxxxxxx",
JPUSH_PKGNAME : applicationId,
JPUSH_APPKEY : "xxxxxxxxx",
HUAWEI_APPID : "xxxxxxxxx",
XIAOMI_APPID : "MI-xxxxxxxxx",
XIAOMI_APPKEY : "MI-xxxxxxxxx",
VIVO_APPID : "xxxxxxxxx",
VIVO_APPKEY : "xxxxxxxxx",
OPPO_APPID : "OP-xxxxxxxxx",
OPPO_APPKEY : "OP-xxxxxxxxx",
OPPO_APPSECRET : "OP-xxxxxxxxx" ]
- 註冊中轉處理頁面處理通知內容,以供廠商推送的通知點擊後跳轉
廠商推送的通知,在點擊後會自動打開註冊的頁面,如果沒註冊會自動打開應用,不再通過極光通用的Receiver接收
public class PushHelpActivity extends Activity {
/**消息Id**/
private static final String KEY_MSGID = "msg_id";
/**該通知的下發通道**/
private static final String KEY_WHICH_PUSH_SDK = "rom_type";
/**通知標題**/
private static final String KEY_TITLE = "n_title";
/**通知內容**/
private static final String KEY_CONTENT = "n_content";
/**通知附加字段**/
private static final String KEY_EXTRAS = "n_extras";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Logger.i("push onCreate ");
handleOpenClick();
finish();
}
/**
* 處理點擊事件,當前啓動配置的Activity都是使用
* Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
* 方式啓動,只需要在onCreat中調用此方法進行處理
*/
private void handleOpenClick() {
String data = null;
//獲取華爲平臺附帶的jpush信息
if (getIntent().getData() != null) {
data = getIntent().getData().toString();
}
//獲取fcm、oppo平臺附帶的jpush信息
if(TextUtils.isEmpty(data) && getIntent().getExtras() != null){
data = getIntent().getExtras().getString("JMessageExtra");
}
Logger.i("push handleOpenClick ", data);
if (TextUtils.isEmpty(data)) return;
try {
JSONObject jsonObject = new JSONObject(data);
String msgId = jsonObject.optString(KEY_MSGID);
byte whichPushSDK = (byte) jsonObject.optInt(KEY_WHICH_PUSH_SDK);
String title = jsonObject.optString(KEY_TITLE);
String content = jsonObject.optString(KEY_CONTENT);
String extras = jsonObject.optString(KEY_EXTRAS);
Logger.i("push handleOpenClick ", "title : " + title, "content: " + content, "extras: " + extras);
Logger.i("push handleOpenClick ", "whichPushSDK: " + getPushSDKName(whichPushSDK));
//上報點擊事件
JPushInterface.reportNotificationOpened(this, msgId, whichPushSDK);
parseOpenPush(this, extras, null);
} catch (Exception e) {
Logger.e("push handleOpenClick", e);
}
}
private String getPushSDKName(byte whichPushSDK) {
String name;
switch (whichPushSDK){
case 0:
name = "jpush";
break;
case 1:
name = "xiaomi";
break;
case 2:
name = "huawei";
break;
case 3:
name = "meizu";
break;
case 4:
name= "oppo";
break;
case 8:
name = "fcm";
break;
default:
name = "jpush";
}
return name;
}
/**
* 點擊通知欄
*
* @param msg
*/
private void parseOpenPush(Context context, String msg, Bundle bundle) {
long userId = LifesenseApplication.getCurrentUserId();
if (userId == 0) {//無用戶找不到的場景,先過濾
return;
}
if (msg != null) {
try { //處理推送內容並跳轉
JSONObject extrasJSon = new JSONObject(msg);
String viewType = extrasJSon.getString("viewType");
JPushReceiver.clearNotifactionByType(context, viewType);
LogicServices.shareInstance().getJumpActionManage().parseJpushJump(context, viewType, extrasJSon, bundle);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
註冊Intent Filter,以供廠商推送通知跳轉,此intent filter " gz.lifesense.weidong.logic.push.manager.PushHelpActivity "在後續的推送中需要設置,否則使用廠商推送到達的通知點擊後會跳轉異常
<!--huawei、oppo push click process-->
<activity
android:name="gz.lifesense.weidong.logic.push.manager.PushHelpActivity"
android:screenOrientation="portrait"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="gz.lifesense.weidong.logic.push.manager.PushHelpActivity"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
華爲推送需要額外處理,在首頁中通過代理處理
public class PushExtraDelegate {
static PushExtraDelegate delegate = new PushExtraDelegate();
public static PushExtraDelegate getInstance() {
return delegate;
}
private JPluginPlatformInterface mHuaweiPushInterface;
public void init(Activity activity) {
if (activity != null) {
mHuaweiPushInterface = new JPluginPlatformInterface(activity.getApplicationContext());
}
}
public void onStart(Activity activity) {
if (mHuaweiPushInterface != null && activity != null) {
mHuaweiPushInterface.onStart(activity);
}
}
public void onStop(Activity activity) {
if (mHuaweiPushInterface != null && activity != null) {
mHuaweiPushInterface.onStop(activity);
}
}
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
//JPush中調用HMS SDK解決錯誤的接口傳入的requestCode爲10001,開發者調用是請注意不要同樣使用10001
if (mHuaweiPushInterface != null && activity != null && requestCode == JPluginPlatformInterface.JPLUGIN_REQUEST_CODE) {
mHuaweiPushInterface.onActivityResult(activity, requestCode, resultCode, data);
}
}
/**
* 判斷是否支持廠商推送
* 已經接入華爲/小米/oppo/vivo
*
* @return
*/
public static boolean isSupportManufacturerPush() {
String manufacturer = Build.MANUFACTURER;
if (manufacturer != null) {
if (manufacturer.equalsIgnoreCase("XIAOMI")
|| manufacturer.equalsIgnoreCase("HUAWEI")
|| manufacturer.equalsIgnoreCase("OPPO")) {
return true;
}
if (manufacturer.equalsIgnoreCase("VIVO")) {
return PushClient.getInstance(ApplicationHolder.getmApplication()).isSupport();
}
}
return false;
}
}
- 驗證廠商推送功能
使用極光推送,如果APP進程不存在,且被其他APP喚醒不會收到推送,只有等到被其他應用喚醒或者打開APP時收到,則可以利用這個特點驗證。把APP進程殺掉,到極光推送根據tag推送,如收到推送則說明廠商推送已經成功接入
- 另外,廠商推其實是廠商幫助發送通知,點擊推送內容跳轉到APP對應頁面,不再通過極光通用的Receiver接收。這會導致APP不能接收到推送到來的廣播事件,只有等到用戶點擊後才能感知到推送內容,如若用戶移除推送通知,APP甚至不能感知。如果監控推送到達廣播事件,需要點擊時處理或者通過後臺配合分發。