【问题标题】:iOS: crash if sharing with "Message" optioniOS:如果使用“消息”选项共享会崩溃
【发布时间】:2016-12-20 01:56:05
【问题描述】:

我们的应用仅支持纵向模式。展示一个 UIActivityViewController 是可行的。

但是,使用“消息”选项共享会使应用程序崩溃:

*** 由于未捕获的异常“UIApplicationInvalidInterfaceOrientation”而终止应用程序,原因:“支持 方向与应用程序没有共同的方向,并且 [MFMessageComposeViewController shouldAutorotate] 正在返回 YES'

与其他选项(例如 Facebook Messenger)共享有效。

类似 SO 问题 like this one 的解决方案不起作用,因为它们建议支持所有方向。我们只想支持纵向。

1) 只支持纵向,即Info.plist中只支持纵向,如何才能支持“消息”分享选项?

2) 为什么我们可以在Info.plist中只有纵向的其他应用程序中支持“消息”共享选项而这一个不支持?我们应该在哪里寻找调试目的?

    // Define share objects
    let objectsToShare = ["test message"] as [Any]

    // Configure UIActivityViewController
    let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
    activityViewController.excludedActivityTypes =
        [UIActivityType.addToReadingList,
         UIActivityType.assignToContact,
         UIActivityType.print,
         UIActivityType.copyToPasteboard]

    // Define completion handler
    activityViewController.completionWithItemsHandler = doneSharingHandler

    // Show UIActivityViewController
    present(activityViewController, animated: true, completion: nil)

【问题讨论】:

  • 我制作了一个小示例应用程序来测试您在做什么(仅支持纵向屏幕方向),但我无法重现您所引用的问题。我在 App Store 上有 2 或 3 个允许用户使用 UIActivityViewController 共享内容的应用程序。它们都是仅限肖像的应用程序,我以前从未在消息、邮件或任何其他共享选项中遇到过这个问题。因此,我对您的建议是进一步检查应用程序崩溃的确切位置。我认为您应该重新检查您的代码,并确保您没有在代码的其他地方做任何事情来导致这个问题。我
  • 非常感谢。项目比较复杂,想看看如何简化代码,让调试更简单。
  • 你愿意去多 hackish?在我的回答中看到一个骇人听闻的提议。
  • @LeoNatan haha​​ha 一个你永远不想听到的问题... :) 将检查你的答案并在那里发表评论。感谢您的帮助!

标签: ios swift uiactivityviewcontroller mfmessagecomposeview


【解决方案1】:

我尝试了一段时间来重现此错误,但无法使其崩溃。最后,当我返回 UIInterfaceOrientationPortrait 时,我能够得到这个确切的崩溃,而我应该返回 UIInterfaceOrientationMaskPortrait 以获取其中一个方向函数。检查您的视图控制器对supportedInterfaceOrientations 的实现以及您对application:supportedInterfaceOrientationsForWindow: 的实现

【讨论】:

  • 谢谢乔恩!您是否在通过短信分享内容时尝试复制它,或者您是如何复制它的?没有一个视图控制器返回值方向值。我们依靠应用程序的 plist 为整个应用程序全局设置值,这适用于我们构建的其他应用程序,但由于某种原因不适用于此应用程序。
  • 这是评论,不是答案。
  • @LeoNatan 他实际上通过建议到处检查supportedInterfaceOrientations 来帮助找到解决方案(发布在下面)......简而言之,这是一个愚蠢愚蠢的开发错误。
【解决方案2】:

这是一个非常老套的解决方案,应该适用于仅以纵向显示的应用。

MFMessageComposeViewController 之上创建一个类别并覆盖supportedInterfaceOrientationsshouldAutorotate 以仅支持纵向。

您可能需要在 Objective C 中创建这个类别才能真正编译它,但它会起作用。

@interface MFMessageComposeViewController (NoRotation) @end
@implementation MFMessageComposeViewController (NoRotation)

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate {
    return NO;
}

【讨论】:

  • 再次感谢您的帮助。赞成!令人困惑的是,在其他应用程序中,我们只能在 info.plist 中支持肖像,而 MFMessageComposeViewController 没有问题,因此可以在不覆盖 MFMessageComposeViewController 或更改 info.plist 的情况下实现目标。试图了解潜在的原因,以便在我们的应用程序中调试原因。
  • 感谢您的帮助!终于查明原因,这是一个令人尴尬的愚蠢错误。如果您在乎,请参见下文,但无论如何都赞成您的答案。再次感谢!顺便说一句... 45.K ...令人印象深刻的代表!
【解决方案3】:

您的所有单个视图控制器只能支持纵向,通过实现supportedInterfaceOrientations 来返回UIInterfaceOrientationPortrait

但是您的应用程序,即Info.plist 或应用程序代理的application(_:supportedInterfaceOrientationsFor:),应该支持所有 方向。

这将允许运行时以它想要的方式呈现这个 MFMessageComposeViewController,但所有你的视图控制器仍将是纵向的,这正是你想要的。

【讨论】:

  • @LeoNatan 问题被澄清,专门询问如何在不支持 Info.plist 中的其他方向的情况下实现目标
  • @Crashalot。好的,那就不支持Info.plist中的其他方向了。改为在应用代理的application(_:supportedInterfaceOrientationsFor:) 中支持他们。
【解决方案4】:

应用中其他地方的杂乱代码(糟糕的开发人员、糟糕的开发人员、糟糕的开发人员!)导致了该错误。

代码中其他地方的 UINavigationController 扩展覆盖了 supportedInterfaceOrientations 并导致这里的每个人都在一个愚蠢的错误上浪费时间。对不起!不过,希望我们的草率对未来的用户有所帮助。

删除扩展修复了错误。

如果 SO 决定表彰和奖励周围最差的开发人员,我们很乐意参选。 :)

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多