uniapp打开手机通知权限设置


/**
 * 设置手机通知权限
 */
function setPermissions() {
	// #ifdef APP-PLUS  
	if (plus.os.name == 'Android') { // 判断是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();
		// 未开通‘允许通知’权限,则弹窗提醒开通,并点击确认后,跳转到系统设置页面进行设置  
		if (!areNotificationsEnabled) {
			uni.showModal({
				title: '通知权限开启提醒',
				content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
				showCancel: false,
				confirmText: '去设置',
				success: function(res) {
					if (res.confirm) {
						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);
					}
				}
			});
		}
	} else if (plus.os.name == 'iOS') { // 判断是ISO
		var isOn = undefined;
		var types = 0;
		var app = plus.ios.invoke('UIApplication', 'sharedApplication');
		var settings = plus.ios.invoke(app, 'currentUserNotificationSettings');
		if (settings) {
			types = settings.plusGetAttribute('types');
			plus.ios.deleteObject(settings);
		} else {
			types = plus.ios.invoke(app, 'enabledRemoteNotificationTypes');
		}
		plus.ios.deleteObject(app);
		isOn = (0 != types);
		if (isOn == false) {
			uni.showModal({
				title: '通知权限开启提醒',
				content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
				showCancel: false,
				confirmText: '去设置',
				success: function(res) {
					if (res.confirm) {
						var app = plus.ios.invoke('UIApplication', 'sharedApplication');
						var setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
						plus.ios.invoke(app, 'openURL:', setting);
						plus.ios.deleteObject(setting);
						plus.ios.deleteObject(app);
					}
				}
			});
		}
	}
	// #endif  
}


版权声明:本文为优快云博主「D_lunar」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/D_lunar/article/details/115694296

### 如何在 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 文档说明做适当修改适配工作后再投入使用生产环境中去验证效果最佳实践方案!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值