uni.getpushpermission在android上总返回granted,因其底层调用过时推送接口,仅反映通道注册状态而非真实通知授权;android 13起须用uni.authorize({scope: 'scope.notification'})动态申请。

uni.getPushPermission在Android上为什么总返回granted
因为Android 12及以下系统不支持POST_NOTIFICATIONS权限的运行时检查,uni.getPushPermission底层调用的是过时的推送服务状态接口,与实际通知开关无关。它只反映“是否注册了推送通道”,不是用户是否授权弹窗。Android 13(API 33)起必须用uni.authorize({scope: 'scope.notification'})动态申请,且该调用会真实触发系统弹窗。
常见错误现象:
- 在Android 12模拟器或旧机型上调用
uni.getPushPermission,state始终是"granted",但uni.showNotification静默失败 - 未区分SDK版本就统一走
getPushPermission判断,导致Android端UI误判为“已授权”
实操建议:
- 先用
uni.getSystemInfoSync().SDKVersion判断是否≥"33" - 是则必须调用
uni.authorize({scope: 'scope.notification'}),并在fail中捕获拒绝行为 - 否则(Android 12及以下)只能默认“技术上可发”,但需配合后续发送测试验证——比如发一条空通知,监听
uni.onPushMessage是否触发
如何跳转到App的通知设置页(iOS/Android真机有效)
uni.openSetting在App端完全无效,iOS和Android都必须走原生桥接。路径和参数稍有不慎就会跳转失败或打开空白页。
关键细节:
- iOS:必须用
plus.ios.invoke调用openURL:,传入"app-settings:"(注意末尾冒号),不能用settings://或prefs:// - Android:目标Intent Action是
"android.settings.APPLICATION_DETAILS_SETTINGS",data Uri格式必须为"package:你的appid",其中appid要与manifest.json中packagename严格一致(大小写敏感) - 跳转前建议执行
plus.runtime.restart(),尤其热更新后,避免因环境未刷新导致原生API不可用
示例片段(Android部分):
const packageName = plus.android.currentApplication().getPackageName();
const Intent = plus.android.importClass('android.content.Intent');
const Settings = plus.android.importClass('android.provider.Settings');
const intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(android.net.Uri.parse('package:' + packageName));
plus.android.startActivity(intent);
用laoqianjunzi-permiss插件统一处理三端权限
这个UTS插件真正解决了跨平台权限逻辑碎片化的问题,但它不是“开箱即用”,有几个隐藏约束必须提前确认。
ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键
适用前提:
- 仅支持uni-app(Vue2/Vue3)和uni-app x,不兼容H5或小程序
- 鸿蒙支持依赖@kit.AbilityKit,需确保项目已启用鸿蒙模块(
uni-app x项目默认开启) -
checkPermissions对iOS某些权限(如健康、运动、本地网络)返回cannotCheckByAPI: true,意味着不能靠API判断,只能引导用户去设置页+功能试探
典型调用方式:
import { checkPermissions, requestPermissions } from '@/uni_modules/laoqianjunzi-permiss';
// 检查通知权限
const result = await checkPermissions([{ name: 'notification' }]);
if (!result.allGranted) {
// 触发申请
const reqRes = await requestPermissions([{ name: 'notification', title: '开启通知', content: '接收重要消息提醒' }]);
}
注意:name字段必须是插件预设值(如'notification'、'location'),不能直接填'scope.notification'或原生权限字符串。
权限申请前必须同步告知用途(过审刚需)
华为、小米等应用商店审核明确要求:每次申请危险权限前,必须弹出自定义弹窗说明用途,否则直接拒审。这个弹窗不能是系统级的,必须由前端控制文案和时机。
实操要点:
- 不能等
uni.authorize失败后再弹——此时用户已看到系统拒绝弹窗,再弹自定义说明就晚了 - 必须在调用
uni.authorize前,主动show一个uni.showToast或自定义modal,文案需具体(例如:“需要访问位置信息,以便为您推荐附近门店”) - Android上若用户点“不再询问”,
requestPermissions会直接进入fail且err.errMsg含"auth deny",此时应立即调用openSystemPermissionPage并提示“请手动开启”
最易被忽略的一点:iOS的NSLocationWhenInUseUsageDescription等描述字段,必须在manifest.json的ios节点下完整配置,且文案要与前端弹窗一致,否则App Store审核会认为“前后不一致”。










