This iOS framework allows settings to be in-app in addition to or instead of being in the Settings app.

Overview

InAppSettingsKit

Build Status Version Swift Package Manager compatible Carthage compatible License Platform Sponsor Twitter

InAppSettingsKit (IASK) is an open source framework to easily add in-app settings to your iOS or Catalyst 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?

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 Carthage

Add to your Cartfile:

github "futuretap/InAppSettingsKit" "master"

Using CocoaPods

Add to your Podfile:

pod 'InAppSettingsKit'

Using SPM

Add to your Package.swift

.package(name: "InAppSettingsKit", url: "https://github.com/futuretap/InAppSettingsKit.git", .branch("master"))

Alternatively go to Xcodes File->Swift Packages->Add Package Dependency... menu entry and add https://github.com/futuretap/InAppSettingsKit.git.

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 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 displays the settings pane for the app where the user can specify the privacy settings for the app.

If you don't want to show Privacy cells, set the property neverShowPrivacySettings to YES.

The sample app defines NSMicrophoneUsageDescription to let the cell appear. Note that the settings page doesn't show any privacy settings yet because the app doesn't actually access the microphone. Privacy settings only show up in the Settings app after first use of the privacy-protected API.

Open URL

InAppSettingsKit adds a new element IASKOpenURLSpecifier that allows to open a specified URL using an external application (i.e. Safari or Mail). The URL to launch is specified in the File parameter. See the sample Root.inApp.plist for details.

Mail Composer

The custom IASKMailComposeSpecifier element allows to send mail from within the app by opening a mail compose view. You can set the following (optional) parameters using the settings plist: IASKMailComposeToRecipents, IASKMailComposeCcRecipents, IASKMailComposeBccRecipents, IASKMailComposeSubject, IASKMailComposeBody, IASKMailComposeBodyIsHTML. Optionally, you can implement

- (BOOL)settingsViewController:(id<IASKViewController>)settingsViewController shouldPresentMailComposeViewController:(MFMailComposeViewController*)mailComposeViewController forSpecifier:(IASKSpecifier*)specifier;

in your delegate to customize the mail (e.g. pre-fill the body with dynamic content, add attachments) modify the appearance of the compose view controller or even block the standard presentation. An alert is displayed if Email is not configured on the device. IASKSpecifier is the internal model object defining a single settings cell. Important IASKSpecifier properties:

  • key: corresponds to the Key in the Settings plist
  • title: the localized title of settings key
  • type: corresponds to the Type in the Settings plist
  • defaultValue: corresponds to the DefaultValue in the Settings plist

Button

InAppSettingsKit adds a IASKButtonSpecifier element that allows to call a custom action. Just add the following delegate method:

- (void)settingsViewController:(IASKAppSettingsViewController*)sender buttonTappedForSpecifier:(IASKSpecifier*)specifier;

The sender is always an instance of IASKAppSettingsViewController, a UIViewController subclass. So you can access its view property (might be handy to display an action sheet) or push another view controller. Another nifty feature is that the title of IASK buttons can be overriden by the (localizable) value from NSUserDefaults (or any other settings store - see below). This comes in handy for toggle buttons (e.g. Login/Logout). See the sample app for details.

By default, Buttons are aligned centered except if an image is specified (default: left-aligned). The default alignment may be overridden.

Multiline Text View

Similar to standard text fields, IASKTextViewSpecifier displays a full-width, multi line text view that resizes according to the entered text. It also supports KeyboardType, AutocapitalizationType and AutocorrectionType.

Date Picker

IASKDatePickerSpecifier displays a UIDatePicker to set a date and/or time. It supports the following options:

  • DatePickerMode: one of Date, Time, or DateAndTime (see UIDatePickerMode). Default is DateAndTime.
  • DatePickerStyle: one of Compact, Wheels, or Inline (see UIDatePickerStyle). Default is Wheels. Feature requires iOS 14 or higher. If the OS doesn't support it, IASK falls back to Wheels.
  • MinuteInterval: The interval at which the date picker displays minutes. Default: 1.

