簡體   English   中英

OSX和iOS共享swift模塊

[英]OSX and iOS shared swift module

我創建了名為TestLib基於swift的Cocoa Touch Framework項目,然后我為Cocoa Framework添加了名為TestLibOSX新目標。 當我在iOS應用程序上使用該框架時,似乎沒有任何問題,但是當我創建OSX控制台應用程序時,XCode抱怨它無法找到TestLibOSX模塊。 我錯過了什么嗎?

PS 不一樣:)

編輯:似乎這一定是可能的,因為我可以看到Lister以這種方式實現。

如果您希望創建單個動態框架二進制文件,可以按照以下步驟操作(如http://colemancda.github.io/programming/2015/02/11/universal-ios-osx-framework/中所述 ):

1.更改項目的有效體系結構和支持的平台。

這應該改變您的框架和測試單元的有效架構和支持的平台。 如果沒有,則手動更改它們以繼承項目的構建設置。

第一步

  • 基礎SDK:我推薦OS X,但它也適用於iOS。 請注意,使用iOS作為基本SDK時,“我的Mac”目標將分為3個不同的目標。

  • 支持的平台: macosx iphoneos iphonesimulator

  • 有效架構: arm64 armv7 armv7s i386 x86_64

2.更改單元測試包的搜索路徑

第二步

  • Runpath搜索路徑: $(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks

  • 框架搜索路徑: $(SDKROOT) $(inherited)

這將允許您將其導入為import MyFramework而不是

#if os(iOS)
    import MyFramework
#else
    import MyFrameworkOSX
#endif

好吧,通用框架真的很痛苦。 不僅適用於iOS和OSX,還適用於iOS內部,因為您需要2個框架:一個用於模擬器,一個用於設備。 處理iOS的方式是使用“聚合”目標。 我相信可以利用相同的途徑來集成OS X目標。

構建框架時,會得到一個.framework(lego block)文件夾。 在那里,有兩件非常重要的事情要做:

  1. “可執行文件”文件
  2. “模塊”文件夾

在這兩個地方,您必須具有實現以支持您希望支持的所有體系結構。 如果您在哪里單獨構建框架並希望將它們融合在一起,則必須執行以下操作:

  1. 獲取兩個可執行文件並使用“lipo”命令合並它們。
  2. 確保兩個“模塊”文件夾中的所有文件一起移動。

實際上,它是一團糟,所以這就是我的工作!

  • 首先,我構建框架。 它們可以在同一個項目中的不同目標上,但通常,相同的名稱有幫助。 僅對於iOS,只有一個框架,因此一個目標就足夠了。
  • 然后我添加一個“Aggregate”目標,它將幫助為不同的體系結構創建多個構建。
  • 單擊項目名稱,然后單擊Aggregate目標,我轉到“Build Phases”並單擊little plus以添加“New Run Script Phase”。
  • 在那里我復制粘貼 GIST中的代碼。
  • 最后,將您的方案更改為Aggregate目標並構建它將完成您需要的所有合並,並最終得到一個通用的.framework。

這個腳本非常簡單,有點涉及,我確信可以調整它來添加OSX支持。 我希望這能指出你正確的方向:)

腳本內容:

#!/bin/sh

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"

# Step 1. Build Device and Simulator versions
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"

# Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"

# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"

# Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"

# Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM