2016-12-06 37 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) 

只要財產是由強烈舉行你的實例並沒有被釋放,它不會崩潰。