在没有显式弹出框的情况下,应用程序在UIPopoverPresentationController中崩溃?

19

我的应用(仅适用于iOS 8)由于尝试进行IAP时崩溃而被拒绝了。在AdHoc版本中,我已经尝试过几乎所有购买流程的变化,但是无法复制崩溃。通过审查团队附加的崩溃日志,我看到最后一个异常回溯中有一个非常奇怪的堆栈跟踪。崩溃似乎涉及UIPopoverController,然而我的应用虽然是通用的,但没有明确或隐式地在任何地方显示popovers。有人有任何想法是什么可能会触发导致此崩溃的活动吗?在审查团队仅查看我的应用时,什么可能会使我的应用显示popovers?

Last Exception Backtrace:
0   CoreFoundation                0x186d52084 __exceptionPreprocess + 132
1   libobjc.A.dylib               0x1977a40e4 objc_exception_throw + 60
2   UIKit                         0x18bc0aee0 -[UIPopoverPresentationController presentationTransitionWillBegin] + 2464
3   UIKit                         0x18b7d27d8 __71-[UIPresentationController _initViewHierarchyForPresentationSuperview:]_block_invoke + 1324
4   UIKit                         0x18b7d1310 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 212
5   UIKit                         0x18b557388 _applyBlockToCFArrayCopiedToStack + 356
6   UIKit                         0x18b4c8e4c _afterCACommitHandler + 532
7   CoreFoundation                0x186d0a388 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
8   CoreFoundation                0x186d07314 __CFRunLoopDoObservers + 360
9   CoreFoundation                0x186d076f4 __CFRunLoopRun + 836
10  CoreFoundation                0x186c35664 CFRunLoopRunSpecific + 396
11  GraphicsServices              0x18fd435a4 GSEventRunModal + 168
12  UIKit                         0x18b53a984 UIApplicationMain + 1488

2
你是否在任何时候显示UIActivityViewController?如果是的话,你可能会在iPad上显示时崩溃。在iOS8中,Apple似乎会显示一些随机的UI位于其中。查找您呈现UIViewController的位置,并尝试在VC的popoverPresentationController属性上设置所需的信息。这仅适用于iOS8,因此您需要检查它是否响应该选择器。 - i_am_jorf
我确实提供了一个活动视图控制器,但在应用被拒绝时,审查人员没有指明在哪个流程中出现问题。另外,我也不清楚为什么这个问题只在应用审核中出现,而在AdHoc版本中却没有问题。 - nickbona
可能是你在构建中捕获了异常,但Apple却在异常抛出点上中断了?我不知道Apple做了什么,但是我想你可能没有在iPad上进行过测试?在adhoc分发上不应该有区别,如果你的活动视图控制器在本地iPad上运行良好,那就不是问题所在。但是像我说的,你的其中一个视图控制器最终会出现在这个表示弹出窗口的东西中。 - i_am_jorf
我有类似的问题。但是,我在我的应用程序中没有显示UIActivityViewController或UIPopoverPresentation控制器。根据Splunk在仅限iOS 8设备上似乎会发生崩溃现象,无论是在iPhone还是iPad上。有任何想法吗? - user2246051
@i_am_jorf,你应该把这个作为答案添加上。我刚刚发现了这个问题,而你建议查找UIActivityViewController的用法是解决我的方法。 - Nerrolken
4个回答

8

不确定是否与原问题的原因相同,但我遇到了完全相同的错误,问题是使用具有ActionSheet样式的UIAlertController,它在iPhone上呈现得很好,但iPad需要设置一个sourceview - https://dev59.com/LGAf5IYBdhLWcg3w2Fl6#24233937


2
天啊 - 我真的有完全相同的问题。 - C. Tewalt
我有完全相同的问题。在 iPhone 上可以工作,在 iPad 上会崩溃。但是:我们应该仅为 iPad 还是两者都设置 setModalPresentationStyle:UIModalPresentationPopover]; 和 sourceView? - dowi
根据我的经验,您可以毫无顾虑地将它们设置为iPhone和iPad。尽管我已经两次检查了整个代码库以寻找错误,但我仍在寻找此错误的发生情况。由于崩溃没有提供有关问题位置的任何信息,这并不是很有用。 - Paul Bruneau

0

这只是类似的情况。我在 iOS 9+ 上遇到了一个崩溃错误,出现在 [UIPopoverPresentationController presentationTransitionWillBegin],结果发现当 sourceViewnil 时就会崩溃。

示例(使用 Objective-C):

UIViewController *vc = <#instance#>.
vc.modalPresentationStyle = UIModalPresentationPopover;
vc.popoverPresentationController.delegate = self;
vc.popoverPresentationController.sourceView = sourceView; // <--- this MUST NOT be nil.
vc.popoverPresentationController.sourceRect = sourceView.bounds;
[self presentViewController:vc animated:YES completion:nil];

0

很可能是在iPad上ActionSheet崩溃了。

你应该加上一个if条件语句,像这样:

if let popoverController = alertVC.popoverPresentationController {
    popoverController.sourceView = self.view
    popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
    popoverController.permittedArrowDirections = []
  }

-1

首先,您应该检查UIPopoverPresentationController是否可用。

NSArray *Items = [NSArray arrayWithObjects:emailBody,anImage, nil];

    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:Items applicationActivities:nil];

    if ([UIPopoverPresentationController class] != nil) {   
        UIPopoverPresentationController *popover = activityController.popoverPresentationController;
        if (popover)
        {
            popover.sourceView = sender;
            //popover.sourceRect = sender.bounds;
            popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
        }
    }


    [self presentViewController:activityController animated:YES completion:NULL];  

UIPopoverPresentationController类在iPad-iOS8或更高版本的编译器中找不到,因此应用程序会崩溃。 所以首先我们要检查UIPopoverPresentationController类是否可用。 - Ambuj Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接