Uniapp对接极光推送

作者:renzp94
时间:2021-07-07 02:14:43

准备工作

极光应用

极光官网注册账号,然后创建一个应用,服务选择消息推送,在产品设置时填写的应用包名需要和开发的 App 包名一致,然后点击下一步就可以了,SDK 不需要下载。


打开应用设置,找到高级设置→推送设置,如果需要精准推送的话,可以在Android选项设置对应厂商的信息,IOS设置需要证书

生成 IOS 推送证书

如果之前在生成IOS描述文件时没有选择Push Notifications(推送服务),则需要开启推送服务

开启推送服务
  • 登录账号,选择Certificates, Identifiers & Profiles
  • 进入之后,在左侧菜单上点击Identifiers,点击进入对应的 App
  • Capabilities栏中找到Push Notifications勾选上,此时右侧会出现Config,点击进入
  • 分别创建开发推送证书正式推送证书,创建时选择.certSigningRequest文件,然后点击Continue即可,最后下载下来
  • 如果之前生成描述文件时没有开启推送服务,则开启之后需要点击编辑,然后点击保存,最后将新的描述文件重新下载下来,替换旧的描述文件

证书生成之后在IOS设置处上传证书保存即可。

安装 Uniapp 极光推送插件

  • 在插件市场搜索极光推送,然后将作者是极光的两个插件:极光JPush官方SDK极光JCore官方SDK购买即可(免费)
  • 然后在HBuilder中双击manifest.json文件,选择App原生插件配置,点击选择云端插件,然后将两个插件选中确定即可

注意:一个账号下的应用包名只能安装一个插件,所以在市场购买插件时指定应用包名需要注意一下,否则会出现添加了插件但运行自定义基座时报找不到插件

配置极光推送

JCore插件配置所需信息

  • JPUSH_APPKEY_ANDROID:(Android)用于统计分发渠道,可填默认值developer-default
  • JPUSH_APPKEY_IOS:(IOS)用于统计分发渠道,可填默认值developer-default
  • JPUSH_APPKEY_IOS:(IOS)极光应用的appkey
  • JPUSH_APPKEY_ANDROID:(Android)极光应用的appkey

使用极光推送

App.vue中注册极光推送

<script>
export default {
    onLaunch() {
        const jv = uni.requireNativePlugin('JG-JPush');
        jv.initJPushService();
        jv.addConnectEventListener((result) => {
            if (result.connectEnable) {
                console.log('连接极光推送成功');
            }
        });
    }
};
</script>

如果没有连接成功,可先尝试设置一下别名,然后再试试设置别名用setAlias({alias:'xx'}}),注意设置别名时别名是字符串

测试消息推送

在极光应用运营平台中选择消息推送→推送管理→创建推送,选择目标平台,这里使用IOS开发环境,输入通知标题和内容,选择目标人群广播所有人,点击发送预览,若出现错误:没有满足条件的推送目标或推送目标超过 255 天不活跃,被排除在推送目标之外则说明没有注册成功,检查一下配置是否有误,或者使用设备别名并在代码中注册别名尝试一下

极光推送方法

initJPushService

初始化服务,使用极光推送前需要使用此方法初始化服务,一般在应用启动时注册:App.vue中的onLaunch

const jv = uni.requireNativePlugin('JG-JPush');
jv.initJPushService();

addConnectEventListener

监听连接状态,返回结果中的connectEnabletrue则说明连接成功

const jv = uni.requireNativePlugin('JG-JPush');
jv.addConnectEventListener((result) => {
    if (result.connectEnable) {
        console.log('连接极光推送成功');
    }
});

setAlias

注册设备别名,接受一个对象

  • alias:别名,注意:别名只能是字符串
  • sequence:序列,可不填
const jv = uni.requireNativePlugin('JG-JPush');
jv.setAlias({ alias: 'testAlias' });

queryAlias

查询别名,可接受一个对象

  • sequence:序列,可不填
const jv = uni.requireNativePlugin('JG-JPush');
jv.queryAlias();

deleteAlias

删除别名,可接受一个对象

  • sequence:序列,可不填
const jv = uni.requireNativePlugin('JG-JPush');
jv.deleteAlias();

addTags

添加设备标签,接受一个对象

  • tags:设备标签数组
  • sequence:序列,可不填
const jv = uni.requireNativePlugin('JG-JPush');
jv.addTags({ tags: tags });

queryTag

验证设备标签,可接受一个对象

  • sequence:序列,可不填
const jv = uni.requireNativePlugin('JG-JPush');
jv.queryTag();

getAllTags

查询所有标签

const jv = uni.requireNativePlugin('JG-JPush');
jv.getAllTags();

updateTags

覆盖设备标签,接受参数同addTags

const jv = uni.requireNativePlugin('JG-JPush');
jv.updateTags({ tags: tags });

deleteTags

删除设备标签,接受参数同addTags

const jv = uni.requireNativePlugin('JG-JPush');
jv.deleteTags({ tags: tags });

cleanTags

