友盟推送学习

一、首次使用U_Push

1、首先注册友盟账号,进入工作台,选择产品U_Push。

2、创建应用

 

 

3、在自己的项目中自动集成SDK

开发环境要求:

  • Android Studio 3.0以上

  • Android minSdkVersion: 14

  • Cradle: 4.4以上

在根目录build.gradle中添加maven仓库地址

maven { url 'https://repo1.maven.org/maven2/' }

在app/build.gradle中添加库依赖

dependencies {
    //友盟基础库依赖(必须)
    api 'com.umeng.umsdk:common:9.4.2'
    api 'com.umeng.umsdk:asms:1.4.1'
    //友盟Push依赖
    api 'com.umeng.umsdk:push:6.4.0'
}

若需移除自启动能力,在AndroidManifest.xml中添加

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" 
    tools:node="remove" />

若需移除关联启动能力,在AndroidManifest.xml中添加

<service
    android:name="com.taobao.accs.ChannelService"
    android:exported="false"
    tools:replace="android:exported" />
<service
    android:name="com.taobao.accs.data.MsgDistributeService"
    android:exported="false"
    tools:replace="android:exported" />
<receiver
    android:name="com.taobao.accs.EventReceiver"
    android:exported="false"
    tools:replace="android:exported" />
<receiver
    android:name="com.taobao.accs.ServiceReceiver"
    android:exported="false"
    tools:replace="android:exported" />
<service
    android:name="org.android.agoo.accs.AgooService"
    android:exported="false"
    tools:replace="android:exported" />
<service
    android:name="com.umeng.message.UmengIntentService"
    android:exported="false"
    tools:replace="android:exported" />
<service
    android:name="com.umeng.message.XiaomiIntentService"
    android:exported="false"
    tools:replace="android:exported" />
<receiver
    android:name="com.taobao.agoo.AgooCommondReceiver"
    android:exported="false"
    tools:replace="android:exported" />
<service
    android:name="com.umeng.message.UmengMessageIntentReceiverService"
    android:exported="false"
    tools:replace="android:exported" />

4、接口接入

在自定义Application类的onCreate()中初始化SDK

package com.umeng.message.demo;

import android.app.Application;

import com.umeng.commonsdk.UMConfigure;
import com.umeng.message.demo.helper.PushHelper;

/**
 * 应用程序类
 */
public class MyApplication extends Application {

    /**
     * onCreate()中初始化SDK
     */
    @Override
    public void onCreate() {
        super.onCreate();
        //日志开关
        UMConfigure.setLogEnabled(true);
        //预初始化
        PushHelper.preInit(this);
        //初始化
        initPushSDK();
    }

    /**
     * 初始化推送SDK
     */
    private void initPushSDK() {
        /*
         * 若用户已同意隐私政策,直接初始化;
         * 若用户未同意隐私政策,待用户同意后,再通过PushHelper.init(...)方法初始化。
         */
        boolean agreed = MyPreferences.getInstance(this).hasAgreePrivacyAgreement();
        if (agreed) {
            //建议在线程中执行初始化
            new Thread(new Runnable() {
                @Override
                public void run() {
                    PushHelper.init(getApplicationContext());
                }
            }).start();
        }
    }
}
 
 

在UMConfigure.init方法后调用注册接口,注册成功后可获取device Token

public class PushHelper {

    private static final String TAG = PushHelper.class.getSimpleName();

    /**
     * 预初始化,已添加子进程中初始化sdk。
     * 使用场景:用户未同意隐私政策协议授权时,延迟初始化
     *
     * @param context 应用上下文
     */
    public static void preInit(Context context) {
        try {
            //解决推送消息显示乱码的问题
            AccsClientConfig.Builder builder = new AccsClientConfig.Builder();
            builder.setAppKey("umeng:" + PushConstants.APP_KEY);
            builder.setAppSecret(PushConstants.MESSAGE_SECRET);
            builder.setTag(AccsClientConfig.DEFAULT_CONFIGTAG);
            ACCSClient.init(context, builder.build());
            TaobaoRegister.setAccsConfigTag(context, AccsClientConfig.DEFAULT_CONFIGTAG);
        } catch (Exception e) {
            e.printStackTrace();
        }
        UMConfigure.preInit(context, PushConstants.APP_KEY, PushConstants.CHANNEL);
    }

