mirror of https://github.com/oxen-io/session-ios
Merge branch 'mkirk/ios9-crash' into release/2.37.2
commit
cadb9ea9a1
@ -0,0 +1,85 @@
|
|||||||
|
//
|
||||||
|
// 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
|
Loading…
Reference in New Issue