uniapp:查询APP是否开启通知权限

该段代码主要在`app.vue`中检查应用在iOS和Android平台上的通知权限。当权限未开启时,会显示模态框提示用户开启。iOS部分使用`UIApplication`来获取和设置通知,而Android部分则利用`NotificationManagerCompat`来检查通知状态,并相应地引导用户前往设置页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

app.vue

<script>
	export default {
		onLaunch: async function() {
			// #ifdef APP-PLUS
			this.getQuanxian();// 查询是否开启通知
			// #endif
		},
		onShow: function() {},
		onHide: function() {},
		methods:{
			getQuanxian() {
				let platform = uni.getSystemInfoSync().platform; //首先判断app是安卓还是ios
				console.log(platform);
				if (platform == "ios") { //这里是ios的方法
					console.log("我是iOS");
					var UIApplication = plus.ios.import("UIApplication");
					var app = UIApplication.sharedApplication();
					var enabledTypes = 0;
					if (app.currentUserNotificationSettings) {
						var settings = app.currentUserNotificationSettings();
						enabledTypes = settings.plusGetAttribute("types");
						console.log("enabledTypes1:" + enabledTypes);
						if (enabledTypes == 0) { //如果enabledTypes = 0 就是通知权限没有开启
							uni.showModal({
								title: '提示',
								content: '请打开通知权限',
								success: res => {
									if (res.confirm) {
										this.openTongZhi()
									} else if (res.cancel) {
										console.log('用户点击取消');
									}
								}
							});
						} else {
							// uni.showToast({
							// 	title: "通知权限已开启",
							// 	icon: "none"
							// })
						}
					}
					plus.ios.deleteObject(settings);
				} else if (platform == "android") { //下面是安卓的方法
					// console.log("我是安卓", plus.android);
					var main = plus.android.runtimeMainActivity();
					var pkName = main.getPackageName();
					var uid = main.getApplicationInfo().plusGetAttribute("uid");
					var NotificationManagerCompat = plus.android.importClass(
						"android.support.v4.app.NotificationManagerCompat"
					);
					//android.support.v4升级为androidx
					if (NotificationManagerCompat == null) {
						NotificationManagerCompat = plus.android.importClass(
							"androidx.core.app.NotificationManagerCompat"
						);
					}
					var areNotificationsEnabled =
						NotificationManagerCompat.from(main).areNotificationsEnabled();
					// console.log(areNotificationsEnabled);
					// 未开通‘允许通知’权限,则弹窗提醒开通,并点击确认后,跳转到系统设置页面进行设置
					if (!areNotificationsEnabled) {
						this.tongzhi = true; //这里也一样未开启权限,弹出弹窗
					}
					if (areNotificationsEnabled) {
						// uni.showToast({
						// 	title: "通知权限已开启",
						// 	icon: "none"
						// })
					} else {
						uni.showModal({
							title: '提示',
							content: '是否前往打开通知权限',
							success: res => {
								if (res.confirm) {
									this.openTongZhi()
								} else if (res.cancel) {
									console.log('用户点击取消');
								}
							}
						});
					}
				}
			},
			openTongZhi() { //弹窗按钮绑定方法
				let platform = uni.getSystemInfoSync().platform; //获取安卓还是ios
				if (platform == "ios") { //如果机型是ios,ios由于权限问题,可能需要手动开启
					var UIApplication = plus.ios.import("UIApplication");
					var app = UIApplication.sharedApplication();
					var settings = app.currentUserNotificationSettings();
					enabledTypes = settings.plusGetAttribute("types");
					var NSURL2 = plus.ios.import("NSURL");
					var setting2 = NSURL2.URLWithString("app-settings:");
					var application2 = UIApplication.sharedApplication();
					application2.openURL(setting2);
					plus.ios.deleteObject(setting2);
					plus.ios.deleteObject(NSURL2);
					plus.ios.deleteObject(application2);
					plus.ios.deleteObject(settings);
				} else if (platform == "android") { //如果机型是安卓
					var main = plus.android.runtimeMainActivity();
					var pkName = main.getPackageName();
					var uid = main.getApplicationInfo().plusGetAttribute("uid");
					var Intent = plus.android.importClass("android.content.Intent");
					var Build = plus.android.importClass("android.os.Build");
					//android 8.0引导
					if (Build.VERSION.SDK_INT >= 26) { //判断安卓系统版本
						var intent = new Intent("android.settings.APP_NOTIFICATION_SETTINGS");
						intent.putExtra("android.provider.extra.APP_PACKAGE", pkName);
					} else if (Build.VERSION.SDK_INT >= 21) { //判断安卓系统版本
						//android 5.0-7.0
						var intent = new Intent("android.settings.APP_NOTIFICATION_SETTINGS");
						intent.putExtra("app_package", pkName);
						intent.putExtra("app_uid", uid);
					} else {
						//(<21)其他--跳转到该应用管理的详情页
						intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
						var uri = Uri.fromParts(
							"package",
							mainActivity.getPackageName(),
							null
						);
						intent.setData(uri);
					}
					// 跳转到该应用的系统通知设置页
					main.startActivity(intent);
				}
			},
		}
	}
