蔡cai
蔡cai
  • 发布:2022-12-02 10:27
  • 更新:2025-05-08 09:26
  • 阅读:2705

【通知权限】app判断通知权限是否开启,前往系统设置页面开关通知权限

分类:uni-app

来源:https://ext.dcloud.net.cn/plugin?id=789

// 判断通知权限是否开启  
function isOn() {  
    // #ifdef APP-PLUS  
    if (plus.os.name == "Android") {  
        var main = plus.android.runtimeMainActivity();  
        var NotificationManagerCompat = plus.android.importClass("android.support.v4.app.NotificationManagerCompat");  
        if (NotificationManagerCompat == null) {  
            NotificationManagerCompat = plus.android.importClass("androidx.core.app.NotificationManagerCompat");  
        }  
        var areNotificationsEnabled = NotificationManagerCompat.from(main).areNotificationsEnabled();  
        return areNotificationsEnabled;  
    } else if (plus.os.name == "iOS") {  
        var isIosOn = 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);  
        isIosOn = 0 != types;  
        return isIosOn;  
    }  
    // #endif  
}  

// 前往系统设置页面开启或关闭通知权限  
function switchPushPermissions() {  
    // #ifdef APP-PLUS  
    let title = isOn() ? "通知权限关闭提醒" : "通知权限开启提醒";  
    let content = isOn()  
        ? "通知权限已开启,是否前往设置关闭?"  
        : "您还没有开启通知权限,无法接受到消息通知,是否前往设置?";  
    // 打开安卓系统设置页面  
    let openAndroidSetting = () => {  
        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);  
    };  
    // 打开苹果系统设置页面  
    let openIOSSetting = () => {  
        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);  
        // ios18跳转不过去的解决方案  
        // 方案一:使用uni.openAppAuthorizeSetting(),文档地址:https://uniapp.dcloud.net.cn/api/system/openappauthorizesetting.html  
        // 方案二:待验证;来源评论区:iOS 18以后,openURL:完全被弃用,需要用openURL:options:completionHandler:替代。  
        // var app = plus.ios.invoke("UIApplication", "sharedApplication");  
        // var url;  
        // // 获取安全 URL(iOS 8+)  
        // if (plus.ios.invoke("UIApplication", "respondsToSelector:", "openSettingsURLString")) {  
        //  var urlString = plus.ios.invoke("UIApplication", "openSettingsURLString");  
        //  url = plus.ios.invoke("NSURL", "URLWithString:", urlString);  
        // } else {  
        //  url = plus.ios.invoke("NSURL", "URLWithString:", "app-settings:");  
        // }  
        // // 判断新 API 可用性(iOS 10+)  
        // var supportsNewAPI = plus.ios.invoke(app, "respondsToSelector:", "openURL:options:completionHandler:");  
        // if (supportsNewAPI) {  
        //  var options = plus.ios.newObject("NSDictionary");  
        //  var completion = plus.ios.newBlock(function(success) {  
        //      console.log("跳转结果:" + success);  
        //      if (!success) {  
        //          plus.nativeUI.toast("无法打开设置,请手动前往");  
        //      }  
        //  }, "v@:B");  
        //  plus.ios.invoke(app, "openURL:options:completionHandler:", url, options, completion);  
        //  plus.ios.deleteObject(completion);  
        // } else {  
        //  if (plus.ios.invoke(app, "canOpenURL:", url)) {  
        //      plus.ios.invoke(app, "openURL:", url);  
        //  } else {  
        //      throw new Error("当前系统不支持跳转设置");  
        //  }  
        // }  
        // plus.ios.deleteObject(url);  
        // plus.ios.deleteObject(app);  
    };  
    // 弹窗提醒开通或关闭权限,点击确认后,跳转到系统设置页面进行设置  
    uni.showModal({  
        title: title,  
        content: content,  
        showCancel: true,  
        confirmColor: "#ff903f",  
        success: (res) => {  
            if (res.confirm) {  
                if (plus.os.name == "Android") {  
                    openAndroidSetting();  
                } else if (plus.os.name == "iOS") {  
                    openIOSSetting();  
                }  
            }  
        },  
    });  
    // #endif  
}  

export default {  
    isOn,  
    switchPushPermissions,  
};

↓↓↓ 各位大佬点点赞

3 关注 分享
OlyLis 1***@qq.com z***@163.com

要回复文章请先登录注册

旧时光

旧时光

回复 蔡cai :
谢谢,用openURL:options:completionHandler:替代可以了
2025-05-08 09:26
蔡cai

蔡cai (作者)

回复 旧时光 :
试下能不能用,我没系统那么高的手机测试
2025-05-08 09:09
蔡cai

蔡cai (作者)

回复 旧时光 :
``` javascript
var app = plus.ios.invoke('UIApplication', 'sharedApplication');
var url;

// 获取安全 URL(iOS 8+)
if (plus.ios.invoke('UIApplication', 'respondsToSelector:', 'openSettingsURLString')) {
var urlString = plus.ios.invoke('UIApplication', 'openSettingsURLString');
url = plus.ios.invoke('NSURL', 'URLWithString:', urlString);
} else {
url = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
}

// 判断新 API 可用性(iOS 10+)
var supportsNewAPI = plus.ios.invoke(app, 'respondsToSelector:', 'openURL:options:completionHandler:');

if (supportsNewAPI) {
var options = plus.ios.newObject('NSDictionary');
var completion = plus.ios.newBlock(function(success) {
console.log("跳转结果:" + success);
if (!success) {
plus.nativeUI.toast("无法打开设置,请手动前往");
}
}, 'v@:B');

plus.ios.invoke(app, 'openURL:options:completionHandler:', url, options, completion);
plus.ios.deleteObject(completion);
} else {
if (plus.ios.invoke(app, 'canOpenURL:', url)) {
plus.ios.invoke(app, 'openURL:', url);
} else {
throw new Error("当前系统不支持跳转设置");
}
}

plus.ios.deleteObject(url);
plus.ios.deleteObject(app);
```
2025-05-08 09:08
旧时光

旧时光

回复 1***@163.com :
大佬,我也遇到openURL打不开ios设置页面的问题,你能不能贴一下完整的代码,谢谢
2025-05-07 17:51
1***@163.com

1***@163.com

回复 1***@qq.com :
iOS 18以后,openURL:完全被弃用,需要用openURL:options:completionHandler:替代。
2025-05-07 09:39
1***@qq.com

1***@qq.com

回复 1***@163.com :
大佬,我现在也遇到这个问题了,想问下你这边解决了吗
2025-05-04 17:09
蔡cai

蔡cai (作者)

回复 1***@163.com :
文档地址:https://uniapp.dcloud.net.cn/api/system/openappauthorizesetting.html
2025-03-03 17:53
蔡cai

蔡cai (作者)

回复 1***@163.com :
换成uni.openAppAuthorizeSetting()这个api试下
2025-03-03 17:53
1***@163.com

1***@163.com

iOS18以上的版本好像不行 打不开设置
2025-03-03 17:42
蔡cai

蔡cai (作者)

回复 kakarot99 :
好的
2024-02-04 10:42