User:Uroboro

641 editsJoined 4 March 2013
Revision as of 06:17, 26 October 2014 by Uroboro (talk | contribs) ("Main articles")

Find me on saurik's IRC server, Twitter, Reddit, Github, StackOverflow.

Made UnlockEvents and FlipNC.

If you are looking for notifications within a process, give NotificationExplorer a look.

Some NIC templates here.

How 2 prefs

As opposed to using NSDictionaries and [NSHomeDirectory() stringByAppendingFormat:@"/Library/Preferences/%s.plist", "com.your.tweak"], here's another alternative to handling preferences on tweaks.

To do: read [this] carefully and move all information regarding preferences to a more appropriate place.

Tweak.xm

@interface NSUserDefaults (Tweak_Category)
- (id)objectForKey:(NSString *)key inDomain:(NSString *)domain;
- (void)setObject:(id)value forKey:(NSString *)key inDomain:(NSString *)domain;
@end

static NSString *nsDomainString = @"com.your.tweak";
static NSString *nsNotificationString = @"com.your.tweak/preferences.changed";
static BOOL enabled;

static void notificationCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
    NSNumber *n = (NSNumber *)[[NSUserDefaults standardUserDefaults] objectForKey:@"enabled" inDomain:nsDomainString];
    enabled = (n)? [n boolValue]:YES;
}

%ctor {
// Set variables on start up
notificationCallback(NULL, NULL, NULL, NULL, NULL);

// Register for 'PostNotification' notifications
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, notificationCallback, (CFStringRef)nsNotificationString, NULL, CFNotificationSuspensionBehaviorCoalesce);

// Add any personal initializations
}

/*
 * From here onward, write your tweak.
 * To make your tweak actually do stuff when enabled:
if (!enabled) {
     // Do the original algorithm, either by calling:
     // %orig(); //if using logos for methods
     // _functionName(args); //if using MSHook() for functions
} else {
    ...
    // Optionally, do the original algorithm
}
 */

Preference plist

Choose any of the following:

Reduced style

Provides a switch on the root section of the preferences (like Airplane Mode). Recommended for configuration-less tweaks.

Saved in your tweak's folder as layout/Library/PreferenceLoader/Preferences/com.your.tweak.plist

{
    entry = {
        cell = PSSwitchCell;
        defaults = "com.your.tweak";
        label = "Your Tweak";
        key = enabled;
        default = 1;
        icon = "/Applications/Preferences.app/[email protected]";
        PostNotification = "com.your.tweak/preferences.changed";
    };
}

Extended Style

Provides a pane where other cells can appear (like Wi-Fi). Recommended for configuration-friendly tweaks.

Saved in your tweak's folder as layout/Library/PreferenceLoader/Preferences/com.your.tweak.plist

{
    title = "Your Tweak";
    entry = {
        cell = PSLinkCell;
        label = "Your Tweak";
        icon = "/Applications/Preferences.app/[email protected]";
    };
    items = (
        {
            cell = PSSwitchCell;
            defaults = "com.your.tweak";
            label = Enabled;
            key = enabled;
            default = 1;
            PostNotification = "com.your.tweak/preferences.changed";
        }
        // add more cells (dictionaries) here
    );
}

PreferenceLoader Style

Provides a static list of cells. Recommended for Preference Bundles of tweaks.

Saved in your tweak's Preference Bundle subproject folder as Resources/com.your.tweak.plist

{
    items = (
        {
            cell = PSSwitchCell;
            defaults = "com.your.tweak";
            label = Enabled;
            key = enabled;
            default = 1;
            PostNotification = "com.your.tweak/preferences.changed";
        }
        // add more cells (dictionaries) here
    );
}

Flipswitches

After using the Flipswitch NIC template, modify accordingly

Switch.x

#import "FSSwitchDataSource.h"
#import "FSSwitchPanel.h"

@interface NSUserDefaults (Tweak_Category)
- (id)objectForKey:(NSString *)key inDomain:(NSString *)domain;
- (void)setObject:(id)value forKey:(NSString *)key inDomain:(NSString *)domain;
@end

static NSString *nsDomainString = @"com.your.tweak";
static NSString *nsNotificationString = @"com.your.tweak/preferences.changed";

@interface YourTweakFlipswitchSwitch : NSObject <FSSwitchDataSource>
@end

@implementation YourTweakFlipswitchSwitch

- (NSString *)titleForSwitchIdentifier:(NSString *)switchIdentifier {
    return @"Your Tweak";
}

- (FSSwitchState)stateForSwitchIdentifier:(NSString *)switchIdentifier {
    NSNumber *n = (NSNumber *)[[NSUserDefaults standardUserDefaults] objectForKey:@"enabled" inDomain:nsDomainString];
    BOOL enabled = (n)? [n boolValue]:YES;
    return (enabled) ? FSSwitchStateOn : FSSwitchStateOff;
}

