【问题标题】:MFMailComposeViewController behaves differently in iOS 13 simulator and deviceMFMailComposeViewController 在 iOS 13 模拟器和设备中的行为不同
【发布时间】:2020-02-27 14:45:00
【问题描述】:

我正在尝试在应用中显示 MFMailComposeViewController

if MFMailComposeViewController.canSendMail() {
    let mailComposeViewController = MFMailComposeViewController()
    mailComposeViewController.navigationBar.tintColor = .white
    mailComposeViewController.mailComposeDelegate = self
    mailComposeViewController.setToRecipients(["support@gmail.com"])
    mailComposeViewController.setSubject("Feedback")
    present(mailComposeViewController, animated: true)
} else {
    print("This device is not configured to send email. Please set up an email account.")
}

在 iOS 12 中,它显示没有问题。在模拟器和设备中。

但是当我在运行 iOS 13 的设备上运行相同的项目时,它看起来像这样。

导航栏颜色消失了。发送按钮也是不可见的。

所以我添加了mailComposeViewController.navigationBar.backgroundColor = .mv_primary,但它仍然没有显示在设备上。奇怪的是,模拟器中显示的背景颜色。

但是有一个奇怪的行为。当我在模拟器中运行 MFMailComposeViewController 时,它会立即自行关闭。

以下错误也会显示在 Xcode 控制台中。

[Common] [FBSSystemService][0x5f27] 处理打开请求时出错 com.apple.MailCompositionService: { 用户信息 = { FBSOpenApplicationRequestID = 0x5f27; } 底层错误 = ; } 2019-11-01 14:40:05.214158+0530 MailCompose[11289:262267] [断言] 连接 请求无效而不恢复我们的 _serviceSessionConnection。 这是一个错误。 2019-11-01 14:40:05.216901+0530 MailCompose[11289:262054] [常规] #CompositionServices _serviceViewControllerReady: NSError Domain=_UIViewServiceInterfaceErrorDomain Code=0

我猜奇怪的关闭错误是 Xcode 错误。但是如何修复背景颜色和设备中未显示的发送按钮?

这就是我设置所有导航栏相关样式的方式。

UINavigationBar.appearance().barTintColor = .mv_primary
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
if #available(iOS 11.0, *) {
    UINavigationBar.appearance().largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
}

Demo project

【问题讨论】:

  • 我在 iOS 13.3 上遇到了完全相同的问题。您找到解决方案了吗?
  • @inankupeli 不幸的是没有。我也在 Apple Developer 论坛上发布了同样的问题,但那里也没有回复。
  • @Isuru 你找到解决办法了吗?
  • @Isuru 在你提到你试图在模拟器中运行它的问题中,但是这不能在模拟器中测试你需要一个设备,iOS 13 中的默认模式演示是页面表,您可以尝试将模式演示更改为全屏并查看是否获得相同的行为吗?这在设备中是否也以相同的方式响应?

标签: ios swift ios13 mfmailcomposeviewcontroller xcode11


【解决方案1】:

在呈现之前添加这行代码。它会正常工作。这是 iOS 13 的变化

mailController.modalPresentationStyle = .fullScreen

【讨论】:

    【解决方案2】:

    Mail composer 立即关闭的原因是您实际上无法从模拟器发送电子邮件。实现与 iOS 本身不同。

    我猜这里发生的情况是,虽然模拟器实现只使用了一些普通的 UI 元素,但原生 iOS 上的 MFMailComposeViewController 实际上是托管,例如 UIDocumentPickerViewControllerUIActivityViewController。这意味着屏幕截图和尝试遍历视图树是不可能的,因为视图不是应用程序的实际部分。他们这样做是因为这些控制器包含用户私人信息。托管视图控制器不允许自定义,并且不符合您的全局UINavigationBar.appearance()。这可以解释为什么它会显示在模拟器中而不是您的本机设备上。

    【讨论】:

      【解决方案3】:

      这是 iOS 13 的新 UI 样式。您可以在 Storyboard 中禁用它或手动设置。 Presenting modal in iOS 13 fullscreen

      【讨论】:

        猜你喜欢
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-10
        • 1970-01-01
        相关资源
        最近更新 更多