Repository files navigation

SSApplication

Circle CI

A UIApplication subclass to start your app off right.

SSApplication powers launch setup and app notifications in my app MUDRammer - A Modern MUD Client for iPhone and iPad.

Setup

  1. Install with Cocoapods. Add to your Podfile:

    pod 'SSApplication', :head # YOLO
    

    Or just drag SSApplication.{h,m} into your project.

  2. With SSApplication installed, edit your main app delegate file and subclass SSApplication:

    // MyAppDelegate.h
    #import<SSApplication.h>@interfaceMyAppDelegate : SSApplication@end
  3. You'll need to make a small change in your app's main.m file to tell it about your new principal UIApplication subclass. Add your app delegate's class as the third argument to UIApplicationMain. Your main.m should look something like this:

    // main.m
    #import<UIKit/UIKit.h>
    #import"MyAppDelegate.h"intmain(int argc, char *argv[])
    {
    @autoreleasepool {
    returnUIApplicationMain(argc, argv, NSStringFromClass([MyAppDelegate class]), NSStringFromClass([MyAppDelegate class]));
    }
    }

App Launch

SSApplication helps set up your app at launch time by providing several methods you should override in your SSApplication subclass.

  1. Kindly tell SSApplication about your root view controller, to be added to the main window (SSApplication creates a main application window for you).

    - (UIViewController *) ss_appRootViewController {
    return [[UINavigationController alloc] initWithRootViewController:
    [MyViewController new]];
    }
  2. SSApplication implements application:willFinishLaunchingWithOptions: and passes launch arguments to your app delegate:

    - (void) ss_willFinishLaunchingWithOptions:(NSDictionary *)options {
    // Here I start analytics or other third party services
    }
  3. SSApplication asks if there's any long-running setup to be performed on a background queue.

    - (void) ss_willLaunchBackgroundSetup {
    // This method is called asynchronously// on a background queue.// Here I do long-running setup// that doesn't need to finish immediately
    }

Default NSUserDefaults

A handy way to set up default values in NSUserDefaults. Override ss_defaultUserDefaults and return a dictionary.

Each key in the dictionary you specify is checked against the keys already in NSUserDefaults, and any existing keys will NOT be overwritten. This allows you to specify defaults for user preferences and not overwrite any changes the user has made to those preferences.

It also allows you to introduce new preferences in an app update without having to worry about overwriting values in existing preferences.

- (NSDictionary *) ss_defaultUserDefaults {
return @{
@"A-Preference" : @1337,
@"Another-Pref" : @"Threeve",
};
}

Notifications

The UIApplicationDelegate protocol informs your app delegate of a number of important app events, like moving between the background and foreground.

With SSApplication, several of these delegate calls are collapsed into a single method you can override.

- (void) ss_receivedApplicationEvent:(SSApplicationEvent)eventType { NSLog(@"Event received: %i", eventType);
switch (eventType) {
case SSApplicationEventDidBecomeActive:
case SSApplicationEventWillEnterForeground:
// here I might start up an analytics servicebreak;
case SSApplicationEventDidEnterBackground:
case SSApplicationEventWillResignActive:
// here I might shut down an analytics servicebreak;
case SSApplicationEventWillTerminate:
// here I might clean up core databreak;
case SSApplicationEventDidReceiveMemoryWarning:
// memory warning!break; default:
break;
}
}

Example

Check out Example for an app example.

Thanks!

SSApplication is a @jhersh production -- (electronic mail | @jhersh)

About

A UIApplication subclass to start your app off right.

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

SSApplication

Circle CI

A UIApplication subclass to start your app off right.

SSApplication powers launch setup and app notifications in my app MUDRammer - A Modern MUD Client for iPhone and iPad.

