mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			86 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Objective-C
		
	
			
		
		
	
	
			86 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Objective-C
		
	
//
 | 
						|
//  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
 | 
						|
//
 | 
						|
 | 
						|
#import <objc/runtime.h>
 | 
						|
 | 
						|
@implementation UIAlertController (iOS9)
 | 
						|
 | 
						|
+ (void)load {
 | 
						|
    static dispatch_once_t onceToken;
 | 
						|
    dispatch_once(&onceToken, ^{
 | 
						|
        // On iOS9, avoids an exception when presenting an alert controller.
 | 
						|
        //
 | 
						|
        // *** Assertion failure in -[UIAlertController supportedInterfaceOrientations], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.30.14/UIAlertController.m:542
 | 
						|
        // Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIAlertController:supportedInterfaceOrientations was invoked recursively!'
 | 
						|
        //
 | 
						|
        // I'm not sure when this was introduced, or the exact root casue, but this quick workaround
 | 
						|
        // seems reasonable given the small size of our iOS9 userbase.
 | 
						|
        if (@available(iOS 10, *)) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        Class class = [self class];
 | 
						|
 | 
						|
        // supportedInterfaceOrientation
 | 
						|
 | 
						|
        SEL originalOrientationSelector = @selector(supportedInterfaceOrientations);
 | 
						|
        SEL swizzledOrientationSelector = @selector(ows_iOS9Alerts_swizzle_supportedInterfaceOrientation);
 | 
						|
 | 
						|
        Method originalOrientationMethod = class_getInstanceMethod(class, originalOrientationSelector);
 | 
						|
        Method swizzledOrientationMethod = class_getInstanceMethod(class, swizzledOrientationSelector);
 | 
						|
 | 
						|
        BOOL didAddOrientationMethod = class_addMethod(class,
 | 
						|
                                            originalOrientationSelector,
 | 
						|
                                            method_getImplementation(swizzledOrientationMethod),
 | 
						|
                                            method_getTypeEncoding(swizzledOrientationMethod));
 | 
						|
 | 
						|
        if (didAddOrientationMethod) {
 | 
						|
            class_replaceMethod(class,
 | 
						|
                                swizzledOrientationSelector,
 | 
						|
                                method_getImplementation(originalOrientationMethod),
 | 
						|
                                method_getTypeEncoding(originalOrientationMethod));
 | 
						|
        } else {
 | 
						|
            method_exchangeImplementations(originalOrientationMethod, swizzledOrientationMethod);
 | 
						|
        }
 | 
						|
 | 
						|
        // shouldAutorotate
 | 
						|
 | 
						|
        SEL originalAutorotateSelector = @selector(shouldAutorotate);
 | 
						|
        SEL swizzledAutorotateSelector = @selector(ows_iOS9Alerts_swizzle_shouldAutorotate);
 | 
						|
 | 
						|
        Method originalAutorotateMethod = class_getInstanceMethod(class, originalAutorotateSelector);
 | 
						|
        Method swizzledAutorotateMethod = class_getInstanceMethod(class, swizzledAutorotateSelector);
 | 
						|
 | 
						|
        BOOL didAddAutorotateMethod = class_addMethod(class,
 | 
						|
                                                       originalAutorotateSelector,
 | 
						|
                                                       method_getImplementation(swizzledAutorotateMethod),
 | 
						|
                                                       method_getTypeEncoding(swizzledAutorotateMethod));
 | 
						|
 | 
						|
        if (didAddAutorotateMethod) {
 | 
						|
            class_replaceMethod(class,
 | 
						|
                                swizzledAutorotateSelector,
 | 
						|
                                method_getImplementation(originalAutorotateMethod),
 | 
						|
                                method_getTypeEncoding(originalAutorotateMethod));
 | 
						|
        } else {
 | 
						|
            method_exchangeImplementations(originalAutorotateMethod, swizzledAutorotateMethod);
 | 
						|
        }
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
#pragma mark - Method Swizzling
 | 
						|
 | 
						|
- (UIInterfaceOrientationMask)ows_iOS9Alerts_swizzle_supportedInterfaceOrientation
 | 
						|
{
 | 
						|
    OWSLogInfo(@"swizzled");
 | 
						|
    return UIInterfaceOrientationMaskAllButUpsideDown;
 | 
						|
}
 | 
						|
 | 
						|
- (BOOL)ows_iOS9Alerts_swizzle_shouldAutorotate
 | 
						|
{
 | 
						|
    OWSLogInfo(@"swizzled");
 | 
						|
    return NO;
 | 
						|
}
 | 
						|
 | 
						|
@end
 |