0,前言

这几天接了一下友盟,小米,华为三方的推送。
总的流程下来,小米的api是最友好的,华为的文档和demo有点脱节。这两个推送在特定的手机上都挺稳定的的。
友盟的就有点麻烦,过程中遇到几个问题

1,接入友盟之后,APK方法数超过64K了

对于这种超大的第三方库无爱 : (
是这样解决的。

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}
MultiDex.install(getTargetContext());

https://developer.android.com/studio/build/multidex.html

2,第二个问题是要自定义点击通知栏要调整到特定页面,需要重写

@Override
public void dealWithNotificationMessage(Context context, UMessage msg){
    if ( msg.extra == null) {
        super.dealWithNotificationMessage(context, msg);
        return;
    }
    Notification notification = new Notification.Builder(context)
            .setContentTitle(msg.title)
            .setContentText(msg.text)
            .setSmallIcon(R.drawable.share_default_logo)
            .build();
    notification.flags |= FLAG_AUTO_CANCEL;
    notification.defaults = DEFAULT_ALL;
    notification.ledARGB = Color.BLUE;
    notification.ledOnMS = 5000;
    ((NotificationManager) SeeYouApp.getInstance().getSystemService(NOTIFICATION_SERVICE)
    ).notify(0, notification);
}

3,要识别一下友盟的channel进程,允许它注册。

4,测试

测试起来很麻烦,因为杀应用,如果我们原有的进程没有被杀,那么友盟的推送就不会被杀,我们的进程被杀,友盟也被杀。这叫我怎么测…后来同事提醒,可以相互唤醒。
所以就是安装一个友盟的官方的App,然后设置允许相互唤醒(这个各个手机的设置都不同,在设置里面找相互唤醒类似的字眼)

后台那边就是判断一下原有通道是不是通的,如果不通就走第三方渠道。
之前一直在测弱网络,所以我以为会有一个心跳的误差。其实杀APP,后台立刻就能知道长连接断了,因为socket断了,系统会发eof(从抓包上看就是FIN)。

5,其他有的没的

华为只支持企业级应用,所以我是用公司账号注册两个app,去测试的。华为客户端这边的识别就直接是包名,要有手机卡,手机必须是华为手机才能推到。
小米接入小米推送之后,手动杀进程居然只杀了前台应用,得去应用里面强制关闭。没接入之前我记得手动杀进程是什么都不剩的,也许是官方推送保活福利吧。