Setup

  1. Install with Cocoapods. Add to your Podfile:

    pod 'SSApplication', :head # YOLO
    

    Or just drag SSApplication.{h,m} into your project.

  2. With SSApplication installed, edit your main app delegate file and subclass SSApplication:

    // MyAppDelegate.h
    #import<SSApplication.h>@interfaceMyAppDelegate : SSApplication@end
  3. You'll need to make a small change in your app's main.m file to tell it about your new principal UIApplication subclass. Add your app delegate's class as the third argument to UIApplicationMain. Your main.m should look something like this:

    // main.m
    #import<UIKit/UIKit.h>
    #import"MyAppDelegate.h"intmain(int argc, char *argv[])
    {
    @autoreleasepool {
    returnUIApplicationMain(argc, argv, NSStringFromClass([MyAppDelegate class]), NSStringFromClass([MyAppDelegate class]));
    }
    }

App Launch

SSApplication helps set up your app at launch time by providing several methods you should override in your SSApplication subclass.

  1. Kindly tell SSApplication about your root view controller, to be added to the main window (SSApplication creates a main application window for you).

    - (UIViewController *) ss_appRootViewController {
    return [[UINavigationController alloc] initWithRootViewController:
    [MyViewController new]];
    }
  2. SSApplication implements application:willFinishLaunchingWithOptions: and passes launch arguments to your app delegate:

    - (void) ss_willFinishLaunchingWithOptions:(NSDictionary *)options {
    // Here I start analytics or other third party services
    }
  3. SSApplication asks if there's any long-running setup to be performed on a background queue.

    - (void) ss_willLaunchBackgroundSetup {
    // This method is called asynchronously// on a background queue.// Here I do long-running setup// that doesn't need to finish immediately
    }

Default NSUserDefaults

A handy way to set up default values in NSUserDefaults. Override ss_defaultUserDefaults and return a dictionary.

Each key in the dictionary you specify is checked against the keys already in NSUserDefaults, and any existing keys will NOT be overwritten. This allows you to specify defaults for user preferences and not overwrite any changes the user has made to those preferences.

It also allows you to introduce new preferences in an app update without having to worry about overwriting values in existing preferences.

- (NSDictionary *) ss_defaultUserDefaults {
return @{
@"A-Preference" : @1337,
@"Another-Pref" : @"Threeve",
};
}

Notifications

The UIApplicationDelegate protocol informs your app delegate of a number of important app events, like moving between the background and foreground.

With SSApplication, several of these delegate calls are collapsed into a single method you can override.

- (void) ss_receivedApplicationEvent:(SSApplicationEvent)eventType { NSLog(@"Event received: %i", eventType);
switch (eventType) {
case SSApplicationEventDidBecomeActive:
case SSApplicationEventWillEnterForeground:
// here I might start up an analytics servicebreak;
case SSApplicationEventDidEnterBackground:
case SSApplicationEventWillResignActive:
// here I might shut down an analytics servicebreak;
case SSApplicationEventWillTerminate:
// here I might clean up core databreak;
case SSApplicationEventDidReceiveMemoryWarning:
// memory warning!break; default:
break;
}
}

Example

Check out Example for an app example.

Thanks!

SSApplication is a @jhersh production -- (electronic mail | @jhersh)

About

A UIApplication subclass to start your app off right.

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SSApplication

Circle CI

A UIApplication subclass to start your app off right.

SSApplication powers launch setup and app notifications in my app MUDRammer - A Modern MUD Client for iPhone and iPad.

Setup

  1. Install with Cocoapods. Add to your Podfile:

    pod 'SSApplication', :head # YOLO
    

    Or just drag SSApplication.{h,m} into your project.

  2. With SSApplication installed, edit your main app delegate file and subclass SSApplication:

    // MyAppDelegate.h
    #import<SSApplication.h>@interfaceMyAppDelegate : SSApplication@end
  3. You'll need to make a small change in your app's main.m file to tell it about your new principal UIApplication subclass. Add your app delegate's class as the third argument to UIApplicationMain. Your main.m should look something like this:

    // main.m
    #import<UIKit/UIKit.h>
    #import"MyAppDelegate.h"intmain(int argc, char *argv[])
    {
    @autoreleasepool {
    returnUIApplicationMain(argc, argv, NSStringFromClass([MyAppDelegate class]), NSStringFromClass([MyAppDelegate class]));
    }
    }

App Launch

SSApplication helps set up your app at launch time by providing several methods you should override in your SSApplication subclass.

  1. Kindly tell SSApplication about your root view controller, to be added to the main window (SSApplication creates a main application window for you).

    - (UIViewController *) ss_appRootViewController {
    return [[UINavigationController alloc] initWithRootViewController:
    [MyViewController new]];
    }
  2. SSApplication implements application:willFinishLaunchingWithOptions: and passes launch arguments to your app delegate:

    - (void) ss_willFinishLaunchingWithOptions:(NSDictionary *)options {
    // Here I start analytics or other third party services
    }
  3. SSApplication asks if there's any long-running setup to be performed on a background queue.

    - (void) ss_willLaunchBackgroundSetup {
    // This method is called asynchronously// on a background queue.// Here I do long-running setup// that doesn't need to finish immediately
    }

Default NSUserDefaults

A handy way to set up default values in NSUserDefaults. Override ss_defaultUserDefaults and return a dictionary.

Each key in the dictionary you specify is checked against the keys already in NSUserDefaults, and any existing keys will NOT be overwritten. This allows you to specify defaults for user preferences and not overwrite any changes the user has made to those preferences.

It also allows you to introduce new preferences in an app update without having to worry about overwriting values in existing preferences.

- (NSDictionary *) ss_defaultUserDefaults {
return @{
@"A-Preference" : @1337,
@"Another-Pref" : @"Threeve",
};
}

Notifications

The UIApplicationDelegate protocol informs your app delegate of a number of important app events, like moving between the background and foreground.

With SSApplication, several of these delegate calls are collapsed into a single method you can override.

- (void) ss_receivedApplicationEvent:(SSApplicationEvent)eventType { NSLog(@"Event received: %i", eventType);
switch (eventType) {
case SSApplicationEventDidBecomeActive:
case SSApplicationEventWillEnterForeground:
// here I might start up an analytics servicebreak;
case SSApplicationEventDidEnterBackground:
case SSApplicationEventWillResignActive:
// here I might shut down an analytics servicebreak;
case SSApplicationEventWillTerminate:
// here I might clean up core databreak;
case SSApplicationEventDidReceiveMemoryWarning:
// memory warning!break; default:
break;
}
}

Example

Check out Example for an app example.

Thanks!

SSApplication is a @jhersh production -- (electronic mail | @jhersh)

About

A UIApplication subclass to start your app off right.

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SSApplication

Circle CI

A UIApplication subclass to start your app off right.

SSApplication powers launch setup and app notifications in my app MUDRammer - A Modern MUD Client for iPhone and iPad.

Setup

  1. Install with Cocoapods. Add to your Podfile:

    pod 'SSApplication', :head # YOLO
    

    Or just drag SSApplication.{h,m} into your project.

  2. With SSApplication installed, edit your main app delegate file and subclass SSApplication:

    // MyAppDelegate.h
    #import<SSApplication.h>@interfaceMyAppDelegate : SSApplication@end
  3. You'll need to make a small change in your app's main.m file to tell it about your new principal UIApplication subclass. Add your app delegate's class as the third argument to UIApplicationMain. Your main.m should look something like this:

    // main.m
    #import<UIKit/UIKit.h>
    #import"MyAppDelegate.h"intmain(int argc, char *argv[])
    {
    @autoreleasepool {
    returnUIApplicationMain(argc, argv, NSStringFromClass([MyAppDelegate class]), NSStringFromClass([MyAppDelegate class]));
    }
    }

App Launch