There are 3 optional delegate methods to customize how to store and display dates and times:

- (NSDate*)settingsViewController:(IASKAppSettingsViewController*)sender dateForSpecifier:(IASKSpecifier*)specifier;

Implement this if you store the date/time in a custom format other than as NSDate object. Called when the user starts editing a date/time by selecting the title cell above the date/time picker.

- (NSString*)settingsViewController:(IASKAppSettingsViewController*)sender datePickerTitleForSpecifier:(IASKSpecifier*)specifier;

Implement this to customize the displayed value in the title cell above the date/time picker.

- (void)settingsViewController:(IASKAppSettingsViewController*)sender setDate:(NSDate*)date forSpecifier:(IASKSpecifier*)specifier;

Implement this if you store the date/time in a custom format other than an NSDate object. Called when the user changes the date/time value using the picker.

List Groups

List groups (IASKListGroupSpecifier) are an IASK-only feature that allow you to manage a variable number of items, including adding and deleting items. Arrays of tags, accounts, names are typical use cases. A list group consists of a variable number of ItemSpecifier items. The number of these items is determined by your actual content in your NSUserDefaults (or your custom settings store). In other words, ItemSpecifier defines the type of cell, whereas the number of cells and their content comes from NSUserDefaults or your store. Cells can be deleted via swipe if the Deletable parameter is set to YES.

Optionally, a list group also has an AddSpecifier that controls the last item of the list group section. It is used to add items and could be a text field, a toggle, a slider, or a child pane. While the first three create a new item after editing is complete, a child pane presents a modal child view controller to configure a complex item, saved as a dictionary. Such child panes work very similarly to normal child panes with a few differences: They are presented not via push but modally and have a Cancel and Done button in the navigation bar. A new item is created by tapping the Done button.

You may want to specify some validation rules that need to be met before enabling the Done button. This can be achieved with the delegate method:

- (BOOL)settingsViewController:childPaneIsValidForSpecifier:contentDictionary:

The Done button is disabled when returning false from this method. Also note that the contentDictionary is a mutable dictionary. If you change some of the values, the UI will reflect that. This allows you to autocorrect invalid settings.

Custom Views

You can specify your own UITableViewCell within InAppSettingsKit by using the type IASKCustomViewSpecifier. A mandatory field in this case is the Key attribute. Also, you have to support the IASKSettingsDelegate protocol and implement these methods:

- (CGFloat)settingsViewController:(UITableViewController<IASKViewController> *)settingsViewController heightForSpecifier:(IASKSpecifier *)specifier;
- (UITableViewCell*)settingsViewController:(UITableViewController<IASKViewController> *)settingsViewController cellForSpecifier:(IASKSpecifier*)specifier;

Both methods are called for all your IASKCustomViewSpecifier entries. To differentiate them, you can access the Key attribute using specifier.key. In the first method you return the height of the cell, in the second method the cell itself. You should use reusable UITableViewCell objects as usual in table view programming. There's an example in the Demo app.

Optionally you can implement

- (void)settingsViewController:(IASKAppSettingsViewController*)settingsViewController

didSelectCustomViewSpecifier:(IASKSpecifier*)specifier;

to catch tap events for your custom view.

If you specify File, IASKViewControllerClass, IASKViewControllerStoryBoardId, or IASKSegueIdentifier (see below), the selection behavior of a custom view is identical to a child pane and the delegate is not called on selection.

Section Headers and Footers

The FooterText key for Group elements is available in system settings. It is supported in InAppSettingsKit as well. On top of that, we support this key for Multi Value elements as well. The footer text is displayed below the table of multi value options.

You can define a custom header view for PSGroupSpecifier segments by adding a Key attribute and implementing the following method in your IASKSettingsDelegate:

- (UIView *)settingsViewController:(id<IASKViewController>)settingsViewController tableView:(UITableView *)tableView viewForHeaderForSection:(NSInteger)section;

