#SDK 相关

#1 添加推送 SDK 及相关配置

#1.1 添加 Maven 库地址

在以项目名为命名的顶层 build.gradle 文件中,添加 google 服务依赖和 maven 库地址,如下所示:

buildscript {
    ......

    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        classpath 'com.google.gms:google-services:4.2.0'
    }
}

allprojects {
    repositories {
        maven{ url 'https://mvn.shalltry.com/repository/maven-public'}
        ......
    }
}

#1.2 配置依赖

在 app/build.gradle 文件中引用推送 SDK 依赖库,如下图所示:

apply plugin: 'com.google.gms.google-services'
    defaultConfig {
        ......
        manifestPlaceholders = [
                "tpush_appid" : "xxxxxx",
                "tpush_appkey": "xxxxxx"
        ]
    }
......
dependencies {
   ......
   api("com.transsion.tpush:core:1.1.2.xx")   点击查看最新版本
   api 'com.google.firebase:firebase-messaging:18.0.0'
}
apply plugin: 'com.google.gms.google-services'

:tpush_appid 和 tpush_appkey 在推送后台应用详情中查看

#2 编写集成代码

#2.1 初始化 SDK

在应用的 Application 初始化 SDK,如下所示

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        PushManager.getInstance().init(getApplicationContext());
        ......
    }
}

#2.2 通知样式

当前推送通知支持:系统默认通知和自定义通知样式。
默认通知样式支持:标题,内容,及展开文字和展开图片
自定义通知样式支持:图标,标题,内容,按钮图标,及展开文字和展开图片

如下图区域 5,可以为文字或者图片

自定义通知初始化

PushManager.getInstance().addCustomNotification(new PushNotification.Builder()
      .setType(PushConstants.NOTIFICATION_DEFAULT_TYPE) // 设置通知样式类型
     .setSmallIcon(R.drawable.test_notification_small_icon) // 设置通知图标,必填
     .setShowDefaultLargeIcon(true) // 设置显示应用图标大图(默认不显示)
     .build());
     
// 可加入多个
PushManager.getInstance().addCustomNotification(new PushNotification.Builder()
     .setStyleId(2) // 设置布局样式Id
     .setChannelId("ch2")
     .setType(PushConstants.NOTIFICATION_CUSTOM_TYPE) // 设置通知样式类型
     .setSmallIcon(R.drawable.test_notification_small_icon) // 设置通知图标,必填
     .setLayoutId(R.layout.custom_style_3) // 设置自定义样式通知布局
     .setIconId(R.id.notification_icon) // 设置自定义通知icon
     .setTitleId(R.id.notification_title) // 设置自定义通知标题
     .setContentId(R.id.notification_content) // 设置自定义通知内容
     .setBtnId(R.id.notification_btn) // 设置自定义通知按钮内容
     .setContentBigId(R.id.notification_content_ex)
     .setImgBigId(R.id.notification_img_ex)
     .build());

参考样式:custom_style_3.xml
:自定义布局中只能使用 RemoteViews 所支持的 View。
setStyleId 表示接入应用设置的样式 Id,在推送后台发送消息时,可填写对应的 Id,可使用自定义的布局
setChannelId 表示设置渠道 Id
addCustomNotification 表示添加自定义通知,可添加多个

通知图标
该图标将会作为通知图标展示在通知栏顶部,如下所示

通知图标的建议尺寸如下:

dpi图标尺寸
ldpi18*18
mdpi24*24
hdpi36*36
xhdpi48*48
xxhdpi72*72
xxxhdpi96*96

#2.3 数据透传及初始化完成

数据透传:可在推送平台自定义数据格式,在 App 中以广播回调的形式接收数据。
广播在 Application 中注册,如下:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // push初始化
        PushManager.getInstance().init(getApplicationContext());
        // 透传注册
        BroadcastReceiver broadcastReceiver = new PushBroadcastReceiver();
        PushManager.getInstance().registerReceiver(getApplicationContext(), broadcastReceiver);
    }
}

PushBroadcastReceiver继承至 IPushBroadcastReceiver,具体实现如下

public class PushBroadcastReceiver extends IPushBroadcastReceiver {
    @Override
    public void onMessageReceive(Context context, long messageId, String transData) {
        Log.d("PUSH_", context.getPackageName() + " receive a transmit message, " + transData);
        // 显示埋点(在适合的地方添加)
        // PushManager.getInstance().trackShow(messageId);
        // 点击埋点(在适合的地方添加)
        // PushManager.getInstance().trackClick(messageId);
        // 通知转换(在适合的地方添加)
        // PushManager.getInstance().trackConversion(messageId);
    }