SSApplication helps set up your app at launch time by providing several methods you should override in your SSApplication subclass.

  1. Kindly tell SSApplication about your root view controller, to be added to the main window (SSApplication creates a main application window for you).

    - (UIViewController *) ss_appRootViewController {
    return [[UINavigationController alloc] initWithRootViewController:
    [MyViewController new]];
    }
  2. SSApplication implements application:willFinishLaunchingWithOptions: and passes launch arguments to your app delegate:

    - (void) ss_willFinishLaunchingWithOptions:(NSDictionary *)options {
    // Here I start analytics or other third party services
    }
  3. SSApplication asks if there's any long-running setup to be performed on a background queue.

    - (void) ss_willLaunchBackgroundSetup {
    // This method is called asynchronously// on a background queue.// Here I do long-running setup// that doesn't need to finish immediately
    }

Default NSUserDefaults

A handy way to set up default values in NSUserDefaults. Override ss_defaultUserDefaults and return a dictionary.

Each key in the dictionary you specify is checked against the keys already in NSUserDefaults, and any existing keys will NOT be overwritten. This allows you to specify defaults for user preferences and not overwrite any changes the user has made to those preferences.

It also allows you to introduce new preferences in an app update without having to worry about overwriting values in existing preferences.

- (NSDictionary *) ss_defaultUserDefaults {
return @{
@"A-Preference" : @1337,
@"Another-Pref" : @"Threeve",
};
}

Notifications

The UIApplicationDelegate protocol informs your app delegate of a number of important app events, like moving between the background and foreground.

With SSApplication, several of these delegate calls are collapsed into a single method you can override.

- (void) ss_receivedApplicationEvent:(SSApplicationEvent)eventType { NSLog(@"Event received: %i", eventType);
switch (eventType) {
case SSApplicationEventDidBecomeActive:
case SSApplicationEventWillEnterForeground:
// here I might start up an analytics servicebreak;
case SSApplicationEventDidEnterBackground:
case SSApplicationEventWillResignActive:
// here I might shut down an analytics servicebreak;
case SSApplicationEventWillTerminate:
// here I might clean up core databreak;
case SSApplicationEventDidReceiveMemoryWarning:
// memory warning!break; default:
break;
}
}

Example

Check out Example for an app example.

Thanks!

SSApplication is a @jhersh production -- (electronic mail | @jhersh)

About

A UIApplication subclass to start your app off right.

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

SSApplication

Circle CI

A UIApplication subclass to start your app off right.

SSApplication powers launch setup and app notifications in my app MUDRammer - A Modern MUD Client for iPhone and iPad.

Setup

  1. Install with Cocoapods. Add to your Podfile:

    pod 'SSApplication', :head # YOLO
    

    Or just drag SSApplication.{h,m} into your project.

  2. With SSApplication installed, edit your main app delegate file and subclass SSApplication:

    // MyAppDelegate.h
    #import<SSApplication.h>@interfaceMyAppDelegate : SSApplication@end
  3. You'll need to make a small change in your app's main.m file to tell it about your new principal UIApplication subclass. Add your app delegate's class as the third argument to UIApplicationMain. Your main.m should look something like this:

    // main.m
    #import<UIKit/UIKit.h>
    #import"MyAppDelegate.h"intmain(int argc, char *argv[])
    {
    @autoreleasepool {
    returnUIApplicationMain(argc, argv, NSStringFromClass([MyAppDelegate class]), NSStringFromClass([MyAppDelegate class]));
    }
    }

App Launch

SSApplication helps set up your app at launch time by providing several methods you should override in your SSApplication subclass.

  1. Kindly tell SSApplication about your root view controller, to be added to the main window (SSApplication creates a main application window for you).

    - (UIViewController *) ss_appRootViewController {
    return [[UINavigationController alloc] initWithRootViewController:
    [MyViewController new]];
    }
  2. SSApplication implements application:willFinishLaunchingWithOptions: and passes launch arguments to your app delegate:

    - (void) ss_willFinishLaunchingWithOptions:(NSDictionary *)options {
    // Here I start analytics or other third party services
    }
  3. SSApplication asks if there's any long-running setup to be performed on a background queue.

    - (void) ss_willLaunchBackgroundSetup {
    // This method is called asynchronously// on a background queue.// Here I do long-running setup// that doesn't need to finish immediately
    }

Default NSUserDefaults