You can adjust the height of the header by implementing the following method:

- (CGFloat)settingsViewController:(id<IASKViewController>)settingsViewController tableView:(UITableView*)tableView heightForHeaderForSection:(NSInteger)section;

For simpler header title customization without the need for a custom view, and provided the -settingsViewController:tableView:viewForHeaderForSection: method has not been implemented or returns nil for the section, implement the following method:

- (NSString *)settingsViewController:(id<IASKViewController>)settingsViewController tableView:(UITableView*)tableView titleForHeaderForSection:(NSInteger)section;

If the method returns nil or a 0-length string, the title defined in the .plist will be used.

This behaviour is similar to custom table view cells. When implementing a method and if you need it, the section key can be retrieved from its index conveniently with:

NSString *key = [settingsViewController.settingsReader keyForSection:section];

Check the demo app for a concrete example.

For footer customization, three methods from the IASKSettingsDelegate protocol can be similarly implemented.

Extending Child Panes

Custom ViewControllers

For child pane elements (PSChildPaneSpecifier), Apple requires a file key that specifies the child plist. InAppSettingsKit allow to alternatively specify IASKViewControllerClass and IASKViewControllerSelector. In this case, the child pane is displayed by instantiating a UIViewController subclass of the specified class and initializing it using the init method specified in the IASKViewControllerSelector. The selector must have two arguments: an NSString argument for the file name in the Settings bundle and the IASKSpecifier. The custom view controller is then pushed onto the navigation stack. See the sample app for more details.

Using Custom ViewControllers from StoryBoard

Alternatively specify IASKViewControllerStoryBoardId to initiate a viewcontroller from main storyboard. Specify IASKViewControllerStoryBoardFile to use a storyboard other than the main storyboard from the app’s Info.plist.

Perform Segues

As an alternative to IASKViewControllerClass and IASKViewControllerSelector for child pane elements (PSChildPaneSpecifier), InAppSettingsKit is able to navigate to another view controller, by performing any segue defined in your storyboard. To do so specify the segue identifier in IASKSegueIdentifier.

Extending various specifiers

Subtitles

The IASKSubtitle key allows to define subtitles for these elements: Toggle, ChildPane, OpenURL, MailCompose, Button. Using a subtitle implies left alignment. A child pane displays its value as a subtitle, if available and no IASKSubtitle is specified. The subtitle can be a localizable String or a Dictionary with localizable subtitles depending on the current value. YES and NO are used as keys for boolean toggle values. The dictionary may contain a __default__ key to define a subtitle if no key is matching.

Text alignment

For some element types, a IASKTextAlignment attribute may be added with the following values to override the default alignment:

  • IASKUITextAlignmentLeft (ChildPane, TextField, Buttons, OpenURL, MailCompose)
  • IASKUITextAlignmentCenter (ChildPane, Buttons, OpenURL)
  • IASKUITextAlignmentRight (ChildPane, TextField, Buttons, OpenURL, MailCompose)

Variable font size

By default, the labels in the settings table are displayed in a variable font size, especially handy to squeeze-in long localizations (beware: this might break the look in Settings.app if labels are too long!). To disable this behavior, add a IASKAdjustsFontSizeToFitWidth Boolean attribute with value NO.

Icons

All element types (except sliders which already have a MinimumValueImage) support an icon image on the left side of the cell. You can specify the image name in an optional IASKCellImage attribute. The ".png" or "@2x.png" suffix is automatically appended and will be searched in the project. Optionally, you can add an image with suffix "Highlighted.png" or "[email protected]" to the project and it will be automatically used as a highlight image when the cell is selected (for Buttons and ChildPanes).

Extending Text Fields

Placeholder

The IASKPlaceholder key allows to define placeholder for TextField and TextView (IASKTextViewSpecifier).

Content Type

