Android廠商推送接入

  • 先到極光推送後臺開通廠商推送功能(此功能需要收費,需要聯繫商務開通)
  • 到各廠商開發者平臺註冊應用,然後對應開啓推送功能,獲取對應的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甚至不能感知。如果監控推送到達廣播事件,需要點擊時處理或者通過後臺配合分發。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章