A handy way to set up default values in NSUserDefaults. Override ss_defaultUserDefaults and return a dictionary.

Each key in the dictionary you specify is checked against the keys already in NSUserDefaults, and any existing keys will NOT be overwritten. This allows you to specify defaults for user preferences and not overwrite any changes the user has made to those preferences.

It also allows you to introduce new preferences in an app update without having to worry about overwriting values in existing preferences.

- (NSDictionary *) ss_defaultUserDefaults {
return @{
@"A-Preference" : @1337,
@"Another-Pref" : @"Threeve",
};
}

Notifications

The UIApplicationDelegate protocol informs your app delegate of a number of important app events, like moving between the background and foreground.

With SSApplication, several of these delegate calls are collapsed into a single method you can override.

- (void) ss_receivedApplicationEvent:(SSApplicationEvent)eventType { NSLog(@"Event received: %i", eventType);
switch (eventType) {
case SSApplicationEventDidBecomeActive:
case SSApplicationEventWillEnterForeground:
// here I might start up an analytics servicebreak;
case SSApplicationEventDidEnterBackground:
case SSApplicationEventWillResignActive:
// here I might shut down an analytics servicebreak;
case SSApplicationEventWillTerminate:
// here I might clean up core databreak;
case SSApplicationEventDidReceiveMemoryWarning:
// memory warning!break; default:
break;
}
}

Example

Check out Example for an app example.

Thanks!

SSApplication is a @jhersh production -- (electronic mail | @jhersh)

About

A UIApplication subclass to start your app off right.

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SSApplication

Circle CI

A UIApplication subclass to start your app off right.

SSApplication powers launch setup and app notifications in my app MUDRammer - A Modern MUD Client for iPhone and iPad.

Setup

  1. Install with Cocoapods. Add to your Podfile:

    pod 'SSApplication', :head # YOLO
    

    Or just drag SSApplication.{h,m} into your project.

  2. With SSApplication installed, edit your main app delegate file and subclass SSApplication:

    // MyAppDelegate.h
    #import<SSApplication.h>@interfaceMyAppDelegate : SSApplication@end
  3. You'll need to make a small change in your app's main.m file to tell it about your new principal UIApplication subclass. Add your app delegate's class as the third argument to UIApplicationMain. Your main.m should look something like this:

    // main.m
    #import<UIKit/UIKit.h>
    #import"MyAppDelegate.h"intmain(int argc, char *argv[])
    {
    @autoreleasepool {
    returnUIApplicationMain(argc, argv, NSStringFromClass([MyAppDelegate class]), NSStringFromClass([MyAppDelegate class]));
    }
    }

App Launch

SSApplication helps set up your app at launch time by providing several methods you should override in your SSApplication subclass.

  1. Kindly tell SSApplication about your root view controller, to be added to the main window (SSApplication creates a main application window for you).

    - (UIViewController *) ss_appRootViewController {
    return [[UINavigationController alloc] initWithRootViewController:
    [MyViewController new]];
    }
  2. SSApplication implements application:willFinishLaunchingWithOptions: and passes launch arguments to your app delegate:

    - (void) ss_willFinishLaunchingWithOptions:(NSDictionary *)options {
    // Here I start analytics or other third party services
    }
  3. SSApplication asks if there's any long-running setup to be performed on a background queue.

    - (void) ss_willLaunchBackgroundSetup {
    // This method is called asynchronously// on a background queue.// Here I do long-running setup// that doesn't need to finish immediately
    }

Default NSUserDefaults

A handy way to set up default values in NSUserDefaults. Override ss_defaultUserDefaults and return a dictionary.

Each key in the dictionary you specify is checked against the keys already in NSUserDefaults, and any existing keys will NOT be overwritten. This allows you to specify defaults for user preferences and not overwrite any changes the user has made to those preferences.

It also allows you to introduce new preferences in an app update without having to worry about overwriting values in existing preferences.

- (NSDictionary *) ss_defaultUserDefaults {
return @{
@"A-Preference" : @1337,
@"Another-Pref" : @"Threeve",
};
}