    @Override
    public void onSdkInitSuccess(Context context, String clientId, String token) {
        Log.d("PUSH_", context.getPackageName() + " init complete clientId:" + clientId + ", token:" + token);
    }
}

:在回调中调用了 trackShowtrackClick 这个两个方法,用于推送展示和点击的埋点统计,调用之后可以查看透传数据的展示数/展示率和点击数/点击率。
onSdkInitSuccess 为初始化完成回调
onMessageReceive 为透传消息回调

#PushManager.getInstance().trackShow(messageId);

为通知显示埋点接口,即:当发送的一条推送为透传消息并且是用来显示通知的,在调用NotificationManager的notify方法后,调用这个接口,如下示例:

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
......
notificationManager.notify(id, notification);
PushManager.getInstance().trackShow(messageId);
#PushManager.getInstance().trackClick(messageId);

为通知点击埋点接口,即:当发送的一条推送为透传消息并且是用来显示通知的,在用户点击通知后调用这个接口,如下示例:

Notification.Builder builder;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            builder = new Notification.Builder(context, channelId);
        } else {
            builder = new Notification.Builder(context);
        }
        builder.setAutoCancel(true)
                .setContentIntent(pendingIntent)

pendingIntent为用户点击通知后的动作,包括组件broadcast,activity或者service,需要在启动这些组件的时候调用点击埋点接口。

#2.4 clientId 和 Token 获取

从 1.1.2.xx 之后对外提供 clientId 和 Token 的获取接口,如下:

PushManager.getInstance().getClientId(new IClientIdListener() {
    @Override
    public void onFail(String msg) {
        Log.d("PUSH_", "getClientId fail:" + msg);
    }

    @Override
    public void onSuccess(String clientId) {
        Log.d("PUSH_", "getClientId success:" + clientId);
    }
});

String token = PushManager.getInstance().getToken(context);

#2.5 主题订阅

订阅 subscribeToTopic
注:订阅需要初始化完成之后调用,如在 onSdkInitSuccess(4.3 数据透传及初始化完成)函数中调用,或者在 clientID(clientID 获取方式在 4.4clientID 和 token 获取)不为空的时候调用

  // topic为订阅的主题,String类型
 PushManager.getInstance().subscribeToTopic(topic, new ITopicListener() {
    @Override
    public void onFail(String msg) {
        Log.d("PUSH_", "订阅失败:" + msg);
    }

    @Override
    public void onSuccess() {
        Log.d("PUSH_", "订阅成功");
    }
});

取消订阅 unsubscribeFromTopic

  // topic为取消订阅的主题,String类型
PushManager.getInstance().unsubscribeFromTopic(topic, new ITopicListener() {
    @Override
    public void onFail(String msg) {
        Log.d("PUSH_", "取消订阅失败:" + msg);
    }

    @Override
    public void onSuccess() {
        Log.d("PUSH_", "取消订阅成功");
    }
});

#2.6 设置测试 AppId 和 AppKey

当前推送平台支持测试模式,测试应用与正式发布的应用包名可以一样,但是AppId和AppKey不一样,具体调用方法如下:

// 判断是否为测试模式
if (isTestMode) {
    PushManager.getInstance().setAppInfo(appId, appKey);
}

#2.7 配置修改

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        CoreUtil.init(getApplicationContext());
        PushManager.getInstance().setPushConfig(
                new PushConfig.Builder()
                        .setCheckInterval(60 * 60) // 设置检查jobService间隔,单位为秒
                        .setUploadInterval(2 * 60 * 60)// 设置wifi上报间隔,单位为秒
                        .setMobileUploadInterval(6 * 60 * 60)// 设置移动网络上报间隔,单位为秒
                        .setCloseJobService(true)// 关闭jobService上报功能
                        .setGroupId("group1") // 设置通知Group
                        .setMaxNotificationCount(4) // 设置通知最多显示个数
                        .build());
       // push初始化
        PushManager.getInstance().init(getApplicationContext());
        // 透传注册
        BroadcastReceiver broadcastReceiver = new PushBroadcastReceiver();
        PushManager.getInstance().registerReceiver(getApplicationContext(), broadcastReceiver);
    }
}

setMaxNotificationCount 表示通知最多显示个数,超过这个值,会将最早接收到的推送通知删除。
setGroupId 设置通知 Group,设置了这个会将接收到的通知平铺

#2.8 通知开关

SDK 中提供检查通知开关和显示打开通知开关页面的对话框,简单使用如下:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkNotificationSwitch();
    }

    private void checkNotificationSwitch() {
        // 检查通知是否打开
        if (!NotificationAssistUtils.isOpenNotification(this)) {
            // 显示用户提示对话框
        }
    }
}

应用可选择适合的场景调用。