在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
相关产品推荐
相关产品推荐

