Question or problem in the Swift programming language:
In the case that a user may accidentally declines to receive notifications and wants to turn notifications later, how can I use an NSURL to open the IOS Settings App to my app’s notification page where they can select Allow Notifications?
How to solve the problem:
Solution 1:
For Swift 3, use UIApplicationOpenSettingsURLString
to go to settings for your app where it shows the Notifications status and “Cellular Data”
let settingsButton = NSLocalizedString("Settings", comment: "") let cancelButton = NSLocalizedString("Cancel", comment: "") let message = NSLocalizedString("Your need to give a permission from notification settings.", comment: "") let goToSettingsAlert = UIAlertController(title: "", message: message, preferredStyle: UIAlertControllerStyle.alert) goToSettingsAlert.addAction(UIAlertAction(title: settingsButton, style: .destructive, handler: { (action: UIAlertAction) in DispatchQueue.main.async { guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else { return } if UIApplication.shared.canOpenURL(settingsUrl) { if #available(iOS 10.0, *) { UIApplication.shared.open(settingsUrl, completionHandler: { (success) in print("Settings opened: \(success)") // Prints true }) } else { UIApplication.shared.openURL(settingsUrl as URL) } } } })) logoutUserAlert.addAction(UIAlertAction(title: cancelButton, style: .cancel, handler: nil))
Solution 2:
I found the answer to this question (albeit helpful) has a bit too much assumed logic. Here is a plain and simple Swift 5 implementation if anyone else stumbles upon this question:
if let bundleIdentifier = Bundle.main.bundleIdentifier, let appSettings = URL(string: UIApplication.openSettingsURLString + bundleIdentifier) { if UIApplication.shared.canOpenURL(appSettings) { UIApplication.shared.open(appSettings) } }
Solution 3:
UPDATE: This will be rejected by Apple.
To open notifications part of settings use this
UIApplication.shared.open(URL(string:"App-Prefs:root=NOTIFICATIONS_ID")!, options: [:], completionHandler: nil)