[ios] Opening the Settings app from another app

Okay, I know that there are many question about it, but they are all from many time ago.

So. I know that it is possible because the Map app does it.

In the Map app if I turn off the localization for this app, it send me a message, and if I press okay, the "Settings App" will be open. And my question is, how is this possible? How can I open the "Setting app" from my own app?

Basically I need to do the same thing, if the user turn off the location for my app, then I'll show him a message saying something that will open the "Setting app"

This question is related to ios objective-c iphone application-settings appsettings

The answer is


iOS 10 update

Apple changed the method to open async on the main thread. However, from now it is only possible to open the app settings in native settings.

[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];

iOS 9 update

It is now possible to go directly to sub-settings menu. However, a URL scheme has to be created. It can be done using two ways:

  1. XCode - You will find it in Target, Info, URL Scheme. Then, just type prefs.
  2. Directly adding to *-Info.plist. Add the following: <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>prefs</string> </array> </dict> </array>

Then the code:

Swift

UIApplication.sharedApplication().openURL(NSURL(string:"prefs:root=General&path=Keyboard")!)

Objective-c

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=General&path=Keyboard"]];


Swift You can use following function to open Settings App with Bluetooth Page

func openSettingsApp(){
    if let settings = NSURL(string: "prefs:root=Bluetooth") {
        UIApplication.sharedApplication().openURL(settings)
    }
}

Again this would not open the App's Settings. This would open settings app with Bluetooth as this is deep linking to bluetooth.


Tested with iOS 10. Working

NSArray* urlStrings = @[@"prefs:root=WIFI", @"App-Prefs:root=WIFI"];
for(NSString* urlString in urlStrings){
NSURL* url = [NSURL URLWithString:urlString];
if([[UIApplication sharedApplication] canOpenURL:url]){
    [[UIApplication sharedApplication] openURL:url];
    break;
}
}

Happy Coding :)


UIApplicationOpenSettingsURLString this will only work if you have previously allowed for any permission. For example Location, Photo, Contact, Push notification access. So if you have not such permission(s) from the user:

If iOS 10 or above,

It will open the Settings but then crash it. The reason, there's nothing in settings for your app.

Below code will open your application settings inside the iOS Setting.

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url];
}

Due to device unavailability, I couldn't check this on iOS < 10.

Also, I could find below code from some gist and it works fine on iOS 10 as well. But I am not sure if this will approve by Apple review team or not.

https://gist.github.com/johnny77221/bcaa5384a242b64bfd0b8a715f48e69f


Add this to your class,

 public class func showSettingsAlert(title:String,message:String,onVC viewController:UIViewController,onCancel:(()->())?){
            YourClass.show2ButtonsAlert(onVC: viewController, title: title, message: message, button1Title: "Settings", button2Title: "Cancel", onButton1Click: {
                if let settingsURL = NSURL(string: UIApplicationOpenSettingsURLString){
                    UIApplication.sharedApplication().openURL(settingsURL)
                }
                }, onButton2Click: {
                    onCancel?()
            })
        }

 public class func show2ButtonsAlert(onVC viewController:UIViewController,title:String,message:String,button1Title:String,button2Title:String,onButton1Click:(()->())?,onButton2Click:(()->())?){
            dispatch_async(dispatch_get_main_queue()) {
                let alert : UIAlertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)

                alert.addAction(UIAlertAction(title: button1Title, style:.Default, handler: { (action:UIAlertAction) in
                    onButton1Click?()
                }))

                alert.addAction(UIAlertAction(title: button2Title, style:.Default, handler: { (action:UIAlertAction) in
                    onButton2Click?()
                }))

                viewController.presentViewController(alert, animated: true, completion: nil)
            }
        }

Call like this,

YourClass.showSettingsAlert("App would like to access camera", message: "App would like to access camera desc", onVC: fromViewController, onCancel: {
  print("canceled")
})

Swift 3:

