react-native-pure-umeng-push
友盟推送
Installation
npm i react-native-pure-umeng-push
// 0.60 版本以下手动执行这句
react-native link react-native-pure-umeng-push
Setup
打开应用信息页面,安卓推送有 Appkey
和 Umeng Message Secret
两个字段,iOS 只有 Appkey
字段,后面将用这些字段初始化友盟。
iOS
确保推送证书配置正确。举个例子,如果你的 App 有两个版本:测试版和正式版,Bundle ID
分别是 com.abc.test
和 com.abc.prod
,那么证书必须和 Bundle ID
对应。
打开 Xcode,开启推送。
修改 AppDelegate.m
,如下
#import <RNTUmengPush.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ ... // 初始化友盟基础库 // channel 一般填 App Store,如果有测试环境,可按需填写 // debug 表示是否打印调试信息 [RNTUmengPush init:@"appKey" channel:@"App Store" debug:false]; // 初始化友盟推送 [RNTUmengPush push:launchOptions]; return YES;} - (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [RNTUmengPush didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];} - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { [RNTUmengPush didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];}
Android
修改 android/build.gradle
,如下:
buildscript {
ext {
// 确保添加了这两个版本号
// 以后如果友盟有升级,直接改这里
umengPushVersion = "6.1.0"
umengAgooAccsVersion = "3.3.8.8-open-fix2"
}
}
allprojects {
repositories {
// 确保添加了友盟仓库
maven { url 'https://dl.bintray.com/umsdk/release' }
}
}
android/app/build.gradle
根据不同的包填写不同的配置,如下:
android {
buildTypes {
debug {
manifestPlaceholders = [
UMENG_APP_KEY: '',
UMENG_PUSH_SECRET: '',
UMENG_CHANNEL: '',
HUAWEI_PUSH_APP_ID: '',
XIAOMI_PUSH_APP_ID: '',
XIAOMI_PUSH_APP_KEY: '',
OPPO_PUSH_APP_KEY: '',
OPPO_PUSH_APP_SECRET: '',
VIVO_PUSH_APP_ID: '',
VIVO_PUSH_APP_KEY: '',
MEIZU_PUSH_APP_ID: '',
MEIZU_PUSH_APP_KEY: '',
]
}
release {
manifestPlaceholders = [
UMENG_APP_KEY: '',
UMENG_PUSH_SECRET: '',
UMENG_CHANNEL: '',
HUAWEI_PUSH_APP_ID: '',
XIAOMI_PUSH_APP_ID: '',
XIAOMI_PUSH_APP_KEY: '',
OPPO_PUSH_APP_KEY: '',
OPPO_PUSH_APP_SECRET: '',
VIVO_PUSH_APP_ID: '',
VIVO_PUSH_APP_KEY: '',
MEIZU_PUSH_APP_ID: '',
MEIZU_PUSH_APP_KEY: '',
]
}
}
}
dependencies {
implementation "com.umeng.umsdk:push:${rootProject.ext.umengPushVersion}"
implementation "com.umeng.umsdk:agoo-accs:${rootProject.ext.umengAgooAccsVersion}"
}
配置厂商通道请先阅读官方文档,主要是获取各个通道的 appId
、appKey
、appSecret
等数据,并保存到友盟后台的应用信息里。
在 MainApplication
的 onCreate
方法进行初始化,如下:
override fun onCreate() { val metaData = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA).metaData // 初始化友盟基础库 // 第三个参数表示是否显示调试信息 RNTUmengPushModule.init(this, metaData, false) // 初始化友盟推送 // 第二个参数填 AndroidManifest.xml 中 package 的值 // 第三个参数表示 app 在前台时是否展现通知 RNTUmengPushModule.push(this, "com.abc", true) // 初始化厂商通道,按需调用 RNTUmengPushModule.huawei(this, metaData) RNTUmengPushModule.xiaomi(this, metaData) RNTUmengPushModule.oppo(this, metaData) RNTUmengPushModule.vivo(this, metaData) RNTUmengPushModule.meizu(this, metaData)}
配置混淆规则
在 android/app/proguard-rules.pro
添加以下混淆规则,注意替换自己的包名,并且删掉 [
和 ]
。
-keep public class [您的应用包名].R$*{
public static final int *;
}
创建华为、小米、魅族厂商通道使用的 Activity
在你的包(比如 com.abc
)下,新建一个 umeng
包,并创建一个 PushActivity
,如下:
package com.abc.umeng import android.content.Intentimport android.os.Bundleimport android.os.PersistableBundleimport com.finstao.MainActivityimport com.github.musicode.umengpush.RNTUmengPushModuleimport com.umeng.message.UmengNotifyClickActivity class PushActivity : UmengNotifyClickActivity() { override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) // 这里配置一个页面,比如使用你自己的闪屏页 setContentView(R.layout.splash_screen) } override fun onMessage(intent: Intent?) { super.onMessage(intent) RNTUmengPushModule.handleMessage(this, MainActivity::class.java, intent) } }
修改 AndroidManifest.xml
,在 MainActivity
下方新增一个 activity
,如下:
打开指定页面
填入你刚才创建的 Activity,比如 com.abc.umeng.PushActivity
。
注意,如果在打包阶段用了别的包名,需改为对应的包名。
解决魅族的兼容问题
在 drawable
目录下添加一个图标,命名为 stat_sys_third_app_notify.png
,建议尺寸 64px * 64px
,图标四周留有透明。若不添加此图标,可能在部分魅族手机上无法弹出通知。
Usage
// 注册获取 device tokenumengPush // 远程推送umengPush // 透传消息// ios 通过静默推送实现,例子:payload: { aps: { 'content-available': 1 }, key1: 'value1' }// android 通过自定义消息实现,例子:payload: { display_type: 'message', body: { custom: '' }, extra: { key1: 'value1' } }//// 注意:ios aps 下面不能包含 alert、badge、sound 等字段,如果包含了其中任何一个,就会变成通知,即会显示在通知栏。// 你也可以加上 alert,比如 aps: { alert: '你有一条新消息', 'content-available': 1 },这样还是会走进 message 事件回调里,只是展现为通知形式umengPush // 启动umengPushstart // 下面这些方法的具体用法和注意事项,请参考文档// https://developer.umeng.com/docs/67966/detail/98583#h1--tag-alias-4umengPush umengPush umengPush // type 如果是第三方帐号,使用导入的常量// 如果是自建帐号体系,可传入自己产品的英文名或拼音umengPush umengPush umengPush