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