我有一个应用程序,我已经实现了推送通知。我通过以下方式与用户核实以允许远程通知:
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.sharedApplication().registerForRemoteNotifications()
我还将响应存储在带有设备令牌的数据库中。
我还在设置页面中实现了UISwitch以启用/禁用推送通知,但我只能在数据库列中启用/禁用此功能。
我的问题是,如果用户在初始请求中选择了“不允许”,我就无法在手机设置中启用推送通知,因此即使我在DB中将值设置为启用,通知也不会到达电话设置仍然设置为禁用。
Swift 2中是否有办法在应用内更改手机设置中的推送通知,而不是用户必须进入要更改的设置?或者让UISwitch允许用户打开/关闭推送通知是完全多余的吗?
答案 0 :(得分:5)
您无法从程序更改推送通知权限状态。此外,无法一次又一次地显示要求用户允许推送通知的提示。您可以参考此https://developer.apple.com/library/ios/technotes/tn2265/_index.html。
第一次启用推送的应用注册推送通知时,iOS会询问用户是否希望接收该应用的通知。一旦用户响应此警报,除非设备已恢复或应用程序已卸载至少一天,否则不会再次显示该警报。
因此,除非您使用开关状态打开/关闭服务器的远程通知,否则使用UISwitch切换权限状态没有任何意义。
答案 1 :(得分:1)
如果您使用FireBase
向设备发送推送通知,则可以使用主题订阅在已订阅的设备中启用推送通知,并在您不希望用户接收推送通知时从主题退订用户在那些尚未订阅的设备中。
要将用户订阅主题,只需导入Firebase,然后使用此方法即可:
Messaging.messaging().subscribe(toTopic: "topicName")
并取消订阅用户使用:
Messaging.messaging().unsubscribe(fromTopic: "topicName")
答案 2 :(得分:0)
更新了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()
}
}
答案 3 :(得分:0)
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)
}
}
}