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

【通知权限】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

要回复文章请先登录注册

kakarot99

kakarot99

回复 蔡cai :
可以了,是我打包app时忘记勾选push消息推送模块
2024-02-04 10:11
蔡cai

蔡cai (作者)

回复 蔡cai :
中间那一列
2024-02-02 16:55
蔡cai

蔡cai (作者)

回复 kakarot99 :
还有一个可能,苹果开发者官网进去——>标识符(中间那一栏)——>点击进去有个Communication Notifications看有没有勾选上
2024-02-02 16:54
蔡cai

蔡cai (作者)

回复 kakarot99 :
你去看下文章开头的来源地址,点进去是不是那个截图
2024-02-02 16:49
蔡cai

蔡cai (作者)

回复 kakarot99 :
能否截个图看看嘛,这个做很久了,忘记了
2024-02-02 16:47
kakarot99

kakarot99

ios跳转到设置页面 为啥没有通知这一选项
2024-02-02 15:20
OlyLis

OlyLis

牛牛牛,找了好久
2023-06-28 11:53