Notifications

The UIApplicationDelegate protocol informs your app delegate of a number of important app events, like moving between the background and foreground.

With SSApplication, several of these delegate calls are collapsed into a single method you can override.

- (void) ss_receivedApplicationEvent:(SSApplicationEvent)eventType { NSLog(@"Event received: %i", eventType);
switch (eventType) {
case SSApplicationEventDidBecomeActive:
case SSApplicationEventWillEnterForeground:
// here I might start up an analytics servicebreak;
case SSApplicationEventDidEnterBackground:
case SSApplicationEventWillResignActive:
// here I might shut down an analytics servicebreak;
case SSApplicationEventWillTerminate:
// here I might clean up core databreak;
case SSApplicationEventDidReceiveMemoryWarning:
// memory warning!break; default:
break;
}
}

Example

Check out Example for an app example.

Thanks!

SSApplication is a @jhersh production -- (electronic mail | @jhersh)

About

A UIApplication subclass to start your app off right.

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SSApplication

Circle CI

A UIApplication subclass to start your app off right.

SSApplication powers launch setup and app notifications in my app MUDRammer - A Modern MUD Client for iPhone and iPad.

Setup

  1. Install with Cocoapods. Add to your Podfile:

    pod 'SSApplication', :head # YOLO
    

    Or just drag SSApplication.{h,m} into your project.

  2. With SSApplication installed, edit your main app delegate file and subclass SSApplication:

    // MyAppDelegate.h
    #import<SSApplication.h>@interfaceMyAppDelegate : SSApplication@end
  3. You'll need to make a small change in your app's main.m file to tell it about your new principal UIApplication subclass. Add your app delegate's class as the third argument to UIApplicationMain. Your main.m should look something like this:

    // main.m
    #import<UIKit/UIKit.h>
    #import"MyAppDelegate.h"intmain(int argc, char *argv[])
    {
    @autoreleasepool {
    returnUIApplicationMain(argc, argv, NSStringFromClass([MyAppDelegate class]), NSStringFromClass([MyAppDelegate class]));
    }
    }

App Launch

SSApplication helps set up your app at launch time by providing several methods you should override in your SSApplication subclass.

  1. Kindly tell SSApplication about your root view controller, to be added to the main window (SSApplication creates a main application window for you).

    - (UIViewController *) ss_appRootViewController {
    return [[UINavigationController alloc] initWithRootViewController:
    [MyViewController new]];
    }
  2. SSApplication implements application:willFinishLaunchingWithOptions: and passes launch arguments to your app delegate:

    - (void) ss_willFinishLaunchingWithOptions:(NSDictionary *)options {
    // Here I start analytics or other third party services
    }
  3. SSApplication asks if there's any long-running setup to be performed on a background queue.

    - (void) ss_willLaunchBackgroundSetup {
    // This method is called asynchronously// on a background queue.// Here I do long-running setup// that doesn't need to finish immediately
    }

Default NSUserDefaults

A handy way to set up default values in NSUserDefaults. Override ss_defaultUserDefaults and return a dictionary.

Each key in the dictionary you specify is checked against the keys already in NSUserDefaults, and any existing keys will NOT be overwritten. This allows you to specify defaults for user preferences and not overwrite any changes the user has made to those preferences.

It also allows you to introduce new preferences in an app update without having to worry about overwriting values in existing preferences.

- (NSDictionary *) ss_defaultUserDefaults {
return @{
@"A-Preference" : @1337,
@"Another-Pref" : @"Threeve",
};
}

Notifications

The UIApplicationDelegate protocol informs your app delegate of a number of important app events, like moving between the background and foreground.

With SSApplication, several of these delegate calls are collapsed into a single method you can override.

