You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SwiftUI中如何检测Push Notification系统弹窗的按钮点击事件

检测推送通知权限弹窗用户选择的实现方案

系统级的推送权限弹窗运行在独立于App的进程中,苹果未开放捕获弹窗按钮点击事件的相关接口,你可以直接通过通知权限申请的官方回调获取用户的选择结果,SwiftUI项目的实现逻辑和UIKit完全一致:

实现步骤

1. 导入依赖框架

首先在需要调用的文件头部引入UserNotifications:
import UserNotifications

2. 调用权限申请接口,在回调中获取用户选择

你可以在App初始化、入口页面加载等你需要触发权限弹窗的位置调用申请接口,示例代码如下:

import SwiftUI
import UserNotifications

@main
struct DemoApp: App {
    init() {
        requestNotificationAuth()
    }
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
    
    private func requestNotificationAuth() {
        let notificationCenter = UNUserNotificationCenter.current()
        // 配置你需要申请的通知权限类型:提醒、声音、角标等
        notificationCenter.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
            DispatchQueue.main.async {
                if granted {
                    // 用户点击了「Allow」按钮,执行允许后的逻辑
                    print("用户已允许推送权限")
                } else {
                    // 用户点击了「Don't Allow」按钮,或之前已经拒绝过权限
                    print("用户已拒绝推送权限")
                }
                
                if let error = error {
                    print("权限申请失败:\(error.localizedDescription)")
                }
            }
        }
    }
}

补充说明

如果需要在其他时机主动查询当前的通知权限状态,可以调用getNotificationSettings接口:

UNUserNotificationCenter.current().getNotificationSettings { settings in
    DispatchQueue.main.async {
        switch settings.authorizationStatus {
        case .notDetermined:
            // 用户还未做出过选择,权限弹窗还未触发过
            break
        case .authorized, .provisional, .ephemeral:
            // 用户已经允许推送权限
            break
        case .denied:
            // 用户已经拒绝推送权限
            break
        @unknown default:
            break
        }
    }
}

内容的提问来源于stack exchange,提问作者novakmiha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:27:00