- (void)applyState:(FSSwitchState)newState forSwitchIdentifier:(NSString *)switchIdentifier {
    switch (newState) {
    case FSSwitchStateIndeterminate:
        break;
    case FSSwitchStateOn:
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"enabled" inDomain:nsDomainString];
        CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), (CFStringRef)nsNotificationString, NULL, NULL, YES);
        break;
    case FSSwitchStateOff:
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:@"enabled" inDomain:nsDomainString];
        CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), (CFStringRef)nsNotificationString, NULL, NULL, YES);
        break;
    }
    return;
}

@end

Other Stuff

Similar Wanted Pages:

Inheritance hierarchy‏‎ MIG Subsystems
ApplicationScripting.framework/Inheritance hierarchy‏‎ ApplicationScripting.framework/MIG subsystem‏
AppSupport.framework/Inheritance hierarchy‏‎ AppSupport.framework/MIG subsystem
AudioToolbox.framework/Inheritance hierarchy ‏AudioToolbox.framework/MIG subsystem
AVFoundation.framework/Inheritance hierarchy‏ AVFoundation.framework/MIG subsystem
BackBoardServices.framework/Inheritance hierarchy‏ BackBoardServices.framework/MIG subsystem‏‎
‏BulletinBoard.framework/Inheritance hierarchy‏ ‏BulletinBoard.framework/MIG subsystem
ChatKit.framework/Inheritance hierarchy‏‎ ChatKit.framework/MIG subsystem‏
CoreFoundation.framework/Inheritance hierarchy‏‎ CoreFoundation.framework/MIG subsystem
CoreTelephony.framework/Inheritance hierarchy‏‎ CoreTelephony.framework/MIG subsystem
‏Foundation.frameworkInheritance hierarchy‏‎ ‏Foundation.framework/MIG subsystem
GraphicsServices.framework/Inheritance hierarchy‏‎ GraphicsServices.framework/MIG subsystem
IH boilerplate/Inheritance hierarchy‏‎ IH boilerplate/MIG subsystem‏‎
IOKit.framework/Inheritance hierarchy‏‎ IOKit.framework/MIG subsystem
IOSurface.framework/Inheritance hierarchy ‏IOSurface.framework/MIG subsystem
MapKit.framework/Inheritance hierarchy MapKit.framework/MIG subsystem
Message.framework/Inheritance hierarchy ‏Message.framework/MIG subsystem
QuartzCore.framework/Inheritance hierarchy QuartzCore.framework/MIG subsystem
Preferences.app/Inheritance hierarchy‏ ‏Preferences.app/MIG subsystem
Preferences.framework/Inheritance hierarchy Preferences.framework/MIG subsystem
SpringBoard.app/Inheritance hierarchy SpringBoard.app/MIG subsystem
SpringBoardServices.framework/Inheritance hierarchy‏ SpringBoardServices.framework/MIG subsystem
TelephonyUI.framework/Inheritance hierarchy TelephonyUI.framework/MIG subsystem
UIKit.framework/Inheritance hierarchy UIKit.framework/MIG subsystem
WiFiPicker.servicebundle/Inheritance hierarchy ‏WiFiPicker.servicebundle/MIG subsystem‏

Test Zone

Wondering what looks better:

To "wikitable"...

com.your.tweak.plist
JSON style XML style
{
    entry = {
        cell = PSSwitchCell;
        defaults = "com.your.tweak";
        label = "Your Tweak";
        key = enabled;
        default = 1;
        icon = "/Applications/Preferences.app/[email protected]";
        PostNotification = "com.your.tweak/preferences.changed";
    };
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>entry</key>
	<dict>
		<key>cell</key>
		<string>PSSwitchCell</string>
		<key>defaults</key>
		<string>com.your.tweak</string>
		<key>label</key>
		<string>Your Tweak</string>
		<key>key</key>
		<string>enabled</string>
		<key>default</key>
		<true/>
		<key>icon</key>
		<string>/Applications/Preferences.app/[email protected]</string>
		<key>PostNotification</key>
		<string>com.your.tweak/preferences.changed</string>
	</dict>
</dict>
</plist>

or not to "wikitable"...

com.your.tweak.plist
JSON style XML style
{
    entry = {
        cell = PSSwitchCell;
        defaults = "com.your.tweak";
        label = "Your Tweak";
        key = enabled;
        default = 1;
        icon = "/Applications/Preferences.app/[email protected]";
        PostNotification = "com.your.tweak/preferences.changed";
    };
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>entry</key>
	<dict>
		<key>cell</key>
		<string>PSSwitchCell</string>
		<key>defaults</key>
		<string>com.your.tweak</string>
		<key>label</key>
		<string>Your Tweak</string>
		<key>key</key>
		<string>enabled</string>
		<key>default</key>
		<true/>
		<key>icon</key>
		<string>/Applications/Preferences.app/[email protected]</string>
		<key>PostNotification</key>
		<string>com.your.tweak/preferences.changed</string>
	</dict>
</dict>
</plist>