How to open Settings programmatically like in Facebook app?

IosObjective C

Ios Problem Overview


I need to open Settings programmatically from within my app. I searched across SO but everywhere people say that it's impossible. But today I saw that it's implemented in Facebook app. There's a button on an UIAlertView and when you click it you open the Settings. So indeed this is possible to open Settings, I have witnessed this myself. But how to do that? Does anyone know how Facebook does that?

Ios Solutions


Solution 1 - Ios

On iOS 8 you can open Settings programmatically!

Here is the code:

- (void)openSettings
{
    BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL);
    if (canOpenSettings) {
        NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication] openURL:url];
    }
}

If your app has it’s own settings bundle, the settings will be opened showing your app’s settings. If your app does not have a setting bundle, the main settings page will be shown.

Solution 2 - Ios

You can't, there is no API call to do this.

Only system dialogs, dialogs from Apple Frameworks, can open the settings app. In iOS 5 there was a app url scheme to open the system dialog but Apple removed it later.


With the coming of iOS 8 you can open the settings dialog on your apps page.

if (&UIApplicationOpenSettingsURLString != NULL) {
   NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    [[UIApplication sharedApplication] openURL:url];
}
else {
  // Present some dialog telling the user to open the settings app.
}

Solution 3 - Ios

On iOS 8 you can open Settings programmatically!

Here is the list of currently known URLs in the Settings app:

- (void) openSettings
{
if (&UIApplicationOpenSettingsURLString != nil)
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
else
    NSLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}    

> - prefs:root=General&path=About > - prefs:root=General&path=ACCESSIBILITY > - prefs:root=AIRPLANE_MODE > - prefs:root=General&path=AUTOLOCK > - prefs:root=General&path=USAGE/CELLULAR_USAGE > - prefs:root=Brightness > - prefs:root=General&path=Bluetooth > - prefs:root=General&path=DATE_AND_TIME > - prefs:root=FACETIME > - prefs:root=General > - prefs:root=General&path=Keyboard > - prefs:root=CASTLE > - prefs:root=CASTLE&path=STORAGE_AND_BACKUP > - prefs:root=General&path=INTERNATIONAL > - prefs:root=LOCATION_SERVICES > - prefs:root=ACCOUNT_SETTINGS > - prefs:root=MUSIC > - prefs:root=MUSIC&path=EQ > - prefs:root=MUSIC&path=VolumeLimit > - prefs:root=General&path=Network > - prefs:root=NIKE_PLUS_IPOD > - prefs:root=NOTES > - prefs:root=NOTIFICATIONS_ID > - prefs:root=Phone > - prefs:root=Photos > - prefs:root=General&path=ManagedConfigurationList > - prefs:root=General&path=Reset > - prefs:root=Sounds&path=Ringtone > - prefs:root=Safari > - prefs:root=General&path=Assistant > - prefs:root=Sounds > - prefs:root=General&path=SOFTWARE_UPDATE_LINK > - prefs:root=STORE > - prefs:root=TWITTER > - prefs:root=General&path=USAGE > - prefs:root=VIDEO > - prefs:root=General&path=Network/VPN > - prefs:root=Wallpaper > - prefs:root=WIFI > - prefs:root=INTERNET_TETHERING

Solution 4 - Ios

Vito Ziv's answer in Swift.

func openSettings() {
    UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, completionHandler: nil)

}

Solution 5 - Ios

The alert in the Facebook app that this question refers to is a standard alert which iOS displays itself when you set UIRequiresPersistentWiFi to YES in your Info.plist files and the user launches your app without a network connection.

To summarize the discussion here:

  • There is no URL you can use to get to the root level of the Settings app.

  • You can send the user to your app's section of the Settings app using UIApplicationOpenSettingsURLString in iOS 8.

  • Your app can display the same alert as Facebook, which does open the root level of the Settings app, by setting UIRequiresPersistentWiFi to YES.

Solution 6 - Ios

A memo about prefs:root= and Prefs:root.

Yes, our App was REJECTED by Apple due to prefs:root= and App-Prefs:root URL scheme today (2018-06-29). They are private API.

Rejected by Apple


For Swift 4,

Only UIApplication.openSettingsURLString is public API to open Settings.

Solution 7 - Ios

 if (&UIApplicationOpenSettingsURLString != NULL)

in iOS 8+ is always TRUE. So you can edit like this

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}

(with new openURL for iOS 10)

Solution 8 - Ios

If you want open application settings you need write method with UIApplicationOpenSettingsURLString.

fileprivate func openSettings() {
  UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!)      
}

If you need will open one of many settings, you need use this function

