swift2 在Swift中以编程方式更改推送通知

c8ib6hqw  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(267)

我有一个应用程序,我已经实现了推送通知。我与用户检查,以允许远程通知:

let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.sharedApplication().registerForRemoteNotifications()

我还将响应与设备令牌一起存储在DB中。
我还在设置页面中实现了一个UISwitch,以启用/禁用推送通知,但我只能在DB列中启用/禁用此功能。
我的问题是,如果用户在初始请求中选择了“不允许”,我就无法在电话设置中启用推送通知,因此,即使我在DB中将值设置为“启用”,通知也永远不会到达电话,因为电话设置仍设置为“禁用”。
Swift 2中是否有一种方法可以从应用程序内部更改手机设置中的推送通知,而不是用户必须进入设置进行更改?或者让用户使用UISwitch来切换推送通知的开/关是否完全多余?

zxlwwiss

zxlwwiss1#

您无法从程序中更改推送通知权限状态。同时,要求用户允许推送通知的提示不能反复显示。您可以参考此https://developer.apple.com/library/ios/technotes/tn2265/_index.html
启用推送功能的应用程序首次注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。用户响应此提醒后,除非恢复设备或卸载应用程序至少一天,否则不会再次显示此提醒。
因此,使用UISwitch切换权限状态没有任何意义,除非您使用切换状态打开/关闭来自服务器的远程通知。

qkf9rpyu

qkf9rpyu2#

更新了swift 4:

func switchChanged(sender: UISwitch!) {
    print("Switch value is \(sender.isOn)")

    if(sender.isOn){
        print("on")
        UIApplication.shared.registerForRemoteNotifications()
    }
    else{
        print("Off")
        UIApplication.shared.unregisterForRemoteNotifications()
    }
}
35g0bw71

35g0bw713#

如果您使用FireBase将推送通知发送到设备,则可以使用主题订阅在已订阅的设备中启用推送通知,并在您不希望用户在已取消订阅的设备中接收推送通知时取消用户对主题的订阅。
要为用户订阅主题,只需导入Firebase,然后使用以下方法:

Messaging.messaging().subscribe(toTopic: "topicName")

以及使用以下命令取消用户用途:

Messaging.messaging().unsubscribe(fromTopic: "topicName")
2lpgd968

2lpgd9684#

if settings.authorizationStatus != .authorized{

            // Either denied or notDetermined
            // Ask the user to enable it in settings.

            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
                (granted, error) in
                  // add your own
                UNUserNotificationCenter.current().delegate = self
                let alertController = UIAlertController(title: appName, message: "Please enable notifications in settings and try again.", preferredStyle: .alert)
                let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
                    guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
                        return
                    }
                    if UIApplication.shared.canOpenURL(settingsUrl) {
                        UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                        })
                    }
                }
                let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
                alertController.addAction(cancelAction)
                alertController.addAction(settingsAction)
                DispatchQueue.main.async {
                    (UIApplication.shared.delegate as? AppDelegate)?.window?.rootViewController?.present(alertController, animated: true, completion: nil)
                }
            }
        }

相关问题