Невозможно декодировать объект Swift во фреймворке

У меня было отлично работающее приложение. Я хотел сделать свое приложение модульным, потому что я предполагаю, что отдельные его части будут нужны в других приложениях. Итак, я создал два фреймворка. Две фреймворки собираются нормально, и мое приложение с двумя встроенными в него фреймворками тоже работает нормально.

Моя проблема возникает, когда я пытаюсь разархивировать данные, у которых есть класс, который теперь находится в одной из моих фреймворков. Я получаю такую ​​ошибку:

reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (myProjecy.MyObject) for key (NS.objects); the class may be defined in source code or a library that is not linked'

В моем приложении я могу создавать экземпляры MyObject нормально. Все необходимые методы во фреймворке либо открыты, либо общедоступны (иначе приложение даже не будет построено).

Что мне не хватает?

Класс во фреймворке находится в Swift, а класс, пытающийся его разархивировать, - это Obj-C. Я использую Xcode 9.

Спасибо.


person Phantom59    schedule 11.01.2018    source источник


Ответы (1)


OK. Я нашел проблему. Повторное посещение этого сообщения привело меня к решению.

В моем случае, поскольку исходный объект был заархивирован, пока он все еще был частью приложения, а мое приложение указало использовать имя модуля, объект был заархивирован с именем модуля приложения. Теперь разархиватор пытается использовать имя модуля во фреймворке, что и приводит к проблеме.

Итак, мне в основном пришлось посыпать несколько из них:

NSKeyedUnarchiver.setClass(ClassName.self, forClassName: "AppModule.ClassName")
NSKeyedArchiver.setClassName("AppModule.ClassName", for: ClassName.self)

И все отлично работает!

Без этого кода разархиватор пытается использовать "FrameworkModule.ClassName".

person Phantom59    schedule 12.01.2018