    /**
     * 初始化。
     * 场景:用户已同意隐私政策协议授权时
     *
     * @param context 应用上下文
     */
    public static void init(Context context) {
        // 在此处调用基础组件包提供的初始化函数 相应信息可在应用管理 -> 应用信息 中找到 http://message.umeng.com/list/apps
        // 参数一:当前上下文context;
        // 参数二:应用申请的Appkey;
        // 参数三:渠道名称;
        // 参数四:设备类型,必须参数,传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机;传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子;默认为手机;
        // 参数五:Push推送业务的secret 填充Umeng Message Secret对应信息

        //.init方法后调用注册接口,注册成功后可获取deviceToken
        UMConfigure.init(context, PushConstants.APP_KEY, PushConstants.CHANNEL,
                UMConfigure.DEVICE_TYPE_PHONE, PushConstants.MESSAGE_SECRET);

        //获取消息推送实例
        final PushAgent pushAgent = PushAgent.getInstance(context);

        //推送消息拦截处理
        pushAdvancedFunction(context);

        //注册推送服务,每次调用register方法都会回调该接口
        pushAgent.register(new UPushRegisterCallback() {

            @Override
            public void onSuccess(String deviceToken) {
                //注册成功会返回deviceToken deviceToken是推送消息的唯一标志
                Log.i(TAG, "注册成功,deviceToken --> " + deviceToken);
            }

            @Override
            public void onFailure(String errCode, String errDesc) {
                Log.e(TAG, "register failure:--> " + "code:" + errCode + ",desc:" + errDesc);
            }
        });
        registerDeviceChannel(context);
    }
    
    //这里可以注册不同的厂商的设备的推送通道
    private static void registerDeviceChannel(Context context) {}
    
    //同时可以进行一些推送的高级功能,具体看这个方法,以及UmengMessageHandler(推送消息处理)、UmengNotificationClickHandler(推送消息点击处理)
    private static void pushAdvancedFunction(Context context) {}

应用活跃统计,在App的SplashActivity或MainActivity中onCreate()方法添加:

if (hasAgreementAgreed) {
    PushAgent.getInstance(this).onAppStart();
}

PushConstants类中定义了常量,上述的Appkey、Umeng Message Secret、App Master Secret等、以及如果要实现后台推送的各个后台app对应的id

class PushConstants {
    /**
     * 应用申请的Appkey
     */
    public static final String APP_KEY = "应用申请的Appkey";
    /**
     * 应用申请的UmengMessageSecret
     */
    public static final String MESSAGE_SECRET = "应用申请的UmengMessageSecret";
}

app/build.gradle中替换您的应用id

android {
    defaultConfig {
        applicationId "您的应用id"
    }
}

AndroidManifest.xml中package值若和build.gradle中applicationId不一致,需调用设置资源包名方法

PushAgent.getInstance(context).setResourcePackageName(...);

以上都完成后,可以进行代码的执行,在执行成功在log信息中有打印出来的"注册成功,deviceToken --> " + deviceToken,获取到这个设备对应的Token,可以进行消息的测试推送。

5、测试推送

使用刚刚创建的应用,创建推送,点击测试模式,添加测试设备,点击测试消息、新建测试任务,

消息编辑-目标人群选择 deviceToken用户-其他可以默认。

 

二、具体了解

三、在线推送

对官方的demo做测试:

(一)、华为 可以

首先设置华为手机可以打印日志信息,具体操作大致一样(可能不同版本的手机的后台设置不一样):

在打开拨号界面输入:##2846579## 输入完成后会自动进入测试菜单界面,然后Project Menu → 后台设置 → 后台调试关闭 →USB端口设置改为Google模式 → AP LOG设置打开。

在控制台就可以输出token。

(二)、小米 可以

(三)、魅族 可以

(四)、vivo 可以

(五)、OPPO 可以

四、离线推送

厂商推送指的是手机硬件厂商提供的系统级别的推送服务,在网络畅通和推送合法的情况,通过手机厂商通道推送消息给该型号的手机,无论应用是否存活,都保证消息推送到位。厂商推送账号必须注册为企业认证账号

需要法务申请

存在的问题:

app离线推送走的是厂商通道,在线推送走的是友盟的通道。

如果使用的是离线厂商推送,后续的动作是打开应用,app离线的时候点击消息就会跳转到指定的界面,但是这个界面是勾选的厂商推送填写的跳转的指定界面,而不是行为动作跳转的指定界面。所以就会出现问题是 如果此时其实app是在线的,也是会跳转到填写的指定界面,而不是行为动作跳转指定界面。

猜你喜欢

转载自blog.csdn.net/qq_45204129/article/details/120512204