To support autofill based on the content type, add the IASKTextContentType key accepting the (prefix-less) constant names of UITextContentType. Example: to configure a text field with UITextContentTypeEmailAddress, use IASKTextContentType: EmailAddress.

Validation

Text fields can be validated using the delegate callback:

- (IASKValidationResult)settingsViewController:(IASKAppSettingsViewController*)settingsViewController validateSpecifier:(IASKSpecifier*)specifier textField:(IASKTextField*)textField previousValue:(nullable NSString*)previousValue replacement:(NSString* _Nonnull __autoreleasing *_Nullable)replacement;

The callback receives the IASKTextField which is a UITextField subclass to allow styling of the text field in case of a validation error (e.g. red text). It contains a replacement out parameter to replace invalid text. Returning IASKValidationResultFailedWithShake lets the text field shake to visually indicate the validation error.

Customizing Toggles

PSToggleSwitchSpecifier switches use a UISwitch by default. By specifying the option IASKToggleStyle: Checkmark, checkmarks are displayed for selected keys.

Dynamic MultiValue Lists

MultiValue lists (PSMultiValueSpecifier) can fetch their values and titles dynamically from the delegate instead of the static Plist. Implement these two methods in your IASKSettingsDelegate:

- (NSArray*)settingsViewController:(IASKAppSettingsViewController*)sender valuesForSpecifier:(IASKSpecifier*)specifier;
- (NSArray*)settingsViewController:(IASKAppSettingsViewController*)sender titlesForSpecifier:(IASKSpecifier*)specifier;

The sample app returns a list of all country codes as values and the localized country names as titles.

MultiValue lists can be sorted alphabetically by adding a true Boolean DisplaySortedByTitle key in the Plist. MultiValue list entries can be given an image. Specify images via the IconNames attribute (next to Values/Titles/ShortTitles etc.).

Settings Storage

The default behaviour of IASK is to store the settings in [NSUserDefaults standardUserDefaults]. However, it is possible to change this behavior by setting the settingsStore property on an IASKAppSettingsViewController. IASK comes with two store implementations: IASKSettingsStoreUserDefaults (the default one) and IASKSettingsStoreFile, which read and write the settings in a file of the path you choose. If you need something more specific, you can also choose to create your own store. The easiest way to create your own store is to create a subclass of IASKAbstractSettingsStore. Only 3 methods are required to override. See IASKSettingsStore.{h,m} for more details.

Notifications

There's a IASKSettingChangedNotification notification that is sent for every changed settings key. The object of the notification is the sending view controller and the userInfo dictionary contains the key and new value of the affected key.

Dynamic cell hiding

Sometimes, options depend on each other. For instance, you might want to have an "Auto Connect" switch, and let the user set username and password if enabled. To react on changes of a specific setting, use the IASKSettingChangedNotification notification explained above.

To hide a set of cells use:

- (void)[IASKAppSettingsViewController setHiddenKeys:(NSSet*)hiddenKeys animated:(BOOL)animated];

or the non-animated version:

@property (nonatomic, strong) NSSet *hiddenKeys;

See the sample app for more details. Including a PSGroupSpecifier key in the hiddenKeys hides the complete section.

Register default values

Settings property lists support the DefaultValue parameter to display default values in case there’s no value stored in NSUserDefaults. However, when the app queries NSUserDefaults for the value, that default value is not propagated. This makes sense since NSUserDefaults doesn’t know about settings property lists.

To initially set values for the various settings keys, NSUserDefaults provides the registerDefaults: method that takes a dictionary of "fallback" values that are returned from NSUserDefaults if no value has been stored. This is typically called at app launch.

However, creating and maintaining that dictionary can be cumbersome and there’s a risk that this dictionary and the settings default values get out of sync.

To address this, IASKSettingsReader provides a method that generates this dictionary by traversing the Root.plist and all child plists and gathering the DefaultValue for all keys.

NSDictionary *defaultDict = [appSettingsViewController.settingsReader gatherDefaultsLimitedToEditableFields:YES];
[NSUserDefaults.standardUserDefaults registerDefaults:defaultDict];

