From 409426d105649aea09f236053d5f203bbaed5f7a Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Sat, 30 Mar 2019 07:58:58 -0600 Subject: [PATCH] work around swift4.2 AudioSession API bug --- Signal.xcodeproj/project.pbxproj | 6 +++++ Signal/src/Signal-Bridging-Header.h | 1 + Signal/src/call/CallAudioService.swift | 3 +-- .../util/UI Categories/AVAudioSession+OWS.h | 22 +++++++++++++++++++ .../util/UI Categories/AVAudioSession+OWS.m | 15 +++++++++++++ 5 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 Signal/src/util/UI Categories/AVAudioSession+OWS.h create mode 100644 Signal/src/util/UI Categories/AVAudioSession+OWS.m diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index c0ec82a9b..7b8e73007 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -488,6 +488,7 @@ 4C4BC6C32102D697004040C9 /* ContactDiscoveryOperationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4BC6C22102D697004040C9 /* ContactDiscoveryOperationTest.swift */; }; 4C5250D221E7BD7D00CE3D95 /* PhoneNumberValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5250D121E7BD7D00CE3D95 /* PhoneNumberValidator.swift */; }; 4C5250D421E7C51900CE3D95 /* PhoneNumberValidatorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5250D321E7C51900CE3D95 /* PhoneNumberValidatorTest.swift */; }; + 4C586926224FAB83003FD070 /* AVAudioSession+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C586925224FAB83003FD070 /* AVAudioSession+OWS.m */; }; 4C618199219DF03A009BD6B5 /* OWSButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C618198219DF03A009BD6B5 /* OWSButton.swift */; }; 4C61819F219E1796009BD6B5 /* typing-animation-dark.gif in Resources */ = {isa = PBXBuildFile; fileRef = 4C61819E219E1795009BD6B5 /* typing-animation-dark.gif */; }; 4C63CC00210A620B003AE45C /* SignalTSan.supp in Resources */ = {isa = PBXBuildFile; fileRef = 4C63CBFF210A620B003AE45C /* SignalTSan.supp */; }; @@ -1239,6 +1240,8 @@ 4C4BC6C22102D697004040C9 /* ContactDiscoveryOperationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ContactDiscoveryOperationTest.swift; path = contact/ContactDiscoveryOperationTest.swift; sourceTree = ""; }; 4C5250D121E7BD7D00CE3D95 /* PhoneNumberValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneNumberValidator.swift; sourceTree = ""; }; 4C5250D321E7C51900CE3D95 /* PhoneNumberValidatorTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneNumberValidatorTest.swift; sourceTree = ""; }; + 4C586924224FAB83003FD070 /* AVAudioSession+OWS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "AVAudioSession+OWS.h"; path = "util/UI Categories/AVAudioSession+OWS.h"; sourceTree = ""; }; + 4C586925224FAB83003FD070 /* AVAudioSession+OWS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "AVAudioSession+OWS.m"; path = "util/UI Categories/AVAudioSession+OWS.m"; sourceTree = ""; }; 4C618198219DF03A009BD6B5 /* OWSButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWSButton.swift; sourceTree = ""; }; 4C61819E219E1795009BD6B5 /* typing-animation-dark.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "typing-animation-dark.gif"; sourceTree = ""; }; 4C63CBFF210A620B003AE45C /* SignalTSan.supp */ = {isa = PBXFileReference; lastKnownFileType = text; path = SignalTSan.supp; sourceTree = ""; }; @@ -2692,6 +2695,8 @@ EF764C331DB67CC5000D9A87 /* UIViewController+Permissions.h */, EF764C341DB67CC5000D9A87 /* UIViewController+Permissions.m */, 45B5360D206DD8BB00D61655 /* UIResponder+OWS.swift */, + 4C586924224FAB83003FD070 /* AVAudioSession+OWS.h */, + 4C586925224FAB83003FD070 /* AVAudioSession+OWS.m */, ); name = "UI Categories"; path = ..; @@ -3661,6 +3666,7 @@ 4517642B1DE939FD00EDB8B9 /* ContactCell.swift in Sources */, 34EA69402194933900702471 /* MediaDownloadView.swift in Sources */, 340FC8AB204DAC8D007AEB0F /* DomainFrontingCountryViewController.m in Sources */, + 4C586926224FAB83003FD070 /* AVAudioSession+OWS.m in Sources */, 3496744D2076768700080B5F /* OWSMessageBubbleView.m in Sources */, 34B3F8751E8DF1700035BE1A /* CallViewController.swift in Sources */, 4C4AE6A1224AF35700D4AF6F /* SendMediaNavigationController.swift in Sources */, diff --git a/Signal/src/Signal-Bridging-Header.h b/Signal/src/Signal-Bridging-Header.h index fd0a20bb9..2c47e9850 100644 --- a/Signal/src/Signal-Bridging-Header.h +++ b/Signal/src/Signal-Bridging-Header.h @@ -6,6 +6,7 @@ #import // Separate iOS Frameworks from other imports. +#import "AVAudioSession+OWS.h" #import "AppSettingsViewController.h" #import "AttachmentUploadView.h" #import "AvatarViewHelper.h" diff --git a/Signal/src/call/CallAudioService.swift b/Signal/src/call/CallAudioService.swift index e27f09056..87c09e878 100644 --- a/Signal/src/call/CallAudioService.swift +++ b/Signal/src/call/CallAudioService.swift @@ -534,8 +534,7 @@ protocol CallAudioServiceDelegate: class { if oldOptions != options { Logger.debug("audio session changed options: \(oldOptions) -> \(options) ") } - try avAudioSession.setCategory(category, with: options) - + try avAudioSession.ows_setCategory(category, with: options) } } catch { let message = "failed to set category: \(category) mode: \(String(describing: mode)), options: \(options) with error: \(error)" diff --git a/Signal/src/util/UI Categories/AVAudioSession+OWS.h b/Signal/src/util/UI Categories/AVAudioSession+OWS.h new file mode 100644 index 000000000..1e8f7483b --- /dev/null +++ b/Signal/src/util/UI Categories/AVAudioSession+OWS.h @@ -0,0 +1,22 @@ +// +// Copyright (c) 2019 Open Whisper Systems. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface AVAudioSession (OWS) + +// #RADAR 45397675 http://www.openradar.me/45397675 +// +// A bug in Swift 4.2+ made `AVAudioSession#setCategory:categorywithOptions:error` not accessible +// to Swift. +// +// It's still available via ObjC, so we have an objc-category method which we can call from Swift +// which just calls the original `AVAudioSession#setCategory:categorywithOptions:error` method. +- (BOOL)ows_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError API_AVAILABLE(ios(6.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/src/util/UI Categories/AVAudioSession+OWS.m b/Signal/src/util/UI Categories/AVAudioSession+OWS.m new file mode 100644 index 000000000..2c73b0d92 --- /dev/null +++ b/Signal/src/util/UI Categories/AVAudioSession+OWS.m @@ -0,0 +1,15 @@ +// +// Copyright (c) 2019 Open Whisper Systems. All rights reserved. +// + +#import "AVAudioSession+OWS.h" + +@implementation AVAudioSession(OWS) + + +- (BOOL)ows_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError API_AVAILABLE(ios(6.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos) +{ + return [self setCategory:category withOptions:options error:outError]; +} + +@end