guard let url = URL(string: UIApplicationOpenSettingsURLString) else {return}
if #available(iOS 10.0, *) {
  UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
  // Fallback on earlier versions
  UIApplication.shared.openURL(url)
}

In Swift 3 / iOS 10+ this now looks like

if let url = URL(string: "App-Prefs:root=LOCATION_SERVICES") {
    UIApplication.shared.open(url, completionHandler: .none)
}

You can use the below code for it.

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

To add to accepted answer: (from apple developer documentation) "When you open the URL built from this string (openSettingsURLString), the system launches the Settings app and displays the app’s custom settings, if it has any." So, if you want to open settings for your app, create your own Settings.bundle.


YES!! you can launch Device Settings screen, I have tested on iOS 9.2

Step 1. we need to add URL schemes

Go to Project settings --> Info --> URL Types --> Add New URL Schemes

enter image description here

Step 2. Launch Settings programmatically Thanks to @davidcann

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"]];

Also we can launch sub-screens like Music, Location etc. as well by just using proper name

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=MUSIC"]];

See this full name list here shared by Henri Normak


Update:

As per the comment everyone wants to know what happens after this change to my application submission status?

So YES!! I got successful update submission and application is available on store without any complain.

Just to confirm, I Just downloaded this morning and disabled Location services, and then started the app, which asked me for location permission and then my alert popup was there to send me on settings -> location services page --> Enabled --> That's it!!