iCloud sync

To sync your NSUserDefaults with iCloud, there's another project called FTiCloudSync which is implemented as a category on NSUserDefaults: All write and remove requests are automatically forwarded to iCloud and all updates from iCloud are automatically stored in NSUserDefaults. InAppSettingsKit automatically updates the UI if the standard NSUserDefaults based store is used.

Support

Please don't use Github issues for support requests, we'll close them. Instead, post your question on StackOverflow with tag inappsettingskit.

License

We released the code under the liberal BSD license in order to make it possible to include it in every project, be it a free or paid app. The only thing we ask for is giving the original developers some credit. The easiest way to include credits is by leaving the "Powered by InAppSettingsKit" notice in the code. If you decide to remove this notice, a noticeable mention on the App Store description page or homepage is fine, too.

Author

Originally developed by my friend Luc Vandal, I took over the development and continue to update the framework. If you would like to support my Open Source work, consider joining me as a sponsor! 💪️ Your sponsorship enables me to spend more time on InAppSettingsKit and other community projects. Thank you!

Ortwin Gentz

Issues
  • "add account" functionality

    Hi, is it possible with InAppSettingsKit to configure (add, remove) a list of "accounts" in the same way the MailApp settings page does it?

    This means:

    • an "account" is defined by a plist setting file
    • a view showing a list of configured account
    • "add / remove account" buttons
    opened by JanC 53
  • Settings Changed Notification In Subclass Of IASKAppSettingsViewController

    Settings Changed Notification In Subclass Of IASKAppSettingsViewController

    I have a subclass of IASKAppSettingsViewController that I, of course, use to display and handle various events for the settings I present to the user.

    In this subclass, I am trying to receive the notification that settings were changed by adding this line to -(void)viewDidLoad:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(settingsChanged:) name:kIASKAppSettingChanged object:nil];
    

    Problem is that the method, settingsChanged, is never being called. I figure that there is some other way of doing this or I am doing something wrong here. This procedure does work for me in other classes, so I assume there is something special about IASKAppSettingsViewController that is preventing this from working. Can someone point me in the right direction?

    opened by CMoebius 27
  • Drop all the

    Drop all the "unnecessary" nibs

    InAppSettingsKit, unfortunately, had various UI inconsistency issues in time. For instance in the past we had label background coloring issues, as well as etched or single lined table view cell separator issues. Now, apparently with the introduction of the iOS 6, there is another issue #154 with grouped table view background color in some ways...

    I believe all of these issues could be "resolved" by dropping usage of all the "unnecessary" nibs in project altogether. By doing that iOS would fall back to its defaults no matter what device or operating system users might have.

    Looking at those few nibs used in InAppSettingsKit this shouldn't be so hard to do.

    What do you think?

    OpinionWanted 
    opened by exalted 23
  • Swift example for InAppSettingsKit

    Swift example for InAppSettingsKit

    This is a selfish request, but since I've only picked up Swift (just started) and not Obj-C I was wondering wether someone could provide a Swift sample of the app which doesn't require understanding Obj-C ?

    PS. Willing to sponsor the work.

    opened by realpicky 18
  • FooterText not wrapping

    FooterText not wrapping

    I just upgraded from 3.0.1 to 3.3.5 and the only regression I've noticed is that my FooterText no longer line-wraps. It looks like vertical space is still being reserved as though the text would be wrapped, but it just runs off the end of the first line with an ellipsis.

    Presumably, this impacts HeaderText as well, but I haven't checked this. I'm testing on iOS 15.1.

    Update: further testing showed that the regression occurred between version 3.3.1 and 3.3.2.

    opened by CrewNerd 15
  • Add support for UISplitViewController

    Add support for UISplitViewController

    This pull request adds support for UISplitViewController on all devices, OS versions & orientations. It supports size classes directly so that on an iPad the settings are displayed with a split view, on iPhone as a standard tableview (collapsed split view) and on the iPhone 6+ as a tableview in portrait (compact) and split in landscape (large). The behavior of UISplitViewController was changed in iOS 8 as it was made available on the iPhone. Therefore, wiring it up correctly to support all configurations is tricky. For this reason I added an IASKAppSettingsSplitViewController and updated the sample app to use it where relevant. For this reason I removed the settings tab from the storyboard and added it in code so that we use the correct view controller depending on the device & os version we're running on. This is intentionally in a separate commit so that we can revert it if you'd like to keep the storyboard example but in that case it won't support split view (as before).

    There are some limitations:

    • A UISplitViewController can't be displayed modally pre iOS 8 so I used a workaround that adds it to a container view controller - works nicely.
    • A UISplitViewController can't be pushed onto a UINavigationController. The previous workaround can be used here as well but the external UINavigationController doesn't play nicely with the ones inside the UISplitViewController so this isn't recommended. Therefore in the sample app I don't use IASKAppSettingsSplitViewController for the push example.

    I've added documentation where relevant & updated the readme.

    Tested on all of the following configurations in the simulator:

    • iPhone 4s, iPhone 5, iPhone 6, iPhone 6+, iPad Air
    • iOS 7.1, iOS 8.3
    • Portrait & Landscape
    • Tab, Push, Modal, Popover

    I don't have all of the above configurations so I tested on a selection of physical devices.

    I believe this fix should also support the new split view (side by side apps) on iPads running iOS 9 but I haven't verified this because InAppSettingsKit doesn't compile under Xcode 7. I plan to submit a separate pull request for that after which this can be tested.

    opened by alfonzzz 14
  • ARC-compatible version

    ARC-compatible version

    Is there any chance of an ARC version of IASK?

    Should I give it a shot?

    David

    ps. My first post on Github :)

    NiceToHave 
    opened by daviddelmonte 14
  • 'NSUnknownKeyException ' crash on iPhone 5

    'NSUnknownKeyException ' crash on iPhone 5

    Updating an iOS5 App to iOS6 and updating to the latest InAppSettingsKit, and I'm now getting:

    2012-10-13 17:12:19.415 <xxx>[336:907] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason:
    '[<IASKAppSettingsViewController 0x201c1400> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key _tableView.'
    

    The stack-trace shows:

    [IASKAppSettingsViewController init]
    [IASKAppSettingsViewController initwithStyle: ]
    [UITableViewController tableView]
    [UIViewController loadViewIfRequired]
    [UITableViewController loadView]
    [UIViewController loadView]
    [UIViewController _loadViewFromNibName: bundle:]
    [UINib instantiateWithOwner: Options:]
    [NSArray makeObjectsPerformSelector:]
    [NSObject(NSKeyValueCoding) setValue: forKeyPath:]
    [NSObject(NSKeyValueCoding) setValue: forKey:]
    [NSException raise]
    
    opened by srcshelton 13
  • IASK won't build/run on iOS 7... includes iOS 8-only symbols (e.g., _UIApplicationOpenSettingsURLString)

    IASK won't build/run on iOS 7... includes iOS 8-only symbols (e.g., _UIApplicationOpenSettingsURLString)

    I updated our pod spec recently to "Installing InAppSettingsKit 2.4.1 (was 2.3.4)"... but it won't link (or has a runtime Symbol Not Found – because it references iOS 8-only privacy constants:

    dyld: Symbol not found: _UIApplicationOpenSettingsURLString Expected in: /Applications/Xcode 6.1.1.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/System/Library/Frameworks/UIKit.framework/UIKit in /Users/devuser/Library/Developer/CoreSimulator/Devices/65A9414B-26B2-4889-BAA2-676F5E807231/data/Applications/FDEA090D-2200-4356-AE63-FF79517DDF48/MyProject.app/MyProject

    opened by mdg-at-politico 12
  • ARC update.  It was easier to start fresh and redo ARC than to merge

    ARC update. It was easier to start fresh and redo ARC than to merge

    Another ARC version on top of the latest commits.

    opened by Air-Craft 12
  • Date picker cell styling

    Date picker cell styling

    2 small problems:

    1. When the system font size is changed, all cells properly scale their text, except the DatePicker cell
    2. The "selectionStyle" of the cell is set not set to "None" when" DatePickerStyle" is set to "Compact".

    Bildschirmfoto 2021-09-16 um 7 25 51 PM

    opened by tipa 0
  • System Image Support

    System Image Support

    Please add support for adding icon with system image.

    opened by akhiljayaram 2
  • Migrate to Swift

    Migrate to Swift

    opened by phisakel 0
  • Min/max date/time for IASKDatePicker

    Min/max date/time for IASKDatePicker

    In my app the user can set a timespan in the app settings, which requires two time picker, one for the start and one for the end of the time span. In order to make sure the start time isn't set to a time later than the end time, I currently need to manually check and adjust the times after the user selected a value. However I would prefer to set a limit on the date/time picker itself.

    opened by tipa 1
  • Picker similar as IASKDatePickerSpecifier

    Picker similar as IASKDatePickerSpecifier

    Is there currently a possibility to display a picker view, animating below the cell, which lists custom values. I.e. similar as the IASKDatePickerSpecifier but then without dates but with other values (example "1 Apple", "2 Apples" etc)

    opened by cujo30227 1
  • Default Privacy Cell Customization

    Default Privacy Cell Customization

    With the current version, the Privacy - Open in Settings app cell is placed within its own section and is not possible to modify its position in the table.

    So instead of inserting the privacy cell in code as done in - (void)_reinterpretBundle:(NSDictionary*)settingsBundle, how do you feel about making it so that the user can specify the location of the privacy settings cell by using a key such as IASKOpenPrivacySettings in Settings.bundle/Root.plist?

    NiceToHave 
    opened by mkchoi212 1
  • Add support for container groups

    Add support for container groups

    When the settings plist contains the string ApplicationGroupContainerIdentifier and a custom container name, it's not currently used by InAppSettingsKit. See https://developer.apple.com/library/content/documentation/PreferenceSettings/Conceptual/SettingsApplicationSchemaReference/Articles/RootContent.html for information about this key. Container groups are used for sharing settings such as between the app and its widgets.

    Looking in IASKSettingsStoreUserDefaults, it appears that standardUserDefaults is always used. This should call initWithSuiteName with the name of the container from the key ApplicationGroupContainerIdentifier.

    ToBeImplemented 
    opened by mikezliu 1
  • Add Search Capabilitis

    Add Search Capabilitis

    Thanks for a great product. Will be nice to have a search similar to the iOS settings.

    NiceToHave 
    opened by ronyronen 1
  • Dynamic Text AutoLayout Issue when using Accessibility Fonts

    Dynamic Text AutoLayout Issue when using Accessibility Fonts

    When larger dynamic text sizes are selected, the fonts are not in alignment with each other. In Apple's Settings App, the Font does not respond to the larger Accessibility Fonts probably for this reason. Here is an image attached with a sample:

    image

    two issues

    1. height and alignment of PRIVACY item
    2. vertical alignment of text within single-line cells
    opened by lismondbernard 2
