2015-09-28 51 views
3

我的目標是創建一個包含Swift和Objective-C的iOS框架,我可以在我的開發項目中使用它。這個框架的本質是框架本身正在發展。所以,每次我使用這個框架構建項目(我將使用框架「使用」項目缺乏更好的術語來調用項目)時,重要的是我想確保框架本身被重新構建。我希望這是一個框架,因爲我有幾個使用應用程序,我希望使用相同的框架代碼。我一直在努力爭取今天的一大堆好處,並且浪費了大量的時間在本應該是的,至少在我看來,更容易。所以,我會分享我的過程。如何在包含Swift的iOS中創建開發框架?

回答

6

第一件要注意的事(這當然不是我第一次觀察!)是你不能這樣做使用iOS下的靜態庫。 Xcode不會讓你在靜態框架中使用Swift試試吧。 Xcode會否認你的願望!

下面是我結束的過程。我必須處理的兩個主要問題是:(i)使Xcode鏈接到使用項目中的框架而沒有錯誤,並且(ii)在使用項目中訪問框架的標題。在蘋果的啓發下,這兩個問題是分開的。注意諷刺。 )。

1)使用Xcode創建一個Cocoa Touch Framework。我相信這適用於Xcode6和Xcode7。用途:

文件>新建>項目>的iOS>框架&庫>可可觸摸 框架

我碰巧使用Xcode7。 (做不是做一個Cocoa Touch Static Library - 就像我上面說的,Xcode不會讓你將Swift合併到靜態庫中)。

2)用你的Swift類,確保成員和功能是public。我還沒有嘗試過這一點,但似乎公共屬性是成員和功能對框架用戶可見的必要條件。

3)將你想要的Swift類(和Objective-C)添加到你的框架中。

4)關閉該框架項目。 (同一個項目無法在Xcode中打開兩次,下一步您需要將框架合併到您使用的項目中)。

5)在Xcode中打開你使用的項目。對我來說這是一個現有的通用應用程序項目。您可能正在創建一個新的使用項目。無論如何,將Finder中的框架項目的.xcodeproj文件拖放到您使用的項目中。

6)在您使用的項目中,打開您的框架項目。然後在構建階段將框架文件拖入Embed Frameworks(當我第一次開始我的實驗時,Embed Frameworks部分未出現在構建階段,我不知道是什麼魔法導致它出現!)。

enter image description here

這些措施到目前爲止應該使您能夠構建和鏈接,而無需實際尚未整合你的庫代碼的使用。 (我在使用https://github.com/RadiusNetworks/swift-framework-example進行一些測試)。

7)現在對於coup de de grace:在Build Settings下,搜索Framework Search Paths。並添加:

${TARGET_BUILD_DIR}/YourFrameworkName.framework 

(看來你必須有這個標記爲遞歸)。

8)在您的銀行代碼文件中使用的框架,你需要在每個文件的頂部添加導入:

import YourFrameworkName 

您現在應該使用新的庫能夠構建和鏈接!

9)還有一個問題:確保您的框架的Deployment Target與您的目標項目匹配。例如,如果您的使用項目是爲iOS7構建的,請確保您的框架適用於iOS7或更早版本。我剛剛得知我的框架有必要將「App-Swift.h」(我爲此使用的名稱)作爲Objective-C生成的接口標題名稱在Build Settings中。當我將這個(Objective-C生成的接口頭文件)取出(試圖解決另一個問題)時,我得到了App-Swift.h中出現的一些有趣的問題。這些問題如下所示: "Cannot find interface declaration for NSObject"?

11)第三個問題(10/29/15):當我嘗試將第一個應用程序上傳到使用此框架的iTunes Connect時,出現上傳錯誤。錯誤閱讀:

ERROR ITMS-90206: 「無效的捆綁在 'Your.app/Frameworks/YourFramework.framework' 套裝中包含不允許的文件 '框架'。」

各種SO和其他帖子都遇到了這種錯誤,對於我來說,對於Framework目標來說,在Build Settings中將「Embedded Content Contains Swift Code」設置爲NO。 (我的應用程序生成設置已將此標誌設置爲否)。

與大多數的這些步驟完成一個例子項目是https://github.com/crspybits/CocoaTouchFramework.git

+0

是不是不安全給予框架,其他誰願意使用你的框架的總xocdeproject?它不會讓你的應用對所有人開放嗎? – Saty

+0

「讓您的應用程序對所有人開放」是什麼意思?正如我所提到的,這篇文章是在我自己的開發項目中進行的。我一直沒有把我的框架分發給其他一些安全問題或封閉源代碼問題。 –

+0

好吧然後它的好。謝謝王子... – Saty