清空设备标签,可接受一个对象

  • sequence:序列,可不填
const jv = uni.requireNativePlugin('JG-JPush')
jv.cleanTags)

setBadge

设置角标,即应用图标左上角数量,注意这个只是设置极光推送服务的角标,一般应用会根据推送中的badge自动设置应用角标,如果需要手动设置应用的角标需要使用plus.runtime.setBadgeNumber(badge),如果需要清空角标可使用plus.runtime.setBadgeNumber(0)来清空,0 表示清空

const jv = uni.requireNativePlugin('JG-JPush');
jv.setBadge(1);
plus.runtime.setBadgeNumber(1);

setMobileNumber

设置电话号码

const jv = uni.requireNativePlugin('JG-JPush');
jv.setMobileNumber({ mobileNumber: 13011112222 });

locationServicesEnabled

获取位置是否可用

const jv = uni.requireNativePlugin('JG-JPush');
jv.locationServicesEnabled();

getLocationAuthorizationStatus

获取位置权限

const jv = uni.requireNativePlugin('JG-JPush');
jv.getLocationAuthorizationStatus();

requestLocationAuthorization

向用于申请定位权限

const jv = uni.requireNativePlugin('JG-JPush');
jv.requestLocationAuthorization();

setLocationEanable

设置位置是否可用

const jv = uni.requireNativePlugin('JG-JPush');
jv.setLocationEanable(true);

setLocation

设置位置

const jv = uni.requireNativePlugin('JG-JPush');
jv.setLocation({ latitude: 23.23, longitude: 23.23 });

setLoggerEnable

设置日志是否打开

const jv = uni.requireNativePlugin('JG-JPush');
jv.setLoggerEnable(true);

isNotificationEnabled(Android)/requestNotificationAuthorization(Ios)

是否有消息通知权限

const jv = uni.requireNativePlugin('JG-JPush');
jv.isNotificationEnabled(({ code }) => {
    if (code === 0) {
        console.log('您还没有打开通知权限');
    }
});
jv.requestNotificationAuthorization(({ status }) => {
    if (status < 2) {
        console.log('您还没有打开通知权限');
    }
});

openSettingsForNotification

跳转当前应用消息通知设置界面

const jv = uni.requireNativePlugin('JG-JPush');
jv.openSettingsForNotification();

getRegistrationID

获取注册 ID,需要连接成功之后获取,否则程序会崩溃

const jv = uni.requireNativePlugin('JG-JPush');
jv.getRegistrationID(({ registerID }) => {
    console.log(registerID);
});

setMaxGeofenceNumber

设置位置围栏的最大半径,位置围栏是只在某一范围内可推送

addGeofenceListener

监听位置围栏触发

const jv = uni.requireNativePlugin('JG-JPush');
jv.addGeofenceListener((result) => {
    console.log(result);
});

deleteGeofence

删除位置围栏

addLocalNotification

创建本地消息通知

const jv = uni.requireNativePlugin('JG-JPush');
jv.addLocalNotification({
    messageID: '123',
    title: 'title',
    content: 'content',
    extras: {
        name: 'Cindy',
        age: '16'
    }
});

removeLocalNotification

删除本地消息通知

const jv = uni.requireNativePlugin('JG-JPush');
jv.removeLocalNotification({ messageID: '123' });

clearLocalNotifications

清空本地消息通知

const jv = uni.requireNativePlugin('JG-JPush');
jv.clearLocalNotifications();

addNotificationListener

监听消息事件,接受一个回调函数,回调函数的参数是推送的消息内容

{
    "extras": {},
    "content": "测试内容",
    "badge": "1",
    "messageID": 2252028010729666,
    "notificationEventType": "notificationOpened",
    "title": "测试标题",
    "ring": "default",
    "iOS": {
        "_j_business": 1,
        "_j_data_": "{\"data_msgtype\":1,\"push_type\":4,\"is_vip\":0}",
        "_j_uid": 53619607272,
        "_j_msgid": 2252028010729666,
        "aps": {
            "mutable-content": 1,
            "alert": {
                "title": "测试标题",
                "body": "测试内容"
            },
            "badge": 1,
            "sound": "default"
        }
    }
}

其中,badge是发送消息量,可以用于设置应用角标,notificationEventType为触发类型,值为notificationArrived表示新消息,值为notificationOpened表示打开某个消息,注意:一般需要手动调用jv.setBadge(0)来清空badge,否则下次消息推送badge是累加


IOS上杀死APP,可以收到消息通知,但无法触发addNotificationListener,所以如果APP内需要展示消息量需要在进入APP时获取应用角标,此时可以使用plus.ios.import("UIApplication").sharedApplication().applicationIconBadgeNumber()来获取,在Android上杀死APP将无法收到推送,所以不用考虑此情况

removeAllEventListeners

addEventListener

setIsAllowedInMessagePop

addLocalNotificationListener

addInMessageListener

initVoipService

addCustomMessageListener

addMobileNumberListener

pullInMessage

addVoipPushIncomingListener