Releases(3.3.5)
Owner
Ortwin Gentz, FutureTap
I develop the iOS apps Where To? and Streets, the open source InAppSettingsKit framework. I'm active in the iOS and Rails community.
Ortwin Gentz, FutureTap
A framework to provide logic designed to prompt users at the ideal moment for a review of your app/software

ReviewKit ReviewKit is a Swift package/framework that provides logic designed to prompt users at the ideal moment for a review of your app. At a basic

Simon Mitchell 23 Oct 14, 2021
An extensible monitoring framework written in Swift

XestiMonitors Overview Reference Documentation Requirements Installation CocoaPods Carthage Swift Package Manager Usage Core Location Monitors Core Mo

J. G. Pusey 270 Aug 17, 2021
💻 A fast and flexible O(n) difference algorithm framework for Swift collection.

A fast and flexible O(n) difference algorithm framework for Swift collection. The algorithm is optimized based on the Paul Heckel's algorithm. Made wi

Ryo Aoyama 3k Nov 22, 2021
:fuelpump: Differific - a fast and convenient diffing framework.

Differific Description Differific is a diffing tool that helps you compare Hashable objects using the Paul Heckel's diffing algorithm. Creating a chan

Christoffer Winterkvist 125 Nov 13, 2021
A Swift micro-framework to easily deal with weak references to self inside closures

