在內建友盟推送時,需要內建各大廠商通道來提升推送的到達率,在內建小米廠商通道時,文檔有段代碼為:
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();
}
}
}