У меня есть одно хост-приложение MyApp
и одна связанная платформа MyFramework
в одной рабочей области для большого проекта iOS
. Допустим, MyFramework
по каким-то причинам требует знать версию выпуска MyApp
(или текущий номер сборки). Как я могу справиться с этой ситуацией? Может ли фреймворк каким-либо образом получить доступ к хост-приложениям .plist
? или есть лучший дизайн?
Как получить доступ к версии хост-приложения из фреймворка в iOS?
Ответы (1)
Отвечать:
Доступ к содержимому Info.plist
возможен, если вы можете создать правильный объект Bundle
ИЛИ NSBundle
хост-приложения. Затем вы можете получить доступ к свойству infoDictionary
для доступа к полному содержимому.
Теперь главный вопрос: как создать объект Bundle
хост-приложения? Есть четыре инициализатора Bundle
. Я предпочитаю использовать init?(identifier:)
, так как другие берут имя класса или путь из MyApp
в качестве параметра, эта информация может быть недоступна в вашем MyFramework
Итак, чтобы получить доступ к Info.plist
MyApp
, используйте следующий код.
if let hostInfoDic = Bundle(identifier: "com.company.MyApp")?.infoDictionary {
print("CFBundleShortVersionString: \(hostInfoDic["CFBundleShortVersionString"])")
print("CFBundleVersion: \(hostInfoDic["CFBundleVersion"])")
} else {
// Log error
// ... Fallback handler
}
В вызове конфигурации вашей платформы вы можете запросить идентификатор пакета хост-приложения в качестве дополнительного параметра.
Примечание:
Вы не можете напрямую использовать Bundle.main.infoDictionary
, так как это даст вам информацию о пакете из текущего исполняемого каталога, который может быть вашим фреймворком.
Обсуждение
Основной пакет позволяет вам получить доступ к ресурсам в том же каталоге, что и текущий исполняемый файл. Для работающего приложения основной пакет предлагает доступ к каталогу пакета приложения. Для кода, работающего в фреймворке, основной пакет предлагает доступ к каталогу пакетов фреймворка.