友盟推送
一、文档地址:
https://developer.umeng.com/docs/67966/detail/206987
二、快速集成:
-
在根目录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中添加
-
若需移除关联启动能力,在AndroidManifest.xml中添加
三、 基础接口接入 -
在自定义Application类的onCreate()中初始化SDK
-
public class PushHelper {
public static final String TAG = “TAG”;
/**- 预初始化,已添加子进程中初始化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);
}
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对应信息
UMConfigure.init(context, PushConstants.APP_KEY, “Umeng”,
UMConfigure.DEVICE_TYPE_PHONE, PushConstants.MESSAGE_SECRET);//获取消息推送实例 PushAgent pushAgent = PushAgent.getInstance(context); //注册推送服务,每次调用register方法都会回调该接口 pushAgent.register(new UPushRegisterCallback() { @Override public void onSuccess(String deviceToken) { //注册成功会返回deviceToken deviceToken是推送消息的唯一标志 Log.e(TAG, "注册成功:deviceToken:--> " + deviceToken); } @Override public void onFailure(String errCode, String errDesc) { Log.e(TAG, "注册失败:--> " + "code:" + errCode + ", desc:" + errDesc); } });
}
}
注意:主进程和子进程(:channel)均需要调用推送注册接口,否则退到后台会有收不到消息的问题。
3. 在UMConfigure.init方法后调用注册接口,注册成功后可获取deviceToken
public class PushHelper {
public static final String TAG = “TAG”;
public static final String APP_KEY = “”;
public static final String APP_SCREEN = “”;
/**
* 预初始化,已添加子进程中初始化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);
}
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对应信息
UMConfigure.init(context, PushConstants.
APP_KEY, “Umeng”,
UMConfigure.DEVICE_TYPE_PHONE, APP_SCREEN);
//获取消息推送实例
PushAgent pushAgent = PushAgent.getInstance(context);
//注册推送服务,每次调用register方法都会回调该接口
pushAgent.register(new UPushRegisterCallback() {
@Override
public void onSuccess(String deviceToken) {
//注册成功会返回deviceToken deviceToken是推送消息的唯一标志
Log.e(TAG, "注册成功:deviceToken:--> " + deviceToken);
}
@Override
public void onFailure(String errCode, String errDesc) {
Log.e(TAG, "注册失败:--> " + "code:" + errCode + ", desc:" + errDesc);
}
});
}
}
注意:获取deviceToken的值后,才可以进行消息推送测试
4. 应用活跃统计
在App的SplashActivity或MainActivity中onCreate()方法添加
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (hasAgreedAgreement()) {
/**
* 警告
* 该方法是推送平台多维度推送决策必调用的方法,请务必调用
* 需在用户同意隐私政策协议之后调用,否则会出现合规问题
*/
PushAgent.getInstance(this).onAppStart();
}
setContentView(R.layout.activity_main);
handleAgreement();
}
private boolean hasAgreedAgreement() {
return MyPreferences.getInstance(this).hasAgreePrivacyAgreement();
}
private void handleAgreement() {
if (!hasAgreedAgreement()) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.agreement_title);
builder.setMessage(R.string.agreement_msg);
builder.setPositiveButton(R.string.agreement_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//用户点击隐私协议同意按钮后,初始化PushSDK
MyPreferences.getInstance(getApplicationContext()).setAgreePrivacyAgreement(true);
PushHelper.init(getApplicationContext());
}
});
builder.setNegativeButton(R.string.agreement_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
});
builder.create().show();
}
}
}
工具类代码
public class PushConstants {
/**
* 应用申请的Appkey
*/
public static final String APP_KEY = “”;
/**
* 应用申请的UmengMessageSecret
*/
public static final String MESSAGE_SECRET = "";
/**
* 渠道名称,修改为您App的发布渠道名称
*/
public static final String CHANNEL = "Umeng";
}
public class MyPreferences {
private static final String NAME = "app_settings";
private static final String KEY_PRIVACY_AGREEMENT = "privacy_agreement";
private static volatile MyPreferences instance;
private final SharedPreferences preferences;
private MyPreferences(Context context) {
preferences = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
}
public static MyPreferences getInstance(Context context) {
if (instance == null) {
synchronized (MyPreferences.class) {
if (instance == null) {
instance = new MyPreferences(context);
}
}
}
return instance;
}
/**
* 设置隐私协议是否同意
*
* @param value 是否同意
*/
public void setAgreePrivacyAgreement(boolean value) {
preferences.edit().putBoolean(KEY_PRIVACY_AGREEMENT, value).apply();
}
/**
* 是否同意了隐私协议
*
* @return true 已经同意;false 还没有同意
*/
public boolean hasAgreePrivacyAgreement() {
return preferences.getBoolean(KEY_PRIVACY_AGREEMENT, false);
}
}
四、 代码混淆
-dontwarn com.umeng.**
-dontwarn com.taobao.**
-dontwarn anet.channel.**
-dontwarn anetwork.channel.**
-dontwarn org.android.**
-dontwarn org.apache.thrift.**
-dontwarn com.xiaomi.**
-dontwarn com.huawei.**
-dontwarn com.meizu.**
-keepattributes Annotation
-keep class com.taobao.** {;}
-keep class org.android.** {;}
-keep class anet.channel.** {;}
-keep class com.umeng.** {;}
-keep class com.xiaomi.** {;}
-keep class com.huawei.** {;}
-keep class com.meizu.** {;}
-keep class org.apache.thrift.** {;}
-keep class com.alibaba.sdk.android.** {;}
-keep class com.ut.** {;}
-keep class com.ta.** {*;}
-keep public class *.R$ {
public static final int *;
}
五、 更多样式设置
https://developer.umeng.com/docs/67966/detail/98583
六、 DEMO地址
https://download.youkuaiyun.com/download/tong_csdn/26246669