2016-12-06 3 views
2

Мое приложение поддерживает печать. Если пользователь отменяет опцию принтера модального контроллера представления, приложение падает где-то в коде Apple, с сообщением _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

Спасибо, что проверил это, Филипп. Я использую Xcode 8.1 с симулятором iPhone 7, цель развертывания установлена ​​в 10.1. Когда я меняю это на 9,3, я все равно получаю крах в симуляторе каждый раз. Я пробовал на своем устройстве (iPhone 6 Plus работает 10.1.1), и авария не всегда происходит - это прерывисто. Если я установил цель развертывания в 10.1, мое устройство каждый раз рушится, но если я установил цель развертывания в 9.3, это не всегда произойдет. В моем приложении для доставки пользователи столкнулись с этим сбоем на iPhones и iPads, работающих под управлением 10.1.1. Возможно, это ошибка iOS, и мне нужно подать радар. –

+0

У меня нет хороших идей, но я нашел одно странное наблюдение. Если я назначу обработчик завершения ('UIActivityViewControllerCompletionWithItemsHandler') для контроллера активности, он перестанет сбой в симуляторе ** в первый раз через последовательность **. Но, если я повторяю действия пользовательского интерфейса без перезапуска ... сбоя. –

ответ

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) 

Пока свойство сильно удерживается ваш экземпляр и не освобождается, он не будет разбиваться.

Смежные вопросы