У меня есть свой собственный закрытый CocoaPod, который я написал.Я пытаюсь использовать его в своем приложении для iOS, которое работает нормально.Но когда я добавляю его в приложение iMessage или в расширение для общего доступа, он не работает и выдает ошибку 'shared' is unavailable: Use view controller based solutions where appropriate instead.
при попытке использовать UIApplication.shared
.
Моей первой мыслью о том, как это исправить, было добавление флага Swift.IN_EXTENSION
или что-то в этом роде.Затем оберните код в блок #if
.
Проблема в том, что цель для источника CocoaPod находится в некотором типе платформы.Источник не является частью приложения или расширений напрямую.Поэтому добавление этого флага на самом деле не помогает.
Ниже приведен пример моего Podfile.
source 'https://github.com/CocoaPods/Specs.git'
source 'git@github.com:CUSTOMORG/Private-CocoaPods-Spec.git'
platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!
target 'MyApp' do
pod 'MyCustomSwiftPackage', '1.0.0'
end
target 'MyApp Share Extension' do
pod 'MyCustomSwiftPackage', '1.0.0'
end
Если я закомментирую строку pod 'MyCustomSwiftPackage', '1.0.0'
в MyApp Share Extension
, она будет работать нормально.Но если я оставлю его без комментария, он потерпит неудачу.
Мне нужен этот пакет в моем расширении общего ресурса, хотя.
Я подумал о написании отдельного модуля, который просто обрабатывает логику UIApplication.shared
идобавив этот модуль в MyApp
.Но это похоже на настоящую боль.Тем более, что я не знаю, как развернуть 2 CocoaPods в 1 проекте, которые полагаются на одни и те же исходные файлы.
Если это единственное решение, то кажется, что почти лучше использовать субмодули Git и иметь источник напрямуюв приложении, так что я могу включить его в эти цели напрямую, и тогда #if
ДОЛЖНО работать.Проблема в том, что зависимости CocoaPod не будут обработаны, если я буду использовать Git Submodules.Поэтому мне действительно нужно как-то использовать CocoaPods.
Я бы предпочел простое решение, которое не выглядит таким же хакерским, как те.Так есть ли лучший способ справиться с этим и исправить эту ошибку, не прибегая к переписыванию TON кода, и это не супер хакерское решение?
В комментариях упоминается использование NSSelectorFromString
с UIApplication.responds
и UIApplication.perform
.Проблема в том, что если Apple когда-либо изменит API, код будет поврежден, даже для предыдущих версий приложения, поскольку он вызывается динамически, без возможности проверки API в будущем.Хотя это решение звучит легко, оно кажется очень плохим решением.
Ответ ниже выглядит очень многообещающе.К сожалению, после нескольких изменений, изложенных в комментариях, он все еще не работает, так как основное приложение имеет как подспец Core, так и подспецификацию AppExtension.