- (void) ss_receivedApplicationEvent:(SSApplicationEvent)eventType { NSLog(@"Event received: %i", eventType);
switch (eventType) {
case SSApplicationEventDidBecomeActive:
case SSApplicationEventWillEnterForeground:
// here I might start up an analytics servicebreak;
case SSApplicationEventDidEnterBackground:
case SSApplicationEventWillResignActive:
// here I might shut down an analytics servicebreak;
case SSApplicationEventWillTerminate:
// here I might clean up core databreak;
case SSApplicationEventDidReceiveMemoryWarning:
// memory warning!break; default:
break;
}
}

Example

Check out Example for an app example.

Thanks!

SSApplication is a @jhersh production -- (electronic mail | @jhersh)

About

A UIApplication subclass to start your app off right.

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

SSApplication

Circle CI

A UIApplication subclass to start your app off right.

SSApplication powers launch setup and app notifications in my app MUDRammer - A Modern MUD Client for iPhone and iPad.

Setup

  1. Install with Cocoapods. Add to your Podfile:

    pod 'SSApplication', :head # YOLO
    

    Or just drag SSApplication.{h,m} into your project.

  2. With SSApplication installed, edit your main app delegate file and subclass SSApplication:

    // MyAppDelegate.h
    #import<SSApplication.h>@interfaceMyAppDelegate : SSApplication@end
  3. You'll need to make a small change in your app's main.m file to tell it about your new principal UIApplication subclass. Add your app delegate's class as the third argument to UIApplicationMain. Your main.m should look something like this:

    // main.m
    #import<UIKit/UIKit.h>
    #import"MyAppDelegate.h"intmain(int argc, char *argv[])
    {
    @autoreleasepool {
    returnUIApplicationMain(argc, argv, NSStringFromClass([MyAppDelegate class]), NSStringFromClass([MyAppDelegate class]));
    }
    }

App Launch

SSApplication helps set up your app at launch time by providing several methods you should override in your SSApplication subclass.

  1. Kindly tell SSApplication about your root view controller, to be added to the main window (SSApplication creates a main application window for you).

    - (UIViewController *) ss_appRootViewController {
    return [[UINavigationController alloc] initWithRootViewController:
    [MyViewController new]];
    }
  2. SSApplication implements application:willFinishLaunchingWithOptions: and passes launch arguments to your app delegate:

    - (void) ss_willFinishLaunchingWithOptions:(NSDictionary *)options {
    // Here I start analytics or other third party services
    }
  3. SSApplication asks if there's any long-running setup to be performed on a background queue.

    - (void) ss_willLaunchBackgroundSetup {
    // This method is called asynchronously// on a background queue.// Here I do long-running setup// that doesn't need to finish immediately
    }

Default NSUserDefaults

A handy way to set up default values in NSUserDefaults. Override ss_defaultUserDefaults and return a dictionary.

Each key in the dictionary you specify is checked against the keys already in NSUserDefaults, and any existing keys will NOT be overwritten. This allows you to specify defaults for user preferences and not overwrite any changes the user has made to those preferences.

It also allows you to introduce new preferences in an app update without having to worry about overwriting values in existing preferences.

- (NSDictionary *) ss_defaultUserDefaults {
return @{
@"A-Preference" : @1337,
@"Another-Pref" : @"Threeve",
};
}

Notifications

The UIApplicationDelegate protocol informs your app delegate of a number of important app events, like moving between the background and foreground.

With SSApplication, several of these delegate calls are collapsed into a single method you can override.

- (void) ss_receivedApplicationEvent:(SSApplicationEvent)eventType { NSLog(@"Event received: %i", eventType);
switch (eventType) {
case SSApplicationEventDidBecomeActive:
case SSApplicationEventWillEnterForeground:
// here I might start up an analytics servicebreak;
case SSApplicationEventDidEnterBackground:
case SSApplicationEventWillResignActive:
// here I might shut down an analytics servicebreak;
case SSApplicationEventWillTerminate:
// here I might clean up core databreak;
case SSApplicationEventDidReceiveMemoryWarning:
// memory warning!break; default:
break;
}
}

Example

Check out Example for an app example.

Thanks!

SSApplication is a @jhersh production -- (electronic mail | @jhersh)

About

A UIApplication subclass to start your app off right.

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages