我正在尝试创建一个动态框架以在我的应用程序的各种扩展之间共享代码。
问题:
这是我的项目结构。
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引用自:
/用户/ sandeep /库/开发人员/Xcode/DerivedData/CocoaPodsProjectworkspace-enpobdyluhbxdwazuvbfogcspfof/Build/Products/Debug-iphonesimulator/MyFramework.framework/MyFramework
原因:找不到图片
我尝试过的解决方案:
二进制文件。
问题。
有效的解决方案:
我意识到MyFramework.framework试图在错误的目录中找到Alamofire.framework,并且一直试图使用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仓库上提出了同样的问题。但是,因为这并不是天生的问题,所以他们可能不会恢复原状。因此,将其作为问题发布在此处。如果有帮助,请链接到https://github.com/CocoaPods/CocoaPods/issues/6901。
最佳答案
通过为我的自定义框架创建可可豆荚并使用可可豆荚依赖关系来解决此问题。
步骤1:清理主/父项目
项目),然后删除在项目的嵌入式库中添加的MyFramework.framework常规设置。
pod deintegrate
(去整合已经添加到其中的pod专案)
通过运行
pod init
步骤2:为我的框架ojid_rstrong创建一个Pod
MyFramework的根文件夹运行
pod spec create MyFramework
MyFramework的根文件夹。使用以下任意一种打开MyFramework.podspec
编辑器工具并按照教程https://www.raywenderlich.com/126365/ios-frameworks-tutorial
我们的框架需要构建的可可豆荚依赖关系。原来
多数民众赞成在最简单的部分。就我而言,我需要
SwiftyJSON
和Alamofire
,所以我在.podspec文件中添加了s.dependency“Alamofire”
s.dependency'SwiftyJSON'
步骤3:
Podfile
并更新它,如下所示下面。
target 'CocoaPodsProject' do
use_frameworks!
pod 'TestFramework', :path => 'TestFramework/'
end
它所做的是,它告诉主项目添加TestFramework作为依赖项,并将TestFramework安装在主项目的Framework文件夹中。由于TestFramework本身在运行
Alamofire
时具有对SwiftyJSON
和pod install
的依赖关系,因此它不仅会安装Alamofire
,还会安装SwiftyJSON
,并将其添加到TestFramework's
Framework文件夹中。就这样。现在您的TestFramework可以访问
Alamofire
和SwiftyJSON
,并且Main / Patent项目可以访问TestFramework
如果现在要更新TestFramework代码,请在完成开发之前将其作为子项目添加到Main项目中(这是必要的,因为如果打开TestFramework.xcproj,您将看不到Alamofire / Swifty JSON。必须打开父项目的工作区本身因此此解决方案)。一旦完成开发,如果您决定删除TestFramework作为子项目,则可以执行此操作:)
最后,如果您决定向应用程序添加其他扩展名,可以说您添加“今天”扩展名,您要做的就是如下修改ur Podfile。
target 'CocoaPodsProject' do
use_frameworks!
pod 'TestFramework', :path => 'TestFramework/'
end
target 'CocoapodsToday' do
use_frameworks!
pod 'TestFramework', :path => 'TestFramework/'
end
哇哦:)现在,将您的框架添加到所需的许多扩展中:)希望能有所帮助。