我有一个自定义的私有CocoaPod,我写过它。我正在尝试在我的iOS应用程序中使用它,这很好用。但是当我将它添加到我的iMessage应用程序或共享扩展时,它会失败并给出一个错误:
问题是CocoaPod源的目标是某种类型的框架。源不是应用程序或扩展的直接部分。因此,添加该标志并没有真正帮助。
下面是我的Podfile示例。
如果我在“我的应用程序共享扩展”下的
然而,我确实需要在我的共享扩展中使用这个包。
我考虑编写一个单独的pod,只处理
如果这是唯一的解决方案,那么似乎将Git Submodules直接放入应用程序中更好,这样我就可以直接将其作为这些目标的一部分,那么
我希望有一个简单的解决方案,不像那些看起来很hacky。那么,有没有更好的方法来处理这个问题并修复错误,而不需要重写大量代码,并且不是超级hacky的解决方案?
在评论中,建议使用
下面这篇回答看起来非常有前途。不幸的是,在评论中概述了一些更改后,它仍然无法正常工作,主应用程序具有Core subspec以及AppExtension subspec。
'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’
这一行添加注释,则可以正常工作。但如果我不注释它,则会失败。然而,我确实需要在我的共享扩展中使用这个包。
我考虑编写一个单独的pod,只处理
UIApplication.shared
逻辑,并将该pod添加到 MyApp
中。但那似乎很麻烦, 特别是因为我不知道如何在一个项目中部署依赖于相同源文件的2个CocoaPods。如果这是唯一的解决方案,那么似乎将Git Submodules直接放入应用程序中更好,这样我就可以直接将其作为这些目标的一部分,那么
#if
应该就能正常工作了。问题在于,如果使用Git Submodules,将无法处理CocoaPod的依赖关系。因此,我真的必须以某种方式使用CocoaPods。我希望有一个简单的解决方案,不像那些看起来很hacky。那么,有没有更好的方法来处理这个问题并修复错误,而不需要重写大量代码,并且不是超级hacky的解决方案?
在评论中,建议使用
NSSelectorFromString
与UIApplication.responds
和UIApplication.perform
。问题在于,如果苹果公司改变API,代码将会崩溃,即使是对于先前版本的应用程序,因为它被动态调用,没有API未来证明。虽然那个解决方案听起来很容易,但似乎是一个非常糟糕的决定。
下面这篇回答看起来非常有前途。不幸的是,在评论中概述了一些更改后,它仍然无法正常工作,主应用程序具有Core subspec以及AppExtension subspec。
MyCustomSwiftPackage
,它是一个自定义的私有 CocoaPod。当然名字已经改变了。但是在这个例子/问题中,我对所有源代码都有完全的控制。问题是,我无法弄清楚如何在使用UIApplication.shared
的同时为应用程序和扩展使用一个干净的代码库。 - Charlie Fish