WeakableSelf Context Closures are one of Swift must-have features, and Swift developers are aware of how tricky they can be when they capture the refe

Vincent Pradeilles 67 Nov 13, 2021
A utility that reminds your iPhone app's users to review the app written in pure Swift.

SwiftRater SwiftRater is a class that you can drop into any iPhone app that will help remind your users to review your app on the App Store/in your ap

Takeshi Fujiki 246 Nov 15, 2021
Monitor iOS app version easily.

AppVersionMonitor Monitor iOS app version easily. You can get previous version and installation history. Usage To run the example project, clone the r

エウレカ 256 Nov 13, 2021
Versions tracker for your iOS, macOS, and tvOS app

VersionTrackerSwift VersionTrackerSwift is a versions / builds tracker to know which version has been installed by a user. Usage In your ApplicationDe

Tom Baranes 79 Oct 26, 2021
Simple and Lightweight App Version Tracking for iOS written in Swift

AEAppVersion Simple and lightweight iOS App Version Tracking written in Swift I made this for personal use, but feel free to use it or contribute. For

Marko Tadić 11 Jan 20, 2021
Tweak your iOS app without recompiling!

SwiftTweaks Adjust your iOS app on the fly without waiting to re-compile! Your users won’t see your animation study, Sketch comps, or prototypes. What

