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
 |