Tal Zion
Tal Zion

Reputation: 6526

How to open your app in Settings iOS 11

It seems that Apple has moved a lot of the app configurations to the App path with iOS 11, how to open the app path programmatically in Settings? I tried "App-Prefs:root=\(Bundle.main.bundleIdentifier!)" but this doesn't seem to work.

Please note that my question is specific to: How to open the app path in settings: NOT how to open the settings

Upvotes: 35

Views: 26960

Answers (6)

MALIKK HABIB UR REHMAN
MALIKK HABIB UR REHMAN

Reputation: 880

SWift 5

In some case we can not open App's setting after trying all the above. To solve this problem 100% just make sure these two step are followed

Step 1. Right click on the project file -> Add New File -> Add Settings.Bundle in project and edit according to your requirements.

Step 2. Now add some code in your buttons action.

if let url = URL(string: UIApplication.openSettingsURLString) {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

Note: Using "prefs:Root" is forbidden by apple and your app will be rejected. So, avoid using this api.

Upvotes: 0

Damien
Damien

Reputation: 3362

Here is the code you're looking for, I guess:

if let url = URL(string: UIApplicationOpenSettingsURLString) {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

And in addition, the updated version for swift 5 :

if let url = URL(string: UIApplication.openSettingsURLString) {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

Upvotes: 63

Capella
Capella

Reputation: 1001

UIApplicationOpenSettingsURLString has been renamed to UIApplication.openSettingsURLString.

if let url = URL(string: UIApplication.openSettingsURLString) {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

Upvotes: 1

Alessandro Francucci
Alessandro Francucci

Reputation: 1660

Swift 4.2, iOS 12

Opening just the settings is possible with the function below:

extension UIApplication {

    ...

    @discardableResult
    static func openAppSettings() -> Bool {
        guard
            let settingsURL = URL(string: UIApplication.openSettingsURLString),
            UIApplication.shared.canOpenURL(settingsURL)
            else {
                return false
        }

        UIApplication.shared.open(settingsURL)
        return true
    }
}

Usage: UIApplication.openAppSettings()

But be careful to NOT use "non-public URL scheme", such as: prefs:root= or App-Prefs:root, because otherwise your app will be rejected. This happened to me recently since I was trying to have a deeplink to the wifi section in the settings.

Upvotes: 16

iKK
iKK

Reputation: 7012

And if you want to make it work for both, older and newer iOS-versions, then do:

if let url = URL(string:UIApplicationOpenSettingsURLString) {
    if UIApplication.shared.canOpenURL(url) {
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(url)
        }
    }
}

Upvotes: 4

skornos
skornos

Reputation: 3281

openURL has been deprecated since iOS 10, so I would advise you to use:

if let url = URL(string:UIApplicationOpenSettingsURLString) {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: { success in
            log.debug("Open app settings success: \(success)")
        })
    }
}

Upvotes: 2

Related Questions