diff --git a/Multiplatform/iOS/Article/WebViewController.swift b/Multiplatform/iOS/Article/WebViewController.swift index 151084f75..18d8c44c4 100644 --- a/Multiplatform/iOS/Article/WebViewController.swift +++ b/Multiplatform/iOS/Article/WebViewController.swift @@ -315,15 +315,12 @@ extension WebViewController: WKNavigationDelegate { } else if components?.scheme == "mailto" { decisionHandler(.cancel) - guard let emailAddress = url.emailAddress else { + guard let emailAddress = url.percentEncodedEmailAddress else { return } - if MFMailComposeViewController.canSendMail() { - let mailComposeViewController = MFMailComposeViewController() - mailComposeViewController.setToRecipients([emailAddress]) - mailComposeViewController.mailComposeDelegate = self - self.present(mailComposeViewController, animated: true, completion: {}) + if UIApplication.shared.canOpenURL(emailAddress) { + UIApplication.shared.open(emailAddress, options: [.universalLinksOnly : false], completionHandler: nil) } else { let alert = UIAlertController(title: NSLocalizedString("Error", comment: "Error"), message: NSLocalizedString("This device cannot send emails.", comment: "This device cannot send emails."), preferredStyle: .alert) alert.addAction(.init(title: NSLocalizedString("Dismiss", comment: "Dismiss"), style: .cancel, handler: nil)) @@ -418,15 +415,6 @@ extension WebViewController: UIScrollViewDelegate { } -// MARK: MFMailComposeViewControllerDelegate -extension WebViewController: MFMailComposeViewControllerDelegate { - - func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { - self.dismiss(animated: true, completion: nil) - } - -} - // MARK: JSON private struct ImageClickMessage: Codable { diff --git a/Multiplatform/iOS/Info.plist b/Multiplatform/iOS/Info.plist index d797bc4a1..cab22bf05 100644 --- a/Multiplatform/iOS/Info.plist +++ b/Multiplatform/iOS/Info.plist @@ -81,5 +81,9 @@ group.$(ORGANIZATION_IDENTIFIER).NetNewsWire.iOS AppIdentifierPrefix $(AppIdentifierPrefix) + LSApplicationQueriesSchemes + + mailto + diff --git a/Shared/Extensions/URL-Extensions.swift b/Shared/Extensions/URL-Extensions.swift index bbe70a1b1..707877cca 100644 --- a/Shared/Extensions/URL-Extensions.swift +++ b/Shared/Extensions/URL-Extensions.swift @@ -15,6 +15,11 @@ extension URL { scheme == "mailto" ? URLComponents(url: self, resolvingAgainstBaseURL: false)?.path : nil } + /// Percent encoded `mailto` URL for use with `canOpenUrl`. If the URL doesn't contain the `mailto` scheme, this is `nil`. + var percentEncodedEmailAddress: URL? { + scheme == "mailto" ? self.string.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)?.url : nil + } + /// URL pointing to current app version release notes. static var releaseNotes: URL { let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "" diff --git a/iOS/Article/WebViewController.swift b/iOS/Article/WebViewController.swift index 40d910ba8..6024d02dd 100644 --- a/iOS/Article/WebViewController.swift +++ b/iOS/Article/WebViewController.swift @@ -356,16 +356,12 @@ extension WebViewController: WKNavigationDelegate { } else if components?.scheme == "mailto" { decisionHandler(.cancel) - guard let emailAddress = url.emailAddress else { + guard let emailAddress = url.percentEncodedEmailAddress else { return } - if MFMailComposeViewController.canSendMail() { - let mailComposeViewController = MFMailComposeViewController() - mailComposeViewController.setToRecipients([emailAddress]) - mailComposeViewController.setSubject(url.valueFor("subject") ?? "") - mailComposeViewController.mailComposeDelegate = self - self.present(mailComposeViewController, animated: true, completion: {}) + if UIApplication.shared.canOpenURL(emailAddress) { + UIApplication.shared.open(emailAddress, options: [.universalLinksOnly : false], completionHandler: nil) } else { let alert = UIAlertController(title: NSLocalizedString("Error", comment: "Error"), message: NSLocalizedString("This device cannot send emails.", comment: "This device cannot send emails."), preferredStyle: .alert) alert.addAction(.init(title: NSLocalizedString("Dismiss", comment: "Dismiss"), style: .cancel, handler: nil)) @@ -459,14 +455,7 @@ extension WebViewController: UIScrollViewDelegate { } -// MARK: MFMailComposeViewControllerDelegate -extension WebViewController: MFMailComposeViewControllerDelegate { - - func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { - self.dismiss(animated: true, completion: nil) - } - -} + // MARK: JSON diff --git a/iOS/Resources/Info.plist b/iOS/Resources/Info.plist index 094a9981c..e843a3e9e 100644 --- a/iOS/Resources/Info.plist +++ b/iOS/Resources/Info.plist @@ -54,6 +54,10 @@ CFBundleVersion $(CURRENT_PROJECT_VERSION) + LSApplicationQueriesSchemes + + mailto + LSRequiresIPhoneOS NSAppTransportSecurity