2016-12-06 71 views
2

我的应用程序支持打印。如果用户取消打印机选项模态视图控制器,应用程序的某个地方崩溃在苹果的代码的_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) 

如果我从删除itemProvider阵列,activityItems,崩溃消失。在我的应用程序中,我有一个UIActivityItemProvider的自定义子类,但即使我没有自定义它使用超类,我也会发生这种崩溃。

要进行复制,请使用单个按钮创建单个视图项目,然后将该按钮链接到使用上述代码片段作为其主体的操作。然后点击按钮,点击活动视图控制器中的打印图标,然后点击打印机选项视图控制器中的取消按钮。崩溃。有任何想法吗?

+0

遵循Xcode 8.1中的步骤,使用iPhone目标,并在9.3.5设备上运行,我没有看到崩溃。 –

+0

感谢您检查此事,Phillip。我使用Xcode 8.1和iPhone 7模拟器,部署目标设置为10.1。当我将其改为9.3时,我仍然每次都会在模拟器中发生崩溃。我尝试过使用我的设备(运行10.1.1的iPhone 6 Plus),并且崩溃并不总是发生 - 这是间歇性的。如果我将部署目标设置为10.1,那么每次我的设备都会崩溃,但是如果将部署目标设置为9.3,则不会总是发生。在我的发货应用中,用户在运行10.1.1的iPhone和iPad上遇到此故障。也许这是一个iOS错误,我需要提交一个雷达。 –

+0

我没有很好的想法,但我确实发现了一个奇怪的观察。如果我为活动控制器分配了完成处理程序('UIActivityViewControllerCompletionWithItemsHandler'),它将在模拟程序**中第一次通过序列**停止崩溃。但是,如果我重复UI操作而不重新启动...崩溃。 –

回答

4

这几乎肯定是Apple代码中的一个错误。

经过调试后,我得出结论,它与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) 

只要财产是由强烈举行你的实例并没有被释放,它不会崩溃。