2017-07-26 9 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 :)現在將您的框架添加到想要的擴展中:)希望它有幫助。

相關問題