Skip to content

Instantly share code, notes, and snippets.

@alloy
Last active October 17, 2021 04:31
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save alloy/9277316 to your computer and use it in GitHub Desktop.
Save alloy/9277316 to your computer and use it in GitHub Desktop.
(If you too like to live dangerously) this will get rid of the following error message when running on the iOS Simulator: `Cannot find executable for CFBundle <CertUIFramework.axbundle>`
// When the `accessibility inspector' is enabled on the iOS Simulator the private `UIAccessibility'
// framework is loaded. In turn it will try to load a list of bundles amongst which is one that has
// only resources, no executable. This leads to `CFBundleLoadExecutableAndReturnError' logging this
// offending error message.
//
// This code omits the `SDK_ROOT/System/Library/AccessibilityBundles/CertUIFramework.axbundle'
// bundle from ever being attempted to load.
//
// This code is available under the MIT license: http://opensource.org/licenses/MIT
//
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <dlfcn.h>
#define ACCESSIBILITY_PATH @"/System/Library/PrivateFrameworks/UIAccessibility.framework"
#define APP_SUPPORT_PATH @"/System/Library/PrivateFrameworks/AppSupport.framework/AppSupport"
#define COPY_PREFS_NAME "CPCopySharedResourcesPreferencesDomainForDomain"
typedef CFStringRef (*CopyAppSupportPrefs)(CFStringRef);
@interface UIAccessibilityLoader : NSObject
// STFU compiler.
- (void)loadActualAccessibilityBundle:(NSBundle *)bundle
didLoad:(BOOL *)didLoad
loadSubbundles:(BOOL)loadSubbundles;
@end
@interface STFU_UIAccessibilityLoader : NSObject
@end
@implementation STFU_UIAccessibilityLoader
static Boolean
IsAccessibilityEnabled(NSString *sdkRoot)
{
NSString *frameworkPath = [sdkRoot stringByAppendingPathComponent:APP_SUPPORT_PATH];
void *appSupport = dlopen([frameworkPath fileSystemRepresentation], RTLD_LAZY);
CopyAppSupportPrefs CopyPrefs = (CopyAppSupportPrefs)dlsym(appSupport, COPY_PREFS_NAME);
if (CopyPrefs != NULL) {
CFStringRef accessibilityDomain = CopyPrefs(CFSTR("com.apple.Accessibility"));
if (accessibilityDomain != NULL) {
Boolean enabled = CFPreferencesGetAppBooleanValue(CFSTR("ApplicationAccessibilityEnabled"),
accessibilityDomain, NULL);
CFRelease(accessibilityDomain);
return enabled;
}
}
return false;
}
static BOOL
LoadAccessibilityFramework(NSString *sdkRoot)
{
NSString *frameworkPath = [sdkRoot stringByAppendingPathComponent:ACCESSIBILITY_PATH];
NSBundle *bundle = [NSBundle bundleWithPath:frameworkPath];
return [bundle load];
}
- (void)STFU_loadActualAccessibilityBundle:(NSBundle *)bundle
didLoad:(BOOL *)didLoad
loadSubbundles:(BOOL)loadSubbundles;
{
if (bundle.executablePath == nil) {
// No need to actually load this bundle which only contains localized resources.
*didLoad = YES;
} else {
[self STFU_loadActualAccessibilityBundle:bundle
didLoad:didLoad
loadSubbundles:loadSubbundles];
}
}
+ (void)load;
{
char *sdkPath = getenv("IPHONE_SIMULATOR_ROOT");
if (sdkPath != NULL) {
@autoreleasepool {
NSString *sdkRoot = [NSString stringWithUTF8String:sdkPath];
if (IsAccessibilityEnabled(sdkRoot) && LoadAccessibilityFramework(sdkRoot)) {
Class loader = object_getClass(objc_getClass("UIAccessibilityLoader"));
SEL originalSel = @selector(loadActualAccessibilityBundle:didLoad:loadSubbundles:);
SEL swizzledSel = @selector(STFU_loadActualAccessibilityBundle:didLoad:loadSubbundles:);
Method originalMethod = class_getInstanceMethod(loader, originalSel);
Method swizzledMethod = class_getInstanceMethod(self, swizzledSel);
if (originalMethod != NULL && swizzledMethod != NULL) {
if (class_addMethod(loader,
swizzledSel,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod))) {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
}
}
}
}
@end
@tianyouhui
Copy link

Sorry, but how to make and use this file?

@alloy
Copy link
Author

alloy commented May 16, 2014

@tianyouhui Sorry about that, gists don’t deliver notifications for comments :-/ You only need to include this source file in your project, it will automatically do its work from +[STFU_UIAccessibilityLoader load].

@roywang2011
Copy link

I included this file in my project,but i got a error: can't find this file.I still puzzled about how to use and make this file.

@janck001
Copy link

@RoyWangChina , I met the same problem, but has been resolved, is to directly add STFU_UIAccessibilityLoader.m files to the project can be

@Royvonne
Copy link

hi~ i met this problem in xcode6.3, my app run in ios8 is perfect, but in ios7 it would crash!! can u help me? thanks~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment