From bed4f76296974e3c41481892373a08245602f254 Mon Sep 17 00:00:00 2001 From: Brandon T Date: Wed, 3 Jul 2024 16:24:20 -0400 Subject: [PATCH] Move PassKit downloads to a background thread. --- .../BVC+WKDownloadDelegate.swift | 24 +++++++---- .../BVC+WKNavigationDelegate.swift | 4 +- .../Browser/Helpers/OpenInHelper.swift | 41 +++++++++++-------- 3 files changed, 42 insertions(+), 27 deletions(-) diff --git a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKDownloadDelegate.swift b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKDownloadDelegate.swift index 9669b768b697..b41743aef028 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKDownloadDelegate.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKDownloadDelegate.swift @@ -62,17 +62,23 @@ extension BrowserViewController: WKDownloadDelegate { textEncodingName: downloadInfo.response.textEncodingName ) - if let passbookHelper = OpenPassBookHelper( - request: nil, - response: response, - canShowInWebView: false, - forceDownload: false, - browserViewController: self - ) { - passbookHelper.open() + guard + let passbookHelper = OpenPassBookHelper( + request: nil, + response: response, + canShowInWebView: false, + forceDownload: false, + browserViewController: self + ) + else { + Task.detached { + try FileManager.default.removeItem(at: downloadInfo.fileURL) + } + return } - Task { + Task.detached { + await passbookHelper.open() try FileManager.default.removeItem(at: downloadInfo.fileURL) } } diff --git a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKNavigationDelegate.swift b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKNavigationDelegate.swift index 68061deb61cb..9e2ecd5e98eb 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKNavigationDelegate.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKNavigationDelegate.swift @@ -779,7 +779,9 @@ extension BrowserViewController: WKNavigationDelegate { browserViewController: self ) { // Open our helper and cancel this response from the webview. - passbookHelper.open() + Task.detached { + await passbookHelper.open() + } return .cancel } diff --git a/ios/brave-ios/Sources/Brave/Frontend/Browser/Helpers/OpenInHelper.swift b/ios/brave-ios/Sources/Brave/Frontend/Browser/Helpers/OpenInHelper.swift index 971ad1c55b66..310fd72367c6 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Browser/Helpers/OpenInHelper.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Browser/Helpers/OpenInHelper.swift @@ -148,32 +148,39 @@ class OpenPassBookHelper: NSObject { super.init() } - func open() { + func open() async { + precondition(!Thread.isMainThread) + guard let passData = try? Data(contentsOf: url) else { return } do { let pass = try PKPass(data: passData) let passLibrary = PKPassLibrary() if passLibrary.containsPass(pass) { - UIApplication.shared.open(pass.passURL!, options: [:]) + await MainActor.run { + UIApplication.shared.open(pass.passURL!, options: [:]) + } } else { - if let addController = PKAddPassesViewController(pass: pass) { - browserViewController.present(addController, animated: true, completion: nil) + await MainActor.run { + if let addController = PKAddPassesViewController(pass: pass) { + browserViewController.present(addController, animated: true, completion: nil) + } } } } catch { - // display an error - let alertController = UIAlertController( - title: Strings.unableToAddPassErrorTitle, - message: Strings.unableToAddPassErrorMessage, - preferredStyle: .alert - ) - alertController.addAction( - UIAlertAction(title: Strings.unableToAddPassErrorDismiss, style: .cancel) { (action) in - // Do nothing. - } - ) - browserViewController.present(alertController, animated: true, completion: nil) - return + await MainActor.run { + // display an error + let alertController = UIAlertController( + title: Strings.unableToAddPassErrorTitle, + message: Strings.unableToAddPassErrorMessage, + preferredStyle: .alert + ) + alertController.addAction( + UIAlertAction(title: Strings.unableToAddPassErrorDismiss, style: .cancel) { (action) in + // Do nothing. + } + ) + browserViewController.present(alertController, animated: true, completion: nil) + } } } }