react-native-pure-umeng-push

0.3.5 • Public • Published

react-native-pure-umeng-push

友盟推送

Installation

npm i react-native-pure-umeng-push
// 0.60 版本以下手动执行这句
react-native link react-native-pure-umeng-push

Setup

image

打开应用信息页面,安卓推送有 AppkeyUmeng Message Secret 两个字段,iOS 只有 Appkey 字段,后面将用这些字段初始化友盟。

iOS

确保推送证书配置正确。举个例子,如果你的 App 有两个版本:测试版和正式版,Bundle ID 分别是 com.abc.testcom.abc.prod,那么证书必须和 Bundle ID 对应。

打开 Xcode,开启推送。

image

修改 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 *)application
didRegisterForRemoteNotificationsWithDeviceToken:(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}"
}

配置厂商通道请先阅读官方文档,主要是获取各个通道的 appIdappKeyappSecret 等数据,并保存到友盟后台的应用信息里。

MainApplicationonCreate 方法进行初始化,如下:

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.Intent
import android.os.Bundle
import android.os.PersistableBundle
import com.finstao.MainActivity
import com.github.musicode.umengpush.RNTUmengPushModule
import 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
  android:name=".umeng.PushActivity"
  android:launchMode="singleTask"
  android:exported="true"
/>

打开指定页面 填入你刚才创建的 Activity,比如 com.abc.umeng.PushActivity

注意,如果在打包阶段用了别的包名,需改为对应的包名。

解决魅族的兼容问题

drawable 目录下添加一个图标,命名为 stat_sys_third_app_notify.png,建议尺寸 64px * 64px,图标四周留有透明。若不添加此图标,可能在部分魅族手机上无法弹出通知。

Usage

import umengPush, {
  // 新浪微博
  ALIAS_TYPE_SINA,
  // 腾讯微博
  ALIAS_TYPE_TENCENT,
  ALIAS_TYPE_QQ,
  ALIAS_TYPE_WEIXIN,
  ALIAS_TYPE_BAIDU,
  ALIAS_TYPE_RENREN,
  ALIAS_TYPE_KAIXIN,
  ALIAS_TYPE_DOUBAN,
  ALIAS_TYPE_FACEBOOK,
  ALIAS_TYPE_TWITTER,
} from 'react-native-pure-umeng-push'
 
// 注册获取 device token
umengPush.addListener(
  'register',
  function (data) {
    data.deviceToken
    // 如果 app 未启动状态下,点击推送打开 app,会有两个新字段
    // 点击的推送
    data.notification
    // 推送的自定义参数
    // 字符 d、p 为友盟保留字段,不能作为自定义参数的 key,value 只能是字符串类型,
    // 字符总和不能超过 1000 个字符
    data.custom
  }
)
 
// 远程推送
umengPush.addListener(
  'remoteNotification',
  function (data) {
    // 如果点击了推送,data.clicked 是 true
    data.clicked
    // 如果推送送达并展示了,data.presented 是 true
    data.presented
 
    // 推送详情,如标题、内容
    data.notification
    // 推送的自定义参数
    // 字符 d、p 为友盟保留字段,不能作为自定义参数的 key,value 只能是字符串类型,
    // 字符总和不能超过 1000 个字符
    data.custom
  }
)
 
// 透传消息
// 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.addListener(
  'message',
  function (data) {
 
    // ios 用于静默推送实现消息透传
    // 静默推送不会在通知栏展现,这一点很符合透传消息的要求
    // 但是苹果要求静默推送的 aps 对象下不能包含 alert、badge、sound 等字段
    // 如果我们加了 alert,它就会变成通知,会展现在通知栏里
    // 有时候,你会希望加上 alert,类似 aps: { alert: '你有一条新消息', 'content-available': 1 }
    // 这时依然会触发 message 事件回调,只是会带上 remoteNotification 特有的 clicked 或 presented 属性
    // 如果你希望和安卓表现一样,只需要过滤掉 clicked 即可,如下
    if (data.clicked) {
      return
    }
 
    // 这样只有当 app 在前台时,才会响应透传消息
 
    // 自定义参数
    // 字符 d、p 为友盟保留字段,不能作为自定义参数的 key,value 只能是字符串类型,
    // 字符总和不能超过 1000 个字符
    // 即例子中的 { key1: 'value1' }
    data.custom
 
    // alert 或 custom 字段中的字符串值
    data.message
 
  }
)
 
// 启动
umengPush.start()
 
// 下面这些方法的具体用法和注意事项,请参考文档
// https://developer.umeng.com/docs/67966/detail/98583#h1--tag-alias-4
umengPush.getTasg().then(data => {
  // success
  data.tags
})
.catch(err => {
  // failure
})
 
umengPush.addTags(['tag1', 'tag2']).then(data => {
  // success
  data.remain
})
.catch(err => {
  // failure
})
 
umengPush.removeTags(['tag1', 'tag2']).then(data => {
  // success
  data.remain
})
.catch(err => {
  // failure
})
 
 
// type 如果是第三方帐号,使用导入的常量
// 如果是自建帐号体系,可传入自己产品的英文名或拼音
umengPush.setAlias('alias', 'type').then(data => {
  // success
})
.catch(err => {
  // failure
})
 
umengPush.addAlias('alias', 'type').then(data => {
  // success
})
.catch(err => {
  // failure
})
 
umengPush.removeAlias('alias', 'type').then(data => {
  // success
})
.catch(err => {
  // failure
})
 

Readme

Keywords

Package Sidebar

Install

npm i react-native-pure-umeng-push

Weekly Downloads

3

Version

0.3.5

License

MIT

Unpacked Size

2.86 MB

Total Files

29

Last publish

Collaborators

  • musicode