Skip to content

Instantly share code, notes, and snippets.

@alloy
Last active October 17, 2021 04:31
Show Gist options
  • 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
@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