2017-07-26 58 views
0

我正在尝试创建一个动态框架以在我的应用程序的各种扩展之间共享代码。这是使用嵌入式可可豆荚创建动态/嵌入式框架的正确方法吗?

问题:

这里是我的项目结构。

enter image description here

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 

在构建框架时,我将其作为嵌入式二进制拖动到我的主项目中时出现错误。

使dyld:库未加载:.framework/Alamofire从引用: /Users/sandeep/Library/Developer/Xcode/DerivedData/CocoaPodsProjectworkspace-enpobdyluhbxdwazuvbfogcspfof/Build/Products/Debug-iphonesimulator/MyFramework.framework/MyFramework 原因:没有找到图片

解决方案我想:

  • 声明的pods_frameworks.framework为在链接的 二进制文件中可选。
  • 尝试更改RunPath框架的搜索路径动态库
  • 安装名称再次运行pod分解并运行pod安装。
  • 删除派生数据和重新链接框架都导致相同的 问题。

解决方案奏效:

我意识到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

通过为我的自定义框架创建一个可可豆荚并使用可可豆荚依赖来解决此问题。

第1步:清洁主/父项目

    从项目(这是添加子 项目)
  • 删除MyFramework和删除MyFramework.framework在项目一般设置嵌入式库添加。
  • 运行pod deintegrate
  • (已加入到
    项目荚反积分)现在,该项目是干净的,没有任何荚添加 运行pod init

步骤初始化荚2:我的框架

  • 使用cd命令导航到MyFramework项目创建一个吊舱,一旦你是 MyFramework的根文件夹运行pod spec create MyFramework
  • 这将在 MyFramework的根文件夹中创建一个名为MyFramework.podspec的文件。打开MyFramework.podspec如图教程https://www.raywenderlich.com/126365/ios-frameworks-tutorial

  • 这是不是有在本教程中最重要的一步是如何添加我们的框架需要建立 可可豆荚依赖使用任何 编辑工具和更新。结果是 这是最容易的部分。在我来说,我需要SwiftyJSON和我说.podspec文件 Alamofire所以,

s.dependency 'Alamofire'

s.dependency 'SwiftyJSON'

步骤3:

  • 现在打开Main/Parent项目Podfile并更新它,如下面显示的 所示。
target 'CocoaPodsProject' do 
    use_frameworks! 
    pod 'TestFramework', :path => 'TestFramework/' 
end 

它的所作所为,它告诉主项目中添加TestFramework的依赖,并在主体工程的框架文件夹中安装TestFramework。由于TestFramework本身具有依赖性Alamofire & SwiftyJSON当您运行pod install它不仅会安装Alamofire而且安装SwiftyJSON并将其添加到TestFramework's框架文件夹。

就是这样。现在,您的TestFramework可以访问AlamofireSwiftyJSON和主/专利项目可以访问TestFramework

如果你想现在更新TestFramework代码,直到ü完成开发其添加为子项目主项目(这是必要的,因为如果你打开TestFramework。 xcproj u将不会看到Alamofire/Swifty JSON。您必须打开Parent项目的工作空间本身,因此此解决方案)。一旦你完成开发,如果你决定删除TestFramework作为子项目,你可以做到这一点:)

最后如果你决定添加额外的扩展到应用程序,让我们说你添加今天扩展所有你要做的就是修改你的Podfile如下。

target 'CocoaPodsProject' do 
    use_frameworks! 
    pod 'TestFramework', :path => 'TestFramework/' 
end 

target 'CocoapodsToday' do 
    use_frameworks! 
    pod 'TestFramework', :path => 'TestFramework/' 
end 

Woo hooo :)现在将您的框架添加到想要的扩展中:)希望它有帮助。

相关问题