uni-app + 极光推送完成ios、android端app推送功能。
1、登录极光
选择极光推送,登录以后添加应用跟着官方提示一步一步走就行了,例:
2、uni-app插件市场导入官方JPush、JCore的SDK
极光推送 JPush 官方 SDK
跟着文档走就是了,我这里只是截取了部分。
极光 SDK 基础组件。极光 SDK 使用都需要依赖该组件。这句话谨记,当时我就是没导入这个,一直打自定义基座失败,找了好久的原因(无奈.png)
3、HBuilderx的manifest.json中进行配置
App原生插件配置,选择云端插件
填写你在极光官网填写的那些资料就行了
这里记得按照示例来,开通了哪些厂商就填哪些(android),比如我官网推送设置里面的小米的App ID是123456789,那我填写的时候就应该是MI-123456789
App模块配置Push(消息推送),只需要勾选Push。
4、页面代码
// init
import $store from "@/store/index.js";
// 获取当前是 ios 还是 android
const platform = $store.state.systemInfo?.platform ?? "";
// #ifdef APP-PLUS
// 引入 App 原生语言插件
const jpushModule = uni.requireNativePlugin("JG-JPush");
// 极光推送初始化
export const JPushInit = async () => {
// 初始化推送服务
jpushModule.initJPushService();
// 是否启用日志输出
jpushModule.setLoggerEnable(true);
// 设置别名(到时候可以根据别名进行推送)
jpushModule.setAlias({ alias: "别名", sequence: 1 });
// 监听 是否开启权限 只在首次登录时判断权限 防止索取权限频繁被拒
// const isEnabled = await getNotificationEnabled();
// if ($store.getters.isFirsttLogin && !isEnabled) noticMsgTool();
// 监听极光连接状态
jpushModule.addConnectEventListener(result => {
result.connectEnable && getRegistrationID();
console.log("监听到了连接状态变化 --> ", result.connectEnable ? "已连接" : "未连接");
// 这里可以做业务逻辑
});
// 极光推送的消息通知回调
jpushModule.addNotificationListener(result => {
const BadgeNum = 0; // 角标数量
jpushModule.setBadge(BadgeNum); // 极光设置角标数量
plus.runtime.setBadgeNumber(BadgeNum); // h5+设置角标数量
console.log("收到通知 -->", result);
// 点击事件
if (result.notificationEventType === "notificationOpened") {
uni.navigateTo({ url: "" }); // 点击推送消息跳转页面
}
});
// 检查推送服务是否停止
jpushModule.isPushStopped(({ code }) => {
// code 0已停止推送 1未停止推送
console.log(`${code === 0 ? "已停止推送" : "推送中..."}`);
});
};
// 获取registerID
const getRegistrationID = () => {
jpushModule.getRegistrationID(async result => {
const registrationId = result.registerID;
console.log("🚀 ~ getRegistrationID ~ registrationId:", registrationId);
try {
// 绑定极光 可以在这里对接后端绑定极光
} catch (error) {
console.log("🚀 ~ getRegistrationID ~ error:", error);
}
});
};
//监听 是否开启权限
export const getNotificationEnabled = () => {
return new Promise(resolve => {
if (platform === "ios") {
// 判断ios是否打开权限
jpushModule.requestNotificationAuthorization(result => {
//如果小于2 未打开通知权限
resolve(result.status >= 2);
});
} else {
// 判断android是否打开权限
jpushModule.isNotificationEnabled(result => {
//如果为0则表示 未打开通知权限
resolve(result.code !== 0);
});
}
});
};
// 通知权限设置弹框
export const noticMsgTool = (content = "您还没有开启通知权限,无法接受到消息通知,请前往设置!") => {
uni.showModal({
title: "通知权限提醒",
content,
showCancel: true,
confirmText: "去设置",
cancelText: "稍后设置",
success: res => {
if (!res.confirm) return;
// 苹果打开对应的通知栏
if (platform === "ios") {
let app = plus.ios.invoke("UIApplication", "sharedApplication");
let setting = plus.ios.invoke("NSURL", "URLWithString:", "app-settings:");
plus.ios.invoke(app, "openURL:", setting);
plus.ios.deleteObject(setting);
plus.ios.deleteObject(app);
} else {
// android打开对应的通知栏
const main = plus.android.runtimeMainActivity();
const pkName = main.getPackageName();
const uid = main.getApplicationInfo().plusGetAttribute("uid");
const IntentClass = plus.android.importClass("android.content.Intent");
const Build = plus.android.importClass("android.os.Build");
const intent = new IntentClass("android.settings.APP_NOTIFICATION_SETTINGS");
// android 8.0引导
if (Build.VERSION.SDK_INT >= 26) {
intent.putExtra("android.provider.extra.APP_PACKAGE", pkName);
} else if (Build.VERSION.SDK_INT >= 21) {
// android 5.0-7.0
intent.putExtra("app_package", pkName);
intent.putExtra("app_uid", uid);
} else {
// (<21)其他--跳转到该应用管理的详情页
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
let uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
}
// 跳转到该应用的系统通知设置页
main.startActivity(intent);
}
},
});
};
//#endif
// #ifdef APP-PLUS
import { JPushInit, noticMsgTool, getNotificationEnabled } from "@/components/bind-jpush.js";
//#endif
// #ifdef APP-PLUS
JPushInit()
//#endif
// 通知设置 主动调弹框到手机系统设置栏设置通知权限
async noticeSetting() {
const isEnabled = await getNotificationEnabled();
noticMsgTool(isEnabled ? "当前权限已开启,是否继续前往通知设置" : void 0);
},
大概就这些吧,然后打个自定义基座的包就可以测试了,这个推送有个弊端就是当App在后台时如果被杀进程了,就收不到推送,解决方案的话可以百度看看。