取消打印操作后应用程序崩溃

3
我的应用支持打印。如果用户取消了打印机选项模态视图控制器,应用程序会在苹果的某个代码中崩溃,并显示如下信息:_WebTryThreadLock(bool) ... Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now... 我已经缩小到以下代码:
let itemProvider = UIActivityItemProvider(placeholderItem: "message")
let activityItems = [ itemProvider,
                      UIMarkupTextPrintFormatter(markupText: "test") ]
let activityController = UIActivityViewController(activityItems: activityItems,
                                              applicationActivities: nil)
self.present(activityController, animated: true, completion: nil)

如果我从activityItems数组中删除itemProvider,那么崩溃就消失了。在我的应用程序中,我有一个自定义的UIActivityItemProvider子类,但即使我使用未定制的超类,我也会遇到这个问题。
为了重现这个问题,请创建一个单视图项目和一个按钮,并将该按钮链接到一个使用上述代码片段作为其主体的操作。然后点击按钮,在活动视图控制器中点击打印图标,然后在打印机选项视图控制器中点击取消按钮。奔溃。有任何想法吗?

按照您在Xcode 8.1中的步骤,在iPhone目标上运行,并在9.3.5设备上进行测试,我没有看到崩溃。 - Phillip Mills
感谢您的查看,Phillip。我正在使用Xcode 8.1和iPhone 7模拟器,部署目标设置为10.1。当我将其更改为9.3时,模拟器仍然会崩溃。我已经在我的设备上尝试过(iPhone 6 Plus运行10.1.1),崩溃并不总是发生 - 它是间歇性的。如果我将部署目标设置为10.1,我的设备每次都会崩溃,但如果我将部署目标设置为9.3,则并不总是发生。在我的发布应用程序中,用户在运行10.1.1的iPhone和iPad上遇到了这个崩溃。也许这是一个iOS的bug,我需要提交一个Radar。 - Steve Liddle
我没有好的想法,但我发现了一个奇怪的观察结果。如果我为活动控制器分配一个完成处理程序(UIActivityViewControllerCompletionWithItemsHandler),它会在模拟器中停止崩溃第一次通过序列。但是,如果我重复UI操作而不重新启动...就会崩溃。 - Phillip Mills
我提交了一个雷达,编号为29578381。 - Steve Liddle
我有同样的问题。如果我省略第一个活动项(在我的情况下是用于电子邮件的纯HTML字符串),问题就会消失。这不是解决方案,但可能是问题的指针。同时,我将只使用打印活动发布。 - Reg Cappuccino
1个回答

5

几乎可以肯定这是苹果代码中的一个漏洞。

经过调试,我得出结论,这与UIMarkupTextPrintFormatter实例的释放相关。

因此,作为一种解决方法,您可以将格式化程序作为类中的属性:

var printFormatter = UIMarkupTextPrintFormatter(markupText: "test")

然后像这样使用它:
let itemProvider = UIActivityItemProvider(placeholderItem: "message")
let activityItems = [itemProvider, self.printFormatter]
let activityController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
self.present(activityController, animated: true, completion: nil)

只要属性被实例强引用持有并且没有被释放,它就不会崩溃。

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