【问题标题】:How to open the default mail app on iOS 14 without a compose view?如何在没有撰写视图的情况下在 iOS 14 上打开默认邮件应用程序?
【发布时间】:2021-02-12 18:07:31
【问题描述】:

我想在 iOS 14 上打开用户选择的默认邮件应用程序 - 但不显示撰写视图。 注册帐户后,用户应该确认他们的电子邮件地址,所以我想将用户引导到那里。

根据我发现的其他问题,似乎有两种已知方法:

UIApplication.shared.open(URL(string: "mailto://")!)

UIApplication.shared.open(URL(string: "message://")!)

first option 的问题在于它会在应用程序中打开一个空的撰写邮件视图,要求用户输入新电子邮件。那不是我想要的。这会让用户感到困惑,他们认为他们必须向我们发送电子邮件。通过 mailto URL 语法的参数输入一些文本,我基本上在邮件撰写视图中预先填充了一些文本,指示丢弃新的电子邮件草稿并要求检查他们的电子邮件,这可以作为一种解决方法,但不是很好。

second option 的问题在于它总是打开 Mail.app,即使这不是默认的邮件应用程序,如果用户从手机中删除它,它可能会要求用户安装 Mail.app,因为他们选择了例如Protonmail 作为他们的默认邮件应用程序。对于主要不使用 Mail.app 的人来说,这也不是一个很好的选择。

所以其他人提出的两种方法都不能很好地解决我的问题。

解决这个问题的最佳方法是什么?

是否有一些应用程序可以查询 iOS 的默认邮件应用程序,所以如果我知道该应用程序的自定义 URL 方案(例如 googlegmail://),至少我可以尝试启动该应用程序?

【问题讨论】:

  • 你解决了吗?
  • 几乎,我最终询问用户是否要启动 Apple Mail、Google Mail、Microsoft Outlook 或 Protonmail。根据用户的选择(不在 iOS 上查询任何默认值),我将使用 URL 方案 message:googlegmail:ms-outlook:protonmail: 启动该应用程序。

标签: ios swift


【解决方案1】:

我最终解决了一半,通过警告视图询问用户他们的偏好,因为我没有找到直接查询 iOS 的方法。

所以首先显示一个像这样的警报视图:

func askUserForTheirPreference(in presentingViewController: UIViewController) {
    let alertController = UIAlertController(title: nil, message: "pleaseConfirmWithApp", preferredStyle: .actionSheet)
    alertController.addAction(UIAlertAction(title: "Apple Mail", style: .default) { action in
        self.open(presentingViewController, .applemail)
    })
    alertController.addAction(UIAlertAction(title: "Google Mail", style: .default) { action in
        self.open(presentingViewController, .googlemail)
    })
    alertController.addAction(UIAlertAction(title: "Microsoft Outlook", style: .default) { action in
        self.open(presentingViewController, .outlook)
    })
    alertController.addAction(UIAlertAction(title: "Protonmail", style: .default) { action in
        self.open(presentingViewController, .protonmail)
    })
    alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel) { action in
        os_log("Cancelling", log: Self.log, type: .debug)
    })
    presentingViewController.present(alertController, animated: true)
}

然后,我将这样回应用户的选择:

func open(_ presentingViewController: UIViewController, _ appType: AppType) {
    switch appType {
    case .applemail: UIApplication.shared.open(URL(string: "message:")!, completionHandler: { handleAppOpenCompletion(presentingViewController, $0) })
    case .googlemail: UIApplication.shared.open(URL(string: "googlegmail:")!, completionHandler: { handleAppOpenCompletion(presentingViewController, $0) })
    case .outlook: UIApplication.shared.open(URL(string: "ms-outlook:")!, completionHandler: { handleAppOpenCompletion(presentingViewController, $0) })
    case .protonmail: UIApplication.shared.open(URL(string: "protonmail:")!, completionHandler: { handleAppOpenCompletion(presentingViewController, $0) })
    }
}

private func handleAppOpenCompletion(_ presentingViewController: UIViewController, _ isSuccess: Bool) {
    guard isSuccess else {
        let alertController = UIAlertController(title: nil, message: "thisAppIsNotInstalled", preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Dismiss", style: .cancel))
        presentingViewController.present(alertController, animated: true)
        return
    }
}

enum AppType {
    case applemail, googlemail, outlook, protonmail
}

这种方法的一个明显限制当然是我将用户限制在非常特定的应用程序(在本例中为 Google Mail、iOS“默认”邮件、Microsoft Outlook 和 ProtonMail)。 所以这种方法并不能很好地扩展。

但至少,您可以覆盖一些最喜欢的,然后根据用户的反馈从那里开始。

跳过这些询问第一个问题的主要原因是,至少目前,直接从 iOS 获取这些信息似乎是不可能的。 我也找不到始终打开所选默认邮件应用程序而不显示撰写新电子邮件视图的 URL 方案。

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多