Сегодня расширение аварийно завершает работу перед запуском на iOS 8.1.2

Сегодня я сделал расширение, которое загружает статьи из ленты и отображает последние из них. Все это отлично работало на iOS 8, по-прежнему работало на iOS 8.1, затем вышла iOS 8.1.2, и мы начали жаловаться на то, что сегодняшнее расширение больше не работает. Я пытался выполнить отладку на устройствах iOS 8.1.2, и еще до запуска расширения оно вылетало с этой ошибкой:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: <__NSConcreteUUID 0x174027280> 5AFB07AB-5DCD-46FE-8D07-44DE0F3789F2)'

Я прочитал этот пост о частых ошибках, возникающих при разработке сегодняшнего расширения: http://www.atomicbird.com/blog/ios-app-extension-tip

В своем посте Том Харрингтон говорит:

В iOS 8 (и других последних версиях) включение модулей в настройках сборки Xcode означает, что вам не нужно явно перечислять все платформы, которые вы хотите использовать. Они будут найдены автоматически.

Но это не относится к NotificationCenter.framework, который используют расширения Today. Если вы удалите это из настроек сборки, вы не получите никаких предупреждений или ошибок сборки. Но когда вы попытаетесь загрузить расширение, вы получите исключение из libextension.dylib, и ваше расширение не загрузится. Сообщение об исключении не информативно:

2014-08-16 12:06:53.793 TodayTestExtension[41313:6111763] * Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «* setObjectForKey: объект не может быть нулевым (ключ: ‹__NSConcreteUUID 0x7fd729422390 > ED3B42F8-66CD-4CB0-BCD5-F3DBA6F34DB5)' Если вы делаете сегодняшнее расширение, просто оставьте эту структуру в настройках сборки. Он не должен быть там, но он есть.

Мое расширение включает NotificationCenter.framework в свои настройки сборки, но я подозреваю, что моя проблема может быть чем-то похожа.

Кто-нибудь сталкивался с подобной проблемой? Есть идеи, как это решить?


person Marc_V    schedule 26.01.2015    source источник
comment
Вау, это обескураживает. Это выглядит точно так же, но это единственное, что я знаю, что может вызвать эту проблему.   -  person Tom Harrington    schedule 26.01.2015
comment
Были ли эти жалобы от пользователей в поле или от людей, запускающих тестовые сборки вашего приложения? Во-первых, это будет ошибка 8.1.2, и вы ничего не сможете сделать. Во-вторых, это может быть проблема Xcode, которую можно исправить.   -  person Tom Harrington    schedule 26.01.2015


Ответы (4)


Эта ошибка также возникает, если вы используете NSExtensionPrincipalClass внутри «Info.plist», чтобы определить базовый класс (вместо использования раскадровки) с именем несуществующего ViewController.

При использовании Swift обязательно добавляйте к классу префикс имени модуля (обычно имя цели), например «Module.MyViewController».

person WMD    schedule 23.03.2015
comment
Круто, это сработало! Затем я изменил его на $(PRODUCT_NAME). для большей гибкости. - person user2565077; 25.08.2016
comment
Вы спасаете мою жизнь! - person Hilen; 31.10.2016
comment
Это решение применимо к любому типу расширения. И часть «При использовании Swift» важна. Не забудьте это имя модуля. - person jscs; 24.08.2017
comment
Потому что я меняю имя своего проекта, но параметр info.plist NSExtensionPrincipalClass также является старым именем проекта. - person yuanjilee; 17.07.2020

В конце концов я попытался удалить NotificationCenter.framework из моей цели и вернуть его, очистил проект, и теперь он снова работает. Я предполагаю, что фреймворк не был должным образом связан, хотя я мог видеть это на своей цели с помощью xcode. Также не могу понять, почему то работало, то перестало работать с приходом 8.1.2.

person Marc_V    schedule 12.02.2015

Я исправил эту проблему, добавив атрибут @objc в класс Swift.

@objc(NotificationViewController)
class NotificationViewController: UIViewController, UNNotificationContentExtension {
...
}
person Fogh    schedule 05.02.2019

Только что испытал ту же проблему. Для меня это было свойство «Основной интерфейс» в «Общих настройках» цели «Клавиатура». Он был пуст, и я установил его в свой файл раскадровки, и теперь он работает как чудо.

person Akshit Zaveri    schedule 10.02.2015