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
上创建一个类别并覆盖 supportedInterfaceOrientations
和 shouldAutorotate
以仅支持纵向。
您可能需要在 Objective C 中创建此类别才能真正编译它,但它会起作用。
@interface MFMessageComposeViewController (NoRotation) @end
@implementation MFMessageComposeViewController (NoRotation)
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
- (BOOL)shouldAutorotate {
return NO;
}
应用其他地方的杂散代码(糟糕的开发人员,糟糕的开发人员,糟糕的开发人员!)导致了错误。
代码中其他地方的 UINavigationController 扩展覆盖了 supportedInterfaceOrientations
并导致这里的每个人都在一个愚蠢的错误上浪费时间。对不起!不过,希望我们的草率能使未来的用户受益。
删除扩展修复了错误。
如果 SO 决定表彰和奖励最差的开发人员,我们很乐意参加提名。 :)
我们的应用仅支持纵向模式。呈现 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
上创建一个类别并覆盖 supportedInterfaceOrientations
和 shouldAutorotate
以仅支持纵向。
您可能需要在 Objective C 中创建此类别才能真正编译它,但它会起作用。
@interface MFMessageComposeViewController (NoRotation) @end
@implementation MFMessageComposeViewController (NoRotation)
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
- (BOOL)shouldAutorotate {
return NO;
}
应用其他地方的杂散代码(糟糕的开发人员,糟糕的开发人员,糟糕的开发人员!)导致了错误。
代码中其他地方的 UINavigationController 扩展覆盖了 supportedInterfaceOrientations
并导致这里的每个人都在一个愚蠢的错误上浪费时间。对不起!不过,希望我们的草率能使未来的用户受益。
删除扩展修复了错误。
如果 SO 决定表彰和奖励最差的开发人员,我们很乐意参加提名。 :)