mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2025-01-22 15:20:00 +01:00
Notification Permission Requests
Fixes #2057 • On app launch, the app checks if notification permissions are granted and registers with APNS if that is the case. It will not request permissions as part of the app launch. • When a user requests to be notified of new articles, the authorizationStatus is checked: - if `notDetermined` or `provisional`, an authorization request is made, and if successful, the Notify of New Articles status is updated (otherwise it is reverted) - if `denied`, an alert is thrown asking the user to enable in settings (and the change to notify of new articles is reverted) - if `authorized` the update is made. `WebFeedInspectorViewController` also monitors for the app entering the foreground so that it can get the latest notification auth settings.
This commit is contained in:
parent
e6e77c10f3
commit
6224dfad03
@ -90,9 +90,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
|
|||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.unreadCount = AccountManager.shared.unreadCount
|
self.unreadCount = AccountManager.shared.unreadCount
|
||||||
}
|
}
|
||||||
|
|
||||||
UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .sound, .alert]) { (granted, error) in
|
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
|
||||||
if granted {
|
if settings.authorizationStatus == .authorized {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
UIApplication.shared.registerForRemoteNotifications()
|
UIApplication.shared.registerForRemoteNotifications()
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
import UIKit
|
import UIKit
|
||||||
import Account
|
import Account
|
||||||
import SafariServices
|
import SafariServices
|
||||||
|
import UserNotifications
|
||||||
|
|
||||||
class WebFeedInspectorViewController: UITableViewController {
|
class WebFeedInspectorViewController: UITableViewController {
|
||||||
|
|
||||||
@ -38,6 +39,8 @@ class WebFeedInspectorViewController: UITableViewController {
|
|||||||
return webFeed.homePageURL == nil
|
return webFeed.homePageURL == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var userNotificationSettings: UNNotificationSettings?
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
tableView.register(InspectorIconHeaderView.self, forHeaderFooterViewReuseIdentifier: "SectionHeader")
|
tableView.register(InspectorIconHeaderView.self, forHeaderFooterViewReuseIdentifier: "SectionHeader")
|
||||||
|
|
||||||
@ -51,6 +54,14 @@ class WebFeedInspectorViewController: UITableViewController {
|
|||||||
feedURLLabel.text = webFeed.url
|
feedURLLabel.text = webFeed.url
|
||||||
|
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(webFeedIconDidBecomeAvailable(_:)), name: .WebFeedIconDidBecomeAvailable, object: nil)
|
NotificationCenter.default.addObserver(self, selector: #selector(webFeedIconDidBecomeAvailable(_:)), name: .WebFeedIconDidBecomeAvailable, object: nil)
|
||||||
|
|
||||||
|
NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: .main, using: { _ in
|
||||||
|
self.updateNotificationSettings()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewDidAppear(_ animated: Bool) {
|
||||||
|
updateNotificationSettings()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewDidDisappear(_ animated: Bool) {
|
override func viewDidDisappear(_ animated: Bool) {
|
||||||
@ -67,7 +78,30 @@ class WebFeedInspectorViewController: UITableViewController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func notifyAboutNewArticlesChanged(_ sender: Any) {
|
@IBAction func notifyAboutNewArticlesChanged(_ sender: Any) {
|
||||||
webFeed.isNotifyAboutNewArticles = notifyAboutNewArticlesSwitch.isOn
|
guard let settings = userNotificationSettings else {
|
||||||
|
notifyAboutNewArticlesSwitch.isOn = !notifyAboutNewArticlesSwitch.isOn
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if settings.authorizationStatus == .denied {
|
||||||
|
notifyAboutNewArticlesSwitch.isOn = !notifyAboutNewArticlesSwitch.isOn
|
||||||
|
present(notificationUpdateErrorAlert(), animated: true, completion: nil)
|
||||||
|
} else if settings.authorizationStatus == .authorized {
|
||||||
|
webFeed.isNotifyAboutNewArticles = notifyAboutNewArticlesSwitch.isOn
|
||||||
|
} else {
|
||||||
|
UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .sound, .alert]) { (granted, error) in
|
||||||
|
self.updateNotificationSettings()
|
||||||
|
if granted {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.webFeed.isNotifyAboutNewArticles = self.notifyAboutNewArticlesSwitch.isOn
|
||||||
|
UIApplication.shared.registerForRemoteNotifications()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.notifyAboutNewArticlesSwitch.isOn = !self.notifyAboutNewArticlesSwitch.isOn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func alwaysShowReaderViewChanged(_ sender: Any) {
|
@IBAction func alwaysShowReaderViewChanged(_ sender: Any) {
|
||||||
@ -158,3 +192,32 @@ extension WebFeedInspectorViewController: UITextFieldDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: UNUserNotificationCenter
|
||||||
|
|
||||||
|
extension WebFeedInspectorViewController {
|
||||||
|
|
||||||
|
func updateNotificationSettings() {
|
||||||
|
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.userNotificationSettings = settings
|
||||||
|
if settings.authorizationStatus == .authorized {
|
||||||
|
UIApplication.shared.registerForRemoteNotifications()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func notificationUpdateErrorAlert() -> UIAlertController {
|
||||||
|
let alert = UIAlertController(title: NSLocalizedString("Enable Notifications", comment: "Notifications"),
|
||||||
|
message: NSLocalizedString("Notifications need to be enabled in the Settings app.", comment: "Notifications need to be enabled in the Settings app."), preferredStyle: .alert)
|
||||||
|
let openSettings = UIAlertAction(title: NSLocalizedString("Open Settings", comment: "Open Settings"), style: .default) { (action) in
|
||||||
|
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : false], completionHandler: nil)
|
||||||
|
}
|
||||||
|
let dismiss = UIAlertAction(title: NSLocalizedString("Dismiss", comment: "Dismiss"), style: .cancel, handler: nil)
|
||||||
|
alert.addAction(openSettings)
|
||||||
|
alert.addAction(dismiss)
|
||||||
|
return alert
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user