Khan Academy 1.3k Nov 14, 2021
Generate a privacy policy for your iOS app

PrivacyFlash Pro To easily run PrivacyFlash Pro get the latest packaged release. Learn more about PrivacyFlash Pro in our research paper. PrivacyFlash

privacy-tech-lab 125 Nov 20, 2021
Tweak your iOS app without recompiling!

SwiftTweaks Adjust your iOS app on the fly without waiting to re-compile! Your users won’t see your animation study, Sketch comps, or prototypes. What

Khan Academy 1.3k Apr 23, 2021
App Store Receipt Validation

Kvitto "Kvitto, it means Receipt in Swedish. The trend of using Swedish words for libraries is pretty big" -- Hugo Tunius via Twitter Allows parsing a

Cocoanetics 286 Oct 22, 2021
Simple app install/update behavior detection.

App-Update-Tracker AppUpdateTracker is a simple, lightweight iOS library intended to determine basic app install/update behavior. The following is a l

Aaron 23 Jul 9, 2019
Showcase new features after an app update similar to Pages, Numbers and Keynote.

WhatsNew Description WhatsNew automatically displays a short description of the new features when users update your app. This is similar to what happe

Patrick Balestra 1.5k Nov 20, 2021
Implementation of x-callback-url (Inter app communication) in swift

CallbackURLKit - Inter app communication Starting to integrate URL scheme in an app, why not be compliant with x-callback-url. CallbackURLKit.register

Eric Marchand 302 Nov 8, 2021
Showcase your awesome new app features 📱

WhatsNewKit enables you to easily showcase your awesome new app features. It's designed from the ground up to be fully customized to your needs. Featu

Sven Tiigi 2.3k Nov 20, 2021
Easier sharing of structured data between iOS applications and share extensions

XExtensionItem XExtensionItem is a tiny library allowing for easier sharing of structured data between iOS applications and share extensions. It is ta

Tumblr 86 Oct 14, 2021