InAppSettingsKit
This iOS framework allows settings to be in-app in addition to or instead of being in the Settings app.
Install / Use
/learn @futuretap/InAppSettingsKitREADME
InAppSettingsKit
InAppSettingsKit (IASK) is an open source framework to easily add in-app settings to your iOS, Catalyst, or visionOS apps. Normally iOS apps use the Settings.bundle resource to add app-specific settings in the Settings app. InAppSettingsKit takes advantage of the same bundle and allows you to present the same settings screen within your app. So the user has the choice where to change the settings.
IASK not only replicates the feature set of system settings but supports a large number of additional elements and configuration options.
Updating from IASK 2.x? Please read the Release Notes.

- How does it work?
- How to include it?
- Sample application
- App Integration
- Goodies
- Custom inApp plists
- Privacy link
- Open URL
- Web View Controller
- Mail Composer
- Button
- Multiline Text View
- Date Picker
- List Groups
- Custom Views
- Section Headers and Footers
- Extending Child Panes
- Extending various specifiers
- Extending Text Fields
- Customizing Toggles
- Dynamic MultiValue Lists
- Settings Storage
- Notifications
- Dynamic cell hiding
- Register default values
- iCloud sync
- Support
- License
- Author
How does it work?
To support traditional Settings.app panes, the app must include a Settings.bundle with at least a Root.plist to specify the connection of settings UI elements with NSUserDefaults keys. InAppSettingsKit basically just uses the same Settings.bundle to do its work. This means there's no additional work when you want to include a new settings parameter. It just has to be added to the Settings.bundle and it will appear both in-app and in Settings.app. All settings types like text fields, sliders, toggle elements, child views etc. are supported.
How to include it?
The source code is available on github. There are several ways of installing it:
Using SPM
To install InAppSettingsKit using Swift Package Manager you can follow the tutorial published by Apple using the URL for the InAppSettingsKit repo with the current version:
- In Xcode, select “File” → “Add Packages…”
- Enter
https://github.com/futuretap/InAppSettingsKit.git
Using CocoaPods
Add to your Podfile:
pod 'InAppSettingsKit'
Then run pod install.
Using Carthage
Add to your Cartfile:
github "futuretap/InAppSettingsKit" "master"
Sample application
InAppSettingsKit contains an Xcode sample application, that demonstrates all of it's extensive features. Both for a push and modal view controller.
To run the sample application:
- From the project root folder, open
InAppSettingsKit.xcworkspacein Xcode. - Change the scheme to
Sample App(Product > Scheme > Sample App). - Select a destination, like an iPhone Simulator.
- To build and run the application, choose Product > Run, or click the Run button in the Xcode toolbar.
App Integration
In order to start using IASK add Settings.bundle to your project (File -> Add File -> Settings bundle) and edit Root.plist with your settings (see Apple's documentation on the Schema File Root Content). Read on to get insight into more advanced uses.
To display InAppSettingsKit, instantiate IASKAppSettingsViewController and push it onto the navigation stack or embed it as the root view controller of a navigation controller.
In code, using Swift:
let appSettingsViewController = IASKAppSettingsViewController()
navigationController.pushViewController(appSettingsViewController, animated: true)
In code, using Swift as part of a swift package:
In a modularized app, you might want to move all settings-related code into a separate package, and only reference the InAppSettingsKit dependency there. Your Package.swift would look like this:
let package = Package(
name: "SettingsPackage",
platforms: [.iOS(.v17)],
dependencies: [
.package(url: "https://github.com/futuretap/inappsettingskit", from: "3.4.0")
],
.target(
name: "SettingsPackage",
dependencies: [
.product(name: "InAppSettingsKit", package: "inappsettingskit"),
],
resources: [
.copy("InAppSettings.bundle")
]
)
)
(Note that the InAppSettings.bundle directory is also part of the package, and does not belong to the main app anymore.)
Creating an IASKAppSettingsViewController now requires setting its bundle property to the package's bundle:
struct InAppSettingsView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> some UIViewController {
let iask = IASKAppSettingsViewController(style: .insetGrouped)
iask.bundle = Bundle.module // IMPORTANT
return iask
}
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { }
}
In code, using Objective-C:
IASKAppSettingsViewController *appSettingsViewController = [[IASKAppSettingsViewController alloc] init];
[self.navigationController pushViewController:appSettingsViewController animated:YES];
Via storyboard:
- Drag and drop a Table View Controller embedded into a Navigation Controller into your app and wire the storyboard to your app UI
- Set the Table View Controller class to
IASKAppSettingsViewController - Set the Table View to "Grouped" style.
- If you’re presenting the navigation controller modally:
- In the Table View Controller set "Show Done Button" under "App Settings View Controller" to "On"
- Set the delegate comforming to
IASKAppSettingsViewControllerDelegate. - Implement the delegate method
-settingsViewControllerDidEnd:and dismiss the view controller.
The sample application shows how to wire everything up.
Additional changes
To customize the behavior, implement IASKSettingsDelegate and set the delegate property of IASKAppSettingsViewController. For advanced customization needs, subclassing of IASKAppSettingsViewController is supported.
Depending on your project it might be needed to make some changes in the startup code of your app. Your app has to be able to reconfigure itself at runtime if the settings are changed by the user. This could be done in a -reconfigure method that is being called from -applicationDidFinishLaunching as well as in the delegate method -settingsViewControllerDidEnd: of IASKAppSettingsViewController.
Goodies
The intention of InAppSettingsKit was to create a 100% imitation of the Settings.app behavior (see the Apple Settings Application Schema Reference). On top of that, we added a ton of bonus features that make IASK much more flexible and dynamic.
Custom inApp plists
Settings plists can be device-dependent: Root~ipad.plist will be used on iPad and Root~iphone.plist on iPhone. If not existent, Root.plist will be used.
InAppSettingsKit adds the possibility to override those standard files by using .inApp.plist instead of .plist. Alternatively, you can create a totally separate bundle named InAppSettings.bundle instead of the usual Settings.bundle. The latter approach is useful if you want to suppress the settings in Settings.app.
This is the complete search order for the plists:
- InAppSettings.bundle/FILE~DEVICE.inApp.plist
- InAppSettings.bundle/FILE.inApp.plist
- InAppSettings.bundle/FILE~DEVICE.plist
- InAppSettings.bundle/FILE.plist
- Settings.bundle/FILE~DEVICE.inApp.plist
- Settings.bundle/FILE.inApp.plist
- Settings.bundle/FILE~DEVICE.plist
- Settings.bundle/FILE.plist
Privacy link
If the app includes a usage key for various privacy features such as camera or location access in its Info.plist, IASK displays a "Privacy" cell at the top of the root settings page. This cell opens the system Settings app and displa
