diff --git a/Tusker.xcodeproj/project.pbxproj b/Tusker.xcodeproj/project.pbxproj index 90e6d83c..df932201 100644 --- a/Tusker.xcodeproj/project.pbxproj +++ b/Tusker.xcodeproj/project.pbxproj @@ -596,6 +596,7 @@ D667E5F72135C3040057A976 /* Mastodon+Equatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Mastodon+Equatable.swift"; sourceTree = ""; }; D66A77BA233838DC0058F1EC /* UIFont+Traits.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+Traits.swift"; sourceTree = ""; }; D66C900A28DAB7FD00217BF2 /* TimelineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineViewController.swift; sourceTree = ""; }; + D671A6BE299DA96100A81FEA /* Tusker-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tusker-Bridging-Header.h"; sourceTree = ""; }; D673ACCD2919E74200D6F8B0 /* MenuPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuPicker.swift; sourceTree = ""; }; D674A50727F910F300BA03AC /* Pachyderm */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Pachyderm; path = Packages/Pachyderm; sourceTree = ""; }; D677284724ECBCB100C732D3 /* ComposeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeView.swift; sourceTree = ""; }; @@ -1551,6 +1552,7 @@ D640D76822BAF5E6004FBE69 /* DomainBlocks.plist */, D6D4DDDB212518A200E1C4BB /* Info.plist */, D60088F02980D938005B4D00 /* Tusker.storekit */, + D671A6BE299DA96100A81FEA /* Tusker-Bridging-Header.h */, D6D4DDCF212518A000E1C4BB /* AppDelegate.swift */, D6CA6A91249FAD8900AD45C1 /* AudioSessionHelper.swift */, D61F75B6293C119700C0B37F /* Filterer.swift */, @@ -1800,7 +1802,7 @@ TargetAttributes = { D6D4DDCB212518A000E1C4BB = { CreatedOnToolsVersion = 10.0; - LastSwiftMigration = 1410; + LastSwiftMigration = 1420; }; D6D4DDDF212518A200E1C4BB = { CreatedOnToolsVersion = 10.0; @@ -2421,6 +2423,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Tusker/Tusker.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; @@ -2437,6 +2440,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).Tusker"; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; + SWIFT_OBJC_BRIDGING_HEADER = "Tusker/Tusker-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,6"; }; @@ -2637,6 +2641,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Tusker/Tusker.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; @@ -2655,6 +2660,8 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OBJC_BRIDGING_HEADER = "Tusker/Tusker-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,6"; }; @@ -2665,6 +2672,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Tusker/Tusker.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; @@ -2681,6 +2689,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_ID_PREFIX).Tusker"; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; + SWIFT_OBJC_BRIDGING_HEADER = "Tusker/Tusker-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,6"; }; diff --git a/Tusker/AppDelegate.swift b/Tusker/AppDelegate.swift index 136f3742..a7700a2d 100644 --- a/Tusker/AppDelegate.swift +++ b/Tusker/AppDelegate.swift @@ -137,17 +137,19 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var originalIMP: IMP? let imp = imp_implementationWithBlock({ (self: UIStatusBarManager, sender: AnyObject) in let original = unsafeBitCast(originalIMP!, to: (@convention(c) (UIStatusBarManager, Selector, AnyObject) -> Void).self) - guard let windowScene = self.perform(Selector(("windowScene"))).takeUnretainedValue() as? UIWindowScene, - let xPosition = sender.value(forKey: "xPosition") as? CGFloat, - let delegate = windowScene.delegate as? TuskerSceneDelegate else { - original(self, selector, sender) - return - } - switch delegate.handleStatusBarTapped(xPosition: xPosition) { - case .stop: - return - case .continue: - original(self, selector, sender) + let exception = catchNSException { + guard let windowScene = self.perform(Selector(("windowScene"))).takeUnretainedValue() as? UIWindowScene, + let xPosition = sender.value(forKey: "xPosition") as? CGFloat, + let delegate = windowScene.delegate as? TuskerSceneDelegate else { + original(self, selector, sender) + return + } + switch delegate.handleStatusBarTapped(xPosition: xPosition) { + case .stop: + return + case .continue: + original(self, selector, sender) + } } } as @convention(block) (UIStatusBarManager, AnyObject) -> Void) originalIMP = class_replaceMethod(UIStatusBarManager.self, selector, imp, "v@:@") diff --git a/Tusker/Scenes/TuskerSceneDelegate.swift b/Tusker/Scenes/TuskerSceneDelegate.swift index bbce571e..6067109a 100644 --- a/Tusker/Scenes/TuskerSceneDelegate.swift +++ b/Tusker/Scenes/TuskerSceneDelegate.swift @@ -31,9 +31,11 @@ extension TuskerSceneDelegate { guard let window else { return } window.overrideUserInterfaceStyle = Preferences.shared.theme window.tintColor = Preferences.shared.accentColor.color - let key = ["Controller", "Presentation", "root", "_"].reversed().joined() - if let rootPresentationController = window.value(forKey: key) as? UIPresentationController { - rootPresentationController.overrideTraitCollection = UITraitCollection(pureBlackDarkMode: Preferences.shared.pureBlackDarkMode) + _ = catchNSException { + let key = ["Controller", "Presentation", "root", "_"].reversed().joined() + if let rootPresentationController = window.value(forKey: key) as? UIPresentationController { + rootPresentationController.overrideTraitCollection = UITraitCollection(pureBlackDarkMode: Preferences.shared.pureBlackDarkMode) + } } } } diff --git a/Tusker/Tusker-Bridging-Header.h b/Tusker/Tusker-Bridging-Header.h new file mode 100644 index 00000000..e7a39655 --- /dev/null +++ b/Tusker/Tusker-Bridging-Header.h @@ -0,0 +1,15 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import + +NS_INLINE NSException * _Nullable catchNSException(void(^_Nonnull tryBlock)(void)) { + @try { + tryBlock(); + } + @catch (NSException *exception) { + return exception; + } + return nil; +}