如何在 iOS 中打开和关闭通知?

Posted

技术标签:

【中文标题】如何在 iOS 中打开和关闭通知?【英文标题】:How to turn on and off notifications in iOS? 【发布时间】:2017-07-28 15:13:05 【问题描述】:

我正在尝试在 ios 11 应用程序中实现设置屏幕,我需要一个用于控制用户通知的 UISwitch。当设置为关闭时,我想放弃通知的权限,当设置为打开时,我想请求权限(标准对话框要求用户允许发送她的通知)。

为了请求许可,我找到了以下代码:

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound])  (granted, error) in
    // Enable or disable features based on authorization.

但是,如果我在系统设置中关闭应用程序的通知,则此代码不会弹出带有请求的对话框,它只会在 granted 中返回 false。

我找不到任何关于如何放弃权限的信息。

关于如何解决问题的任何提示?有没有可能,或者 Apple 是否认为这个任务应该只留给系统设置?

【问题讨论】:

仅限系统设置。原因很简单,用户不会在每次应用启动时被“推送通知请求”轰炸。一旦您获得发送通知的权限,您必须自己决定是否要向用户发送实际通知,也许添加用户可以选择加入/退出的主题。 所以没有办法以编程方式放弃权限? 您为什么要这样做?我不知道一种方法,这是没有意义的用例 因为这个决定必须是用户的并且是唯一的。您不应该为用户决定他们是否要继续收到通知。此外,进行这样的设置是没有意义的,因为您作为程序员可以随时停止发送通知,从应用程序的角度来看,这与关闭它们相同。通知开关是在应用程序内部还是在系统中,对于这个特定问题没有影响。 因为你是在要求用户给你权限,所以要求他撤销权限没有任何意义。您的应用程序可以决定不再向他发送通知,但这完全掌握在您手中,用户不应受到此决定的影响。 【参考方案1】:

在 iOS 中开启/关闭权限推送通知只出现一次。 所以为了实现这一点,你需要像你一样做一些调整 首先检查您的通知是否启用。

func pushEnabledAtOSLevel() -> Bool 
 guard let currentSettings = UIApplication.shared.currentUserNotificationSettings?.types else  return false 
 return currentSettings.rawValue != 0

之后,您可以使用打开/关闭按钮创建自定义弹出窗口 并导航到系统设置页面,用户可以在其中启用该选项 相应地

if let appSettings = NSURL(string: UIApplicationOpenSettingsURLString) 
    UIApplication.shared.openURL(appSettings as URL)

【讨论】:

【参考方案2】:

适用于 iOS 10.0 及更高版本

  UNUserNotificationCenter.current().getNotificationSettings  (settings) in
        if settings.authorizationStatus == .authorized 
            // Notifications are allowed
        
        else 
            // Either denied or notDetermined

            let alertController = UIAlertController(title: nil, message: "Do you want to change notifications settings?", preferredStyle: .alert)

            let action1 = UIAlertAction(title: "Settings", style: .default)  (action:UIAlertAction) in
                if let appSettings = NSURL(string: UIApplication.openSettingsURLString) 
                    UIApplication.shared.open(appSettings as URL, options: [:], completionHandler: nil)
                
            

            let action2 = UIAlertAction(title: "Cancel", style: .cancel)  (action:UIAlertAction) in
            

            alertController.addAction(action1)
            alertController.addAction(action2)
            self.present(alertController, animated: true, completion: nil)
        
    

【讨论】:

以上是关于如何在 iOS 中打开和关闭通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不关闭先前活动的情况下从通知中打开对话框样式的活动?

如何在小米5手机上禁止app的消息推送?

如何从应用程序打开关闭通知反映到 iPhone 设置中

当网站关闭时,推送通知如何在每个浏览器上工作?

如何在android应用程序活动和非活动状态下处理推送通知

如何在警报视图中隐藏关闭按钮和关闭操作以仅显示“打开应用程序”按钮