![NOTICE: Your app might be rejected ... even if it's approved it can be rejected in future version if you use this method...]4


SWIFT 4.0

'openURL' was deprecated in iOS 10.0: Please use openURL:options:completionHandler: instead

UIApplication.shared.open(URL.init(string: UIApplicationOpenSettingsURLString)! , options: [:], completionHandler: nil)

Swift 4

I prefer to open setting in a safer way,

if let settingUrl = URL(string:UIApplicationOpenSettingsURLString) {

    UIApplication.shared.open(settingUrl)
}
else {
    print("Setting URL invalid")
}

In Swift 3 all I needed is this (here for example redirect to my app notifications):

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

Source: phynet gist.

This worked with me only when settings is in background. It will redirect you to your app notification settings but if settings wasn't running in the background it will just redirect you to notification settings in general.


From @Yatheeshaless's answer:

You can open settings app programmatically in iOS8, but not in earlier versions of iOS.

Swift:

   UIApplication.sharedApplication().openURL(NSURL(string:UIApplicationOpenSettingsURLString)!)

Swift 4:

if let url = NSURL(string: UIApplicationOpenSettingsURLString) as URL? {
    UIApplication.shared.openURL(url)
}

Swift 4.2 (BETA):

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

Objective-C:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

You can use this on iOS 5.0 and later: This no longer works.

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"]];

Seems like you can use the prefs:<area> URL to open the settings and go to specific areas. Apple could change these and break your app so always check if you can open them first.

From this article they have listed some of them for iOS 13.1:

Settings URLs

iCloud

  • iCloud: prefs:root=CASTLE
  • iCloud Backup: prefs:root=CASTLE&path=BACKUP

Wireless Radios

  • Wi-Fi: prefs:root=WIFI
  • Bluetooth: prefs:root=Bluetooth
  • Cellular: prefs:root=MOBILE_DATA_SETTINGS_ID

Personal Hotspot

  • Personal Hotspot: prefs:root=INTERNET_TETHERING
  • Personal Hotspot ? Family Sharing: prefs:root=INTERNET_TETHERING&path=Family%20Sharing
  • Personal Hotspot ? Wi-Fi Password: prefs:root=INTERNET_TETHERING&path=Wi-Fi%20Password

VPN

  • VPN: prefs:root=General&path=VPN

Notifications

  • Notifications: prefs:root=NOTIFICATIONS_ID
  • Notifications ? Siri Suggestions: prefs:root=NOTIFICATIONS_ID&path=Siri%20Suggestions

Sounds

  • Sounds: prefs:root=Sounds
  • Ringtone: prefs:root=Sounds&path=Ringtone

Do Not Disturb

  • Do Not Disturb: prefs:root=DO_NOT_DISTURB
  • Do Not Disturb ? Allow Calls From: prefs:root=DO_NOT_DISTURB&path=Allow%20Calls%20From

Screen Time

  • Screen Time: prefs:root=SCREEN_TIME
  • Screen Time ? Downtime: prefs:root=SCREEN_TIME&path=DOWNTIME
  • Screen Time ? App Limits: prefs:root=SCREEN_TIME&path=APP_LIMITS
  • Screen Time ? Always Allowed: prefs:root=SCREEN_TIME&path=ALWAYS_ALLOWED

General

  • General: prefs:root=General
  • General ? About: prefs:root=General&path=About
  • General ? Software Update: prefs:root=General&path=SOFTWARE_UPDATE_LINK
  • General ? CarPlay: prefs:root=General&path=CARPLAY
  • General ? Background App Refresh: prefs:root=General&path=AUTO_CONTENT_DOWNLOAD
  • General ? Multitasking (iPad-only): prefs:root=General&path=MULTITASKING
  • General ? Date & Time: prefs:root=General&path=DATE_AND_TIME
  • General ? Keyboard: prefs:root=General&path=Keyboard
  • General ? Keyboard ? Keyboards: prefs:root=General&path=Keyboard/KEYBOARDS
  • General ? Keyboard ? Hardware Keyboard: prefs:root=General&path=Keyboard/Hardware%20Keyboard
  • General ? Keyboard ? Text Replacement: prefs:root=General&path=Keyboard/USER_DICTIONARY
  • General ? Keyboard ? One Handed Keyboard: prefs:root=General&path=Keyboard/ReachableKeyboard
  • General ? Language & Region: prefs:root=General&path=INTERNATIONAL
  • General ? Dictionary: prefs:root=General&path=DICTIONARY
  • General ? Profiles: prefs:root=General&path=ManagedConfigurationList
  • General ? Reset: prefs:root=General&path=Reset

Control Center

  • Control Center: prefs:root=ControlCenter
  • Control Center ? Customize Controls: prefs:root=ControlCenter&path=CUSTOMIZE_CONTROLS

Display

  • Display: prefs:root=DISPLAY
  • Display ? Auto Lock: prefs:root=DISPLAY&path=AUTOLOCK
  • Display ? Text Size: prefs:root=DISPLAY&path=TEXT_SIZE

Accessibility

  • Accessibility: prefs:root=ACCESSIBILITY

Wallpaper

  • Wallpaper: prefs:root=Wallpaper

Siri

  • Siri: prefs:root=SIRI

Apple Pencil

  • Apple Pencil (iPad-only): prefs:root=Pencil

Face ID

  • Face ID: prefs:root=PASSCODE

Emergency SOS

  • Emergency SOS: prefs:root=EMERGENCY_SOS

Battery

  • Battery: prefs:root=BATTERY_USAGE
  • Battery ? Battery Health (iPhone-only): prefs:root=BATTERY_USAGE&path=BATTERY_HEALTH

Privacy

  • Privacy: prefs:root=Privacy
  • Privacy ? Location Services: prefs:root=Privacy&path=LOCATION
  • Privacy ? Contacts: prefs:root=Privacy&path=CONTACTS
  • Privacy ? Calendars: prefs:root=Privacy&path=CALENDARS
  • Privacy ? Reminders: prefs:root=Privacy&path=REMINDERS
  • Privacy ? Photos: prefs:root=Privacy&path=PHOTOS
  • Privacy ? Microphone: prefs:root=Privacy&path=MICROPHONE
  • Privacy ? Speech Recognition: prefs:root=Privacy&path=SPEECH_RECOGNITION
  • Privacy ? Camera: prefs:root=Privacy&path=CAMERA
  • Privacy ? Motion: prefs:root=Privacy&path=MOTION\

App Store

  • App Store: prefs:root=STORE
  • App Store ? App Downloads: prefs:root=STORE&path=App%20Downloads
  • App Store ? Video Autoplay: prefs:root=STORE&path=Video%20Autoplay

Wallet

  • Wallet: prefs:root=PASSBOOK

Passwords & Accounts

  • Passwords & Accounts: prefs:root=ACCOUNTS_AND_PASSWORDS
  • Passwords & Accounts ? Fetch New Data: prefs:root=ACCOUNTS_AND_PASSWORDS&path=FETCH_NEW_DATA
  • Passwords & Accounts ? Add Account: prefs:root=ACCOUNTS_AND_PASSWORDS&path=ADD_ACCOUNT

Mail

  • Mail: prefs:root=MAIL
  • Mail ? Preview: prefs:root=MAIL&path=Preview
  • Mail ? Swipe Options: prefs:root=MAIL&path=Swipe%20Options
  • Mail ? Notifications: prefs:root=MAIL&path=NOTIFICATIONS
  • Mail ? Blocked: prefs:root=MAIL&path=Blocked
  • Mail ? Muted Thread Action: prefs:root=MAIL&path=Muted%20Thread%20Action
  • Mail ? Blocked Sender Options: prefs:root=MAIL&path=Blocked%20Sender%20Options
  • Mail ? Mark Addresses: prefs:root=MAIL&path=Mark%20Addresses
  • Mail ? Increase Quote Level: prefs:root=MAIL&path=Increase%20Quote%20Level
  • Mail ? Include Attachments with Replies: prefs:root=MAIL&path=Include%20Attachments%20with%20Replies
  • Mail ? Signature: prefs:root=MAIL&path=Signature
  • Mail ? Default Account: prefs:root=MAIL&path=Default%20Account

Contacts

  • Contacts: prefs:root=CONTACTS

Calendar

  • Calendar: prefs:root=CALENDAR
  • Calendar ? Alternate Calendars: prefs:root=CALENDAR&path=Alternate%20Calendars
  • Calendar ? Sync: prefs:root=CALENDAR&path=Sync
  • Calendar ? Default Alert Times: prefs:root=CALENDAR&path=Default%20Alert%20Times
  • Calendar ? Default Calendar: prefs:root=CALENDAR&path=Default%20Calendar

Notes

  • Notes: prefs:root=NOTES
  • Notes ? Default Account: prefs:root=NOTES&path=Default%20Account
  • Notes ? Password: prefs:root=NOTES&path=Password
  • Notes ? Sort Notes By: prefs:root=NOTES&path=Sort%20Notes%20By
  • Notes ? New Notes Start With: prefs:root=NOTES&path=New%20Notes%20Start%20With
  • Notes ? Sort Checked Items: prefs:root=NOTES&path=Sort%20Checked%20Items
  • Notes ? Lines & Grids: prefs:root=NOTES&path=Lines%20%26%20Grids
  • Notes ? Access Notes from Lock Screen: prefs:root=NOTES&path=Access%20Notes%20from%20Lock%20Screen

Reminders

  • Reminders: prefs:root=REMINDERS
  • Reminders ? Default List: prefs:root=REMINDERS&path=DEFAULT_LIST

Voice Memos

  • Voice Memos: prefs:root=VOICE_MEMOS

Phone

  • Phone: prefs:root=Phone

Messages

  • Messages: prefs:root=MESSAGES

FaceTime

  • FaceTime: prefs:root=FACETIME

Maps

  • Maps: prefs:root=MAPS
  • Maps ? Driving & Navigation: prefs:root=MAPS&path=Driving%20%26%20Navigation
  • Maps ? Transit: prefs:root=MAPS&path=Transit

Compass

  • Compass: prefs:root=COMPASS

Measure

  • Measure: prefs:root=MEASURE

Safari

  • Safari: prefs:root=SAFARI
  • Safari ? Content Blockers: prefs:root=SAFARI&path=Content%20Blockers
  • Safari ? Downloads: prefs:root=SAFARI&path=DOWNLOADS
  • Safari ? Close Tabs: prefs:root=SAFARI&path=Close%20Tabs
  • Safari ? Clear History and Data: prefs:root=SAFARI&path=CLEAR_HISTORY_AND_DATA
  • Safari ? Page Zoom: prefs:root=SAFARI&path=Page%20Zoom
  • Safari ? Request Desktop Website: prefs:root=SAFARI&path=Request%20Desktop%20Website
  • Safari ? Reader: prefs:root=SAFARI&path=Reader
  • Safari ? Camera: prefs:root=SAFARI&path=Camera
  • Safari ? Microphone: prefs:root=SAFARI&path=Microphone
  • Safari ? Location: prefs:root=SAFARI&path=Location
  • Safari ? Advanced: prefs:root=SAFARI&path=ADVANCED

News

  • News: prefs:root=NEWS

Health

  • Health: prefs:root=HEALTH

Shortcuts

  • Shortcuts: prefs:root=SHORTCUTS

Music

  • Music: prefs:root=MUSIC
  • Music ? Cellular Data: prefs:root=MUSIC&path=com.apple.Music:CellularData
  • Music ? Optimize Storage: prefs:root=MUSIC&path=com.apple.Music:OptimizeStorage
  • Music ? EQ: prefs:root=MUSIC&path=com.apple.Music:EQ
  • Music ? Volume Limit: prefs:root=MUSIC&path=com.apple.Music:VolumeLimit

TV

  • Settings ? TV: prefs:root=TVAPP

Photos

  • Photos: prefs:root=Photos

Camera

  • Camera: prefs:root=CAMERA
  • Camera ? Record Video: prefs:root=CAMERA&path=Record%20Video
  • Camera ? Record Slo-mo: prefs:root=CAMERA&path=Record%20Slo-mo

Books

  • Books: prefs:root=IBOOKS

Game Center

  • Game Center: prefs:root=GAMECENTER

Examples related to ios

Adding a UISegmentedControl to UITableView Crop image to specified size and picture location Undefined Symbols error when integrating Apptentive iOS SDK via Cocoapods Keep placeholder text in UITextField on input in IOS Accessing AppDelegate from framework? Autoresize View When SubViews are Added Warp \ bend effect on a UIView? Speech input for visually impaired users without the need to tap the screen make UITableViewCell selectable only while editing Xcode 12, building for iOS Simulator, but linking in object file built for iOS, for architecture arm64

Examples related to objective-c

Adding a UISegmentedControl to UITableView Keep placeholder text in UITextField on input in IOS Accessing AppDelegate from framework? Warp \ bend effect on a UIView? Use NSInteger as array index Detect if the device is iPhone X Linker Command failed with exit code 1 (use -v to see invocation), Xcode 8, Swift 3 ITSAppUsesNonExemptEncryption export compliance while internal testing? How to enable back/left swipe gesture in UINavigationController after setting leftBarButtonItem? Change status bar text color to light in iOS 9 with Objective-C

Examples related to iphone

Detect if the device is iPhone X Xcode 8 shows error that provisioning profile doesn't include signing certificate Access files in /var/mobile/Containers/Data/Application without jailbreaking iPhone Certificate has either expired or has been revoked Missing Compliance in Status when I add built for internal testing in Test Flight.How to solve? cordova run with ios error .. Error code 65 for command: xcodebuild with args: "Could not find Developer Disk Image" Reason: no suitable image found iPad Multitasking support requires these orientations How to insert new cell into UITableView in Swift

Examples related to application-settings

Opening the Settings app from another app How to fix Error: "Could not find schema information for the attribute/element" by creating schema Max value of Xmx and Xms in Eclipse? How can I save application settings in a Windows Forms application?

Examples related to appsettings

Getting value from appsettings.json in .net core Automatically set appsettings.json for dev and release environments in asp.net core? Get ConnectionString from appsettings.json instead of being hardcoded in .NET Core 2.0 App AppSettings get value from .config file Opening the Settings app from another app ConfigurationManager.AppSettings - How to modify and save? How to check if an appSettings key exists? Reading settings from app.config or web.config in .NET