fileprivate func openSettings() {
  UIApplication.shared.open(URL(string:"App-Prefs:root=General")!)
}

Solution 9 - Ios

To open settings of our own application in iOS 8 and later, use following code.

- (void) openSettings
{
    if(&UIApplicationOpenSettingsURLString != nil)
     	[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    else
        NSLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}

For reference and detailed description please follow

Opening the Settings app programmatically in iOS 8

Solution 10 - Ios

 if (&UIApplicationOpenSettingsURLString != NULL) {
            UIAlertView_Blocks *alertView = [[UIAlertView_Blocks alloc] initWithTitle:NSLocalizedString(@"Camera Access Denied", nil)
                                                                              message:NSLocalizedString(@"You must allow camera access in Settings", nil)
                                                                             delegate:nil
                                                                    cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
                                                                    otherButtonTitles:NSLocalizedString(@"Open Settings", nil), nil];
            [alertView showWithDissmissBlock:^(NSInteger buttonIndex) {
                if (alertView.cancelButtonIndex != buttonIndex) {
                    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
                    [[UIApplication sharedApplication] openURL:url];
                }
            }];
        }
        else {
            UIAlertView_Blocks *alertView = [[UIAlertView_Blocks alloc] initWithTitle:NSLocalizedString(@"Camera Access Denied", nil)
                                                                              message:NSLocalizedString(@"You must allow camera access in Settings > Privacy > Camera", nil)
                                                                             delegate:nil
                                                                    cancelButtonTitle:NSLocalizedString(@"OK", nil)
                                                                    otherButtonTitles:nil, nil];
            [alertView showWithDissmissBlock:^(NSInteger buttonIndex) {
            }];
        }

Solution 11 - Ios

Here is a Swift 3 example with UIAlertController and UIAlertAction.

func showSettingsPopup() {
    let alertVC = UIAlertController(title: "Notifications disabled", message: "Please, turn on notifications if you want to receive a reminder messages.", preferredStyle: .alert)
            
    let close = UIAlertAction(title: "Close", style: .destructive, handler: { (action) in
        print("close action handler")                
    })
             
    let openSettings = UIAlertAction(title: "Open settings", style: .default, handler: { (action) in
        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
            return
        }
                
        if UIApplication.shared.canOpenURL(settingsUrl) {
            UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                print("Settings are opened: \(success)")
            })
        }
    })
            
    alertVC.addAction(openSettings)
    alertVC.addAction(close)
    present(alertVC, animated: true, completion: nil)
}

Solution 12 - Ios

In many of the answers given here I see the use of "App-Prefs:root" "prefs:root" we should not use these in our apps to open settings app. As per Apple this is a non-public url scheme and if we use it our app will get rejected.

Solution 13 - Ios

if #available(iOS 10.0, *) {
        if let url = URL(string: "App-Prefs:root=Privacy") {
            UIApplication.shared.open(url, completionHandler: .none)
        }
    } else {
        // Fallback on earlier versions
    }

Opening Privacy settings in App

Solution 14 - Ios

Instead of using prefs:, just use App-Prefs:

if ([[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString: @"App-Prefs:root=WIFI"]]) {
    [[UIApplication sharedApplication] openURL: [NSURL URLWithString:@"App-Prefs:root=WIFI"]];
}

.

Everything is here: https://medium.com/@thanhvtrn/how-to-open-settings-wifi-in-swift-on-ios-10-1d94cf2c2e60

Solution 15 - Ios

SWIFT 3

UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndrey ChernukhaView Question on Stackoverflow
Solution 1 - IosVito ZivView Answer on Stackoverflow
Solution 2 - IosrckoenesView Answer on Stackoverflow
Solution 3 - IosStalin PusparajView Answer on Stackoverflow
Solution 4 - IosAnoroahView Answer on Stackoverflow
Solution 5 - IosRichard VenableView Answer on Stackoverflow
Solution 6 - IosAechoLiuView Answer on Stackoverflow
Solution 7 - IosJoannesView Answer on Stackoverflow
Solution 8 - Iosuser1064264View Answer on Stackoverflow
Solution 9 - IosAamirView Answer on Stackoverflow
Solution 10 - IosIvanovDeveloperView Answer on Stackoverflow
Solution 11 - IosAnvar AzizovView Answer on Stackoverflow
Solution 12 - IosRavi KumarView Answer on Stackoverflow
Solution 13 - IosHemanshu LiyaView Answer on Stackoverflow
Solution 14 - IosNikola MarkovicView Answer on Stackoverflow
Solution 15 - IosBennyTheNerdView Answer on Stackoverflow