IOS
1.友盟后台新建推送应用
1.新建应用需要提交push的证书,故无证书先配置ios含推送的证书(若原来已有证书,却没有推送,可在原先基础上直接修改,证书cer无需更换,只需配置pp描述文件,让其包含推送功能,重新下载对应的新的pp文件,重新点击载入即可),同时需要项目的capabilities中加入Push notifications 以及background modes(选中remote notification)
2.集成sdk
1.以creat group的方式引入你需要的功能的sdk(ios端和与js通信的bridge端, 不用管下图的manager,manager中的是为了ios向rn层通信传参回调的一些方法)
2.push功能集成(获取deviceToken等)
完成参照友盟ios集成文档(https://developer.umeng.com/docs/67966/detail/66734
),appdelegate.m中加入相关代码
3.若友盟后台消息发送失败,一般是证书配置不对(开发模式对应开发证书,生产模式对应生产证书)
Android(参照https://developer.umeng.com/docs/66632/detail/67587
)
1.下载相关jar包。放入项目安卓目录新创建的lib下
2.下载对应的桥接文件注意修改路径,放到对应的目录中
3. 修改Application,DplusReactPackage
4.未知类,方法等引入可以使用option + enter
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
Log.d("启动应用","启动");
UMConfigure.setLogEnabled(true);
//初始化组件化基础库, 统计SDK/推送SDK/分享SDK都必须调用此初始化接口
// pro
String appChannel = "Umeng";
// String appServer = getJsonString("env.json",this);
// if (appServer.contains("env") && !appServer.toLowerCase().contains("pro")) {
// appChannel = "AppTest";
// // isEnable: false-关闭错误统计功能;true-打开错误统计功能(默认打开)
//
// MobclickAgent.setCatchUncaughtExceptions(false);
// }
// UMConfigure.init(this, "5cdd2e4e0cafb227fd00042e", "Umeng", UMConfigure.DEVICE_TYPE_PHONE,
// "");
UMConfigure.init(this, "", appChannel, UMConfigure.DEVICE_TYPE_PHONE,
"");
//获取消息推送代理示例
PushAgent mPushAgent = PushAgent.getInstance(this);
//注册推送服务,每次调用register方法都会回调该接口
mPushAgent.register(new IUmengRegisterCallback() {
@Override
public void onSuccess(String deviceToken) {
//注册成功会返回deviceToken deviceToken是推送消息的唯一标志
deviceId = deviceToken;
Log.i(TAG,"注册成功:deviceToken:--------> " + deviceToken);
}
@Override
public void onFailure(String s, String s1) {
Log.e(TAG,"注册失败:--------> " + "s:" + s + ",s1:" + s1);
}
});
//sdk开启通知声音
mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);
// sdk关闭通知声音
//mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SDK_DISABLE);
// 通知声音由服务端控制
//mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SERVER);
//mPushAgent.setNotificationPlayLights(MsgConstant.NOTIFICATION_PLAY_SDK_DISABLE);
//mPushAgent.setNotificationPlayVibrate(MsgConstant.NOTIFICATION_PLAY_SDK_DISABLE);
UmengMessageHandler messageHandler = new UmengMessageHandler() {
/**
* 自定义消息的回调方法
*/
@Override
public void dealWithCustomMessage(final Context context, final UMessage msg) {
Log.d(TAG,"dealWithCustomMessage");
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// 对自定义消息的处理方式,点击或者忽略
boolean isClickOrDismissed = true;
if (isClickOrDismissed) {
//自定义消息的点击统计
UTrack.getInstance(getApplicationContext()).trackMsgClick(msg);
} else {
//自定义消息的忽略统计
UTrack.getInstance(getApplicationContext()).trackMsgDismissed(msg);
}
Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
}
});
}
/**
* 自定义通知栏样式的回调方法
*/
@Override
public Notification getNotification(Context context, UMessage msg) {
Log.d("handleMessage----111", String.valueOf(msg.builder_id));
Log.d("handleMessage----111", msg.activity);
Log.d("handleMessage----111", msg.custom);
switch (msg.builder_id) {
case 1:
Notification.Builder builder = new Notification.Builder(context);
RemoteViews myNotificationView = new RemoteViews(context.getPackageName(), R.layout.upush_notification);
myNotificationView.setTextViewText(R.id.notification_title, msg.title);
myNotificationView.setTextViewText(R.id.notification_text, msg.text);
myNotificationView.setImageViewBitmap(R.id.notification_large_icon1, getLargeIcon(context, msg));
myNotificationView.setImageViewResource(R.id.notification_large_icon2, getSmallIconId(context, msg));
builder.setContent(myNotificationView)
.setSmallIcon(getSmallIconId(context, msg))
.setTicker(msg.ticker)
.setAutoCancel(true);
// return builder.build();
return super.getNotification(context, msg);
default:
//默认为0,若填写的builder_id并不存在,也使用默认。
return super.getNotification(context, msg);
}
}
@Override
public void handleMessage(Context context, UMessage uMessage) {
//如果app在前台的话,则不展示通知栏
// if(!isForeground(application)){
// super.handleMessage(context, uMessage);
// }
Log.d("handleMessage----",uMessage.display_type);
Log.d("handleMessage----",uMessage.title);
// recerveMessage(uMessage);
super.handleMessage(context, uMessage);
}
};
Log.d("setMessageHandler","启动");
mPushAgent.setMessageHandler(messageHandler);
/**
* 自定义行为的回调处理,参考文档:高级功能-通知的展示及提醒-自定义通知打开动作
* UmengNotificationClickHandler是在BroadcastReceiver中被调用,故
* 如果需启动Activity,需添加Intent.FLAG_ACTIVITY_NEW_TASK
* */
UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
@Override
public void dealWithCustomAction(Context context, UMessage msg) {
Log.d("dealWithCustomAction---", msg.display_type);
launchApp(MainApplication.this, msg);
recerveMessage(msg);
// Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
}
};
//使用自定义的NotificationHandler,来结合友盟统计处理消息通知,参考http://bbs.umeng.com/thread-11112-1-1.html
//CustomNotificationHandler notificationClickHandler = new CustomNotificationHandler();
mPushAgent.setNotificationClickHandler(notificationClickHandler);
}
/**
* 处理点击通知栏后的动作行为
*/
public void recerveMessage(UMessage uMessage){
Log.d("handleMessage----",uMessage.display_type);
Log.d("handleMessage----",uMessage.title);
WritableMap writableMap = Arguments.createMap();
writableMap.putString("jumpType", uMessage.extra.get("jumpType"));
writableMap.putString("jumpContent", uMessage.extra.get("jumpContent"));
ReactContext currentReactContext = getReactNativeHost().getReactInstanceManager().getCurrentReactContext();
if (currentReactContext != null) {
currentReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("clickNotification", writableMap );
Log.d("handleMessage----",uMessage.extra.get("jumpType"));
}
}
4.初始化
5.修改Activity,初始化
6.app/build.gradle 添加依赖
//PushSDK必须依赖基础组件库,所以需要加入对应依赖
// implementation 'com.umeng.umsdk:common:1.5.4'
//PushSDK必须依赖utdid库,所以需要加入对应依赖
implementation 'com.umeng.umsdk:utdid:1.1.5.3'
//PushSDK
implementation 'com.umeng.umsdk:push:6.0.1'
7.android/build.gradle中 maven依赖
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
buildToolsVersion = "28.0.3"
minSdkVersion = 16
compileSdkVersion = 28
targetSdkVersion = 28
supportLibVersion = "28.0.0"
}
repositories {
google()
jcenter()
mavenCentral()
maven { url 'https://dl.bintray.com/umsdk/release' }
}
dependencies {
classpath("com.android.tools.build:gradle:3.3.1")
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
mavenLocal()
google()
jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
maven { url 'https://dl.bintray.com/umsdk/release' }
}
}