天天看點

友盟推送 紅米手機收不到推送的問題

在內建友盟推送時,需要內建各大廠商通道來提升推送的到達率,在內建小米廠商通道時,文檔有段代碼為:

MiPushRegistar.register(final Context context, final String XIAOMI_ID, final String XIAOMI_KEY);

而這段代碼現在最新的版本卻存在一個問題,點選方法進去會看到一段代碼:

public static boolean checkDevice(Context context) {
        boolean result = false;

        try {
            PackageManager manager = context.getPackageManager();
            PackageInfo pkgInfo = null;
            if (TextUtils.equals(XIAOMI, phoneBrand.toLowerCase())) {
                pkgInfo = manager.getPackageInfo("com.xiaomi.xmsf", 4);
                if (pkgInfo != null && pkgInfo.versionCode >= 105) {
                    result = true;
                }
            }
        } catch (Throwable var4) {
            ALog.e("MiPushRegistar", "checkDevice", var4, new Object[0]);
        }

        ALog.d("MiPushRegistar", "checkDevice", new Object[]{"result", result});
        return result;
    }
           

這段代碼僅僅隻是判斷了Build.BRAND為"Xiaomi",而部分紅米手機Build.BRAND為"Redmi",是以導緻了內建小米廠商推送沒有成功,在APP離線的情況下會接收不到相關通知。

是以修複問題需要加上Redmi的判斷,解決方案就是複制原代碼再加上相關判斷,建立類名:MiFixPushRegister,把內建僞代碼修改如下:

MiFixPushRegister.register(final Context context, final String XIAOMI_ID, final String XIAOMI_KEY);

修改後的MiFixPushRegister類的相關完整代碼如下:

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.text.TextUtils;

import androidx.annotation.NonNull;

import com.taobao.accs.utl.ALog;
import com.taobao.accs.utl.UtilityImpl;
import com.taobao.agoo.BaseNotifyClickActivity;
import com.xiaomi.mipush.sdk.MiPushClient;
import com.xiaomi.mipush.sdk.MiPushMessage;

public class MiFixPushRegister {
    private static final String PACKAGE_XIAOMI = "com.xiaomi.xmsf";
    private static final String XIAOMI = "Xiaomi".toLowerCase();
    private static final String REDMI = "Redmi".toLowerCase();
    private static String phoneBrand;

    static {
        phoneBrand = Build.BRAND;
    }

    public static boolean checkDevice(Context context) {
        boolean result = false;

        try {
            PackageManager manager = context.getPackageManager();
            if (TextUtils.equals(XIAOMI, phoneBrand.toLowerCase()) ||
                    TextUtils.equals(REDMI, phoneBrand.toLowerCase())) {
                PackageInfo pkgInfo = manager.getPackageInfo(PACKAGE_XIAOMI, PackageManager.GET_SERVICES);
                if (pkgInfo != null && pkgInfo.versionCode >= 105) {
                    result = true;
                }
            }
        } catch (Throwable var4) {
            ALog.e("MiPushRegistar", "checkDevice", var4, new Object[0]);
        }

        ALog.d("MiPushRegistar", "checkDevice", new Object[]{"result", result});
        return result;
    }

    public static void register(Context context, String xiaomiId, String xiaomiKey) {
        try {
            if (!UtilityImpl.isMainProcess(context)) {
                ALog.e("MiPushRegistar", "register not in main process, return", new Object[0]);
                return;
            }

            if (checkDevice(context)) {
                ALog.i("MiPushRegistar", "register begin", new Object[0]);
                BaseNotifyClickActivity.addNotifyListener(new MiFixPushRegister.XiaoMiNotifyListener());
                MiPushClient.registerPush(context, xiaomiId, xiaomiKey);
            }
        } catch (Throwable var4) {
            ALog.e("MiPushRegistar", "register", var4, new Object[0]);
        }

    }

    public static void unregister(Context context) {
        try {
            MiPushClient.unregisterPush(context);
        } catch (Throwable var2) {
            ALog.e("MiPushRegistar", "unregister", var2, new Object[0]);
        }

    }

    private static class XiaoMiNotifyListener implements BaseNotifyClickActivity.INotifyListener {
        private XiaoMiNotifyListener() {
        }

        public String parseMsgFromIntent(Intent intent) {
            String msg = null;

            try {
                MiPushMessage miPushMessage = (MiPushMessage) intent.getSerializableExtra("key_message");
                if (miPushMessage != null)
                    msg = miPushMessage.getContent();
            } catch (Exception var4) {
                var4.printStackTrace();
            }

            ALog.i("MiPushRegistar", "parseMsgFromIntent", new Object[]{"msg", msg});
            return msg;
        }

        public String getMsgSource() {
            return "xiaomi";
        }

        @NonNull
        public String toString() {
            return "INotifyListener: " + this.getMsgSource();
        }
    }
}
           

繼續閱讀