iOS:如果使用 "Message" 选项共享会崩溃

iOS: crash if sharing with "Message" option

我们的应用仅支持纵向模式。呈现 UIActivityViewController 有效。

但是,使用 "Message" 选项共享会使应用程序崩溃:

*** Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [MFMessageComposeViewController shouldAutorotate] is returning YES'

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

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

1) 我们如何支持 "Message" 共享选项,同时仅支持纵向,即在 Info.plist 中仅支持纵向?

2) 为什么我们能够在其他应用程序中支持 "Message" 共享选项,而在 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)

你所有的独立视图控制器只能支持纵向,通过实现supportedInterfaceOrientations到returnUIInterfaceOrientationPortrait

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

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

我尝试了一段时间来重现这个错误,但没能让它崩溃。最后,当我返回 UIInterfaceOrientationPortrait 时,当我应该为其中一个方向函数返回 UIInterfaceOrientationMaskPortrait 时,我终于能够得到这个确切的崩溃。检查您的视图控制器对 supportedInterfaceOrientations 的实现和 application:supportedInterfaceOrientationsForWindow:

的实现

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

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

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

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

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate {
    return NO;
}

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

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

删除扩展修复了错误。

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