我正在尝试创建一个动态框架,以便在我的应用的各种扩展中共享代码。
问题:
这是我的项目结构。
MyFrameworks是我的应用程序的网络层,它固有地使用Alamofire。所以我的pod文件的结构如下。
platform :ios, '9.0'
use_frameworks!
workspace 'CocoaPodsProjectworkspace'
def shared_pods
pod 'Alamofire'
pod 'SwiftyJSON'
end
target 'CocoaPodsProject' do
project 'CocoaPodsProject.xcodeproj'
# Pods for CocoaPodsProject
end
target 'MyFramework' do
project 'MyFramework/MyFramework.xcodeproj'
shared_pods
end
target 'CocoaPodsProjectTests' do
end
target 'CocoaPodsProjectUITests' do
end
当我将它作为嵌入式二进制文件拖到我的Main项目时构建框架时,我得到了错误。
dyld:未加载库:.framework / Alamofire参考自: /Users/sandeep/Library/Developer/Xcode/DerivedData/CocoaPodsProjectworkspace-enpobdyluhbxdwazuvbfogcspfof/Build/Products/Debug-iphonesimulator/MyFramework.framework/MyFramework 原因:未找到图像
我尝试过的解决方案:
有效的解决方案:
我意识到MyFramework.framework试图在错误的目录中找到Alamofire.framework,并且总是尝试使用框架搜索相对于项目/目标。因此,我能找到的最简单的解决方案是修改pod文件,如下所示。
platform :ios, '9.0'
use_frameworks!
workspace 'CocoaPodsProjectworkspace'
def shared_pods
pod 'Alamofire'
pod 'SwiftyJSON'
end
target 'CocoaPodsProject' do
project 'CocoaPodsProject.xcodeproj'
shared_pods
# Pods for CocoaPodsProject
end
target 'MyFramework' do
project 'MyFramework/MyFramework.xcodeproj'
shared_pods
end
target 'CocoaPodsProjectTests' do
end
target 'CocoaPodsProjectUITests' do
end
正如您所看到的,我将shared_pods添加到主应用程序和我的框架项目及其各自的目标。现在一切顺利。我既不需要pods_framework可选,也不必修改MyFramework的构建设置。
问题:
将共享存储库添加到想要使用我的框架的所有项目及其目标看起来并不多余。有没有更好的方法我可以指定Myframework.framework来读取所有依赖项而不是使用它来读取项目?
我在CocoaPods Git repo上提出了同样的问题。但是因为它本身并不是一个问题,所以它们可能不会回归。因此,将其作为问题发布在此处。如果有帮助,请发布:https://github.com/CocoaPods/CocoaPods/issues/6901。
答案 0 :(得分:0)
通过为我的自定义框架创建一个cocoa pod并使用cocoa pods依赖来解决它。
步骤1:清除主/父项目
pod deintegrate
(将已添加的广告已取消集成到
项目)pod init
第2步:为我的框架创建一个Pod
pod spec create MyFramework
这将在。中创建一个名为MyFramework.podspec的文件 MyFramework的根文件夹。使用任何一个打开MyFramework.podspec 编辑器工具并按照教程https://www.raywenderlich.com/126365/ios-frameworks-tutorial
本教程中没有的最重要步骤是如何添加
我们的框架需要构建的可可pod依赖项。结果
这是最容易的部分。就我而言,我需要SwiftyJSON
和
Alamofire
所以在我添加的.podspec文件中,
s.dependency'Alamofire'
s.dependency'SwiftyJSON'
第3步:
Podfile
并按如图所示进行更新
下方。target 'CocoaPodsProject' do use_frameworks! pod 'TestFramework', :path => 'TestFramework/' end
它做的是,它告诉主项目将TestFramework添加为依赖项并在主项目的Framework文件夹中安装TestFramework。因为TestFramework本身依赖于Alamofire
& SwiftyJSON
当您运行pod install
时,它不仅会安装Alamofire
,还会安装SwiftyJSON
并将其添加到TestFramework's
Framework文件夹。
多数民众赞成。现在,您的TestFramework可以访问Alamofire
和SwiftyJSON
,主要/专利项目可以访问TestFramework
如果你想现在更新TestFramework代码,直到你完成开发将它作为子项目添加到Main项目(这是必要的,因为如果你打开TestFramework.xcproj你将看不到Alamofire / Swifty JSON。你必须打开Parent项目的工作空间本身因此这个解决方案)。一旦你完成开发,如果你决定删除TestFramework作为子项目,你可以这样做:)
最后如果你决定为app增加额外的扩展,让我们说你添加今天的扩展,你所要做的就是修改你的Podfile,如下所示。
target 'CocoaPodsProject' do
use_frameworks!
pod 'TestFramework', :path => 'TestFramework/'
end
target 'CocoapodsToday' do
use_frameworks!
pod 'TestFramework', :path => 'TestFramework/'
end
Woo hooo :)现在将您的框架添加到您想要的任意数量的扩展中:)希望它有所帮助。