</script>
### 如何在 UniApp 中实现申请通知权限UniApp 开发过程中,为了向用户提供推送服务或其他基于通知的功能,开发者通常需要请求用户的设备通知权限。以下是关于如何在 UniApp 中实现这一功能的具体方法。 #### 请求通知权限的核心逻辑 UniApp 提供了一种跨平台的方式处理通知权限的请求。对于 Android 和 iOS 平台,虽然底层机制不同,但在 UniApp 的封装下可以统一调用接口来完成操作[^1]。具体来说: - **Android 平台** 在 Android 上,可以通过 `plus.push` 对象的相关 API 来管理消息推送以及通知权限的状态。如果应用尚未获得通知权限,则需引导用户手动前往设置页面授予该权限- **iOS 平台** 针对 iOS 设备的通知权限控制更加严格,因此需要借助 `uni-app-plus` 插件中的 `uniPush` 方法或者直接利用 Apple Push Notification Service (APNs)[^2] 进行配置。当首次启动应用程序时会弹窗询问是否允许接收通知;此时即完成了基本授权流程。 #### 示例代码展示 下面分别给出适用于两个主流操作系统上的简单示例代码片段用于演示如何正确地发起一次针对本地或远程通知的服务许可请求过程。 ##### 安卓端示例 ```javascript if(plus.os.name === 'Android'){ var main = plus.android.runtimeMainActivity(); try{ // 调用系统API打开应用详情页让使用者调整开关状态 var intent = new plus.android.Intent('android.settings.APPLICATION_DETAILS_SETTINGS'); var uri = plus.android.Uri.parse("package:" + main.getPackageName()); intent.setData(uri); main.startActivity(intent); }catch(e){ console.error("Error occurred while trying to open settings:", e.message); } } ``` ##### 苹果IOS端示例 首先确保已按照官方文档指引完成证书绑定等工作之后,在合适时机执行如下命令触发提示框显示给最终消费者决定接受与否: ```javascript // 假设已经引入必要的库文件并初始化完毕环境变量等准备工作完成后... push.registerDeviceToken((result)=>{ if(result.code===0){ alert(`注册成功, token=${result.token}`); }else{ alert(`失败原因:${JSON.stringify(result)}`) } }); ``` 上述两部分脚本展示了根据不同移动作业系统的特性定制化解决方案以满足实际需求场景下的灵活运用能力。 --- ### 注意事项 需要注意的是,由于各版本间可能存在差异性表现或者是未来更新迭代带来的改变因素影响等原因造成某些特定条件下无法正常运作的情况发生,请务必参照最新版 SDK 文档说明做适当修改适配工作后再投入使用生产环境中去验证效果最佳实践方案!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值