當前位置:首頁 » 編程軟體 » ios編譯framework

ios編譯framework

發布時間: 2022-10-29 15:51:44

⑴ iOS 製作自己的Framework(引入第三方庫)

一、創建工程並新建Framework Target

二、創建測試工程
Framework製作好了,我們需要一個Target測試一下吧。那麼直接在剛剛創建的這個工程裡面,新建一個Single View APP的Target就好了。

三、引入第三方庫
如果我們在製作Framework的時候,需要用到第三方庫怎麼辦呢?網上有輪子,而且有專人維護,總比我們自己造的強。但是如果公司有條件的話,最好是不引入第三方庫。
我們在引入第三方庫的時候,使用cocoapods進行管理,假設我們的SDK需要AFNetworking這個庫,按下面操作引入。

四、創建Framework打包腳本

五、運行

六、導出Framework給他人使用

本文完結。喜歡點個喜歡吧~~

⑵ iOS之Framework相關知識

lipo -info FramworkName.framework/FrameworkName
1、真機armv7、arm64
2、模擬器i386、x86_64

file FramworkName.framework/FrameworkName 如果有 dynamically 欄位的話是動態庫,反之為靜態庫

在項目中, 以Embedded Binaries 方式導入為動態庫;以Link Binary With Libraries 方式導入為靜態庫

1、手動合並 lipo -create 真機路徑 模擬器路徑 -output 真機路徑
2、自動合並腳本
(1)build Phases新建個Run Script輸入以下腳本

(2)先隨便選個模擬器編譯,(提示失敗沒問題),然後再選擇真機編譯下,提示成功即在工程的procts文件夾下可看到合並好的framework包

lipo -remove 架構名(i386) Framework.framework/FrameworkName -o Framework.framework/FrameworkName

1、分別拆分出不同架構的SDK
(1)創建不同架構的文件夾
(2) lipo FramworkName.framework/FrameworkName -thin 架構 -output 架構文件夾/FrameworkName
2、分別分解出 .o 文件
cd 架構文件夾
ar xv FrameworkName
3、分別去除和別人重復的 .o 文件
4、分別重新封裝 .o 文件為framework
ar rcs FrameworkName *.o
5、合並所有新封裝的SDK
lipo -create 文件1 文件2 文件3 文件4 -outout FrameworkName

⑶ iOS 靜態庫和動態庫打包framework流程(純swift版/swift、OC混編版)

選擇 iOS -- Framework&Library , 點擊 next

如果打包文件中使用了第三方庫,建議pod管理,並告知用戶使用pod安裝,避免用戶重復導入。跟平時開發邏輯一樣,打開 .xcworkspace 工程。

操作完之後工程目錄顯示

把打包需要的文件添加到項目中。 如果想要這個類或類裡面的方法被外面使用,需要配合pubic修飾供外面使用

由於以上獲取的framework只能在對應的版本上運行(即真機只能在設備上運行模擬器版本只能在模擬器上面運行使用),所以需要合並framework版本。
合並framework版本:
sudo lipo -create (此處請填寫真機AppVest文件路徑) (此處填寫模擬器AILLSDK文件路徑) -output 自定義合成文件存儲路徑(合成文件的名字AILLSDK)

因為真機版本和模擬器版本的framework都存在arm64架構,導致架構重復,不出意外,會提示合並失敗。如下

處理合並失敗的問題

最後,將 XX.framework(真機或者模擬器framework都可)文件夾 拷貝出來,替換AILLSDK(本文使用的)為剛才合並的新文件。
查看替換後的framework支持全部真機模擬器架構。

我在合並binary文件之後,僅拷貝出 Release-iphoneos 文件夾下的 XXX.framework ,並替換掉AILLSDK二進制文件。導入項目中使用模擬器運行,報錯,顯示找不到架構。

解決方案

拷貝所有的moles到

再替換掉AILLSDK二進制文件,導入項目,如果framework中內含第三方庫,需要在所在的工程中使用pod載入,否則會提示編譯失敗。
至此,編譯成功。🎉🎉🎉🎉🎉

不管是在framework封裝的內部,內部swift類調用內部的OC類,還是內部的OC類使用內部的swift類,還是外部工程swift類使用framework內部OC類,還是外部工程OC類使用framework內部swift類。原理是一致的,以下來介紹下:

在 AILLSDK.h(你自己創建framework時候生成的.h文件) 中添加import導入
#import <AILLSDK/OC類名.h>

在oc的 .m 或 .h 文件中,導入 #import <AILLSDK/AILLSDK-Swift.h> , 也就是 你自己framework名-Swift.h

⑷ iOS Aggregate生成.framework

選中TARGETS的工程 —> 點擊Editor —> 選擇Add Target —> 創建Aggregate —> 點擊Next創建

選擇剛剛創建的Aggregate —> 選中Build Phases —> 點擊左側+ —> 選擇 New Run Script Phase

復制腳本到剛剛新建的New Run Script Phase

復制完成如下圖所示

選擇剛剛創建的Aggreate —> 設備選擇Generic iOS Device(iOS通用設備) —> command + B 編譯

編譯成功,會自動跳出一個finder,即生成的.framework,支持真機和模擬器

問題描述:執行上述命令在部分項目會出現如下問題

解決方案:

⑸ iOS 打包framework(包含第三方framework或.a文件)

1.創建framework工程

2.將framework拖進工程中,工程分兩部分,一個是原始文件(紅色部分),一個是我需要進行封裝的文件(藍色部分):

3.將bitcode置為NO

4.1 選擇工程->targe->build setting,在搜索框中搜索linking,進行如下設置
4.2 將Build Active Architecture Only 設為 NO

5.1 把要公開的頭文件已到Public中去,在使用.framework時只能調用公開.h文件中的聲明。
5.2 完成上述步驟之後,在HYSDK.h文件中,把所有需要暴露的.h文件都用#import < HYSDK/PublicHeader.h>引入,記住一定要將所有的需要暴露的.h文件都寫在給定位置,不然編譯後生成的.framework在引用的時候會有警告;

6.開始編譯,選擇Generic iOS Device 或者 真機 或 模擬器,編譯一下,再選擇模擬器環境編譯一下

9.創建成功之後。新建工程。將新的framework再倒入進去。配置相關依賴庫即可。如果報找不到第三方的庫,則需要將第三方SDK.framework倒入進來即可。

⑹ iOS 在編譯時出現 framework not found XXXX框架

iOS 在編譯時出現 framework not found xxxx框架主要是由於你在添加框架時後期移除這個框架雖然被刪除了但是還是被引用了,在Other Linker Flags中被引用,所以在編譯時就會出現找不到這個框架

這時只要進入項目的Build Settings 找到Other Linker Flags中找到你的那個XXXX框架然後刪除,重新編譯就可以成功。

⑺ ios OC、swift混編製作framework

按照文檔一步一步來

新建一個基於單頁面工程,然後新建一個一個Target,選中Cocoa Touch Framework。然後,分別新建一個Swift文件和Objective C類,注意Target Member Ship選中Framework。類的內容如下:

OCSource.h

[圖片上傳失敗...(image-8dab68-1634619754604)]

OCSource.m

[圖片上傳失敗...(image-2c9071-1634619754604)]

Swift調用OC

新建SwiftSource.swift

[圖片上傳失敗...(image-34eca8-1634619754604)]

然後,按照文檔中,為了讓Swift文件訪問Objective C文件,我們應該在umbrella header,也就是MixFramework.h中,暴露所需要的header。

也就是,MixFramework.h,

[圖片上傳失敗...(image-b166c3-1634619754604)]

然後,自信滿滿的點擊build。

Boom~~~,編譯不通過。

[圖片上傳失敗...(image-6ca763-1634619754604)]

原因:OCSource.h默認編譯的時候是Project許可權. 為了在umbrella header中使用,要把這個文件的許可權改成Public

按照圖中的方式拖過去即可。

[圖片上傳失敗...(image-f2d31d-1634619754604)]

嗯,現在build,可以看到build成功了。

OC調用Swift

在SwiftSource.swift中,增加一個類,

[圖片上傳失敗...(image-98ce8c-1634619754604)]

然後,為了在OC中調用Swift的方法,我們需要導入頭文件,這時候,OCSource.m文件內容如下

[圖片上傳失敗...(image-f61fb3-1634619754604)]

然後,build,發現成功了,很開心。

外部調用

在ViewController.swift中,我們調用Framework中的內容。

[圖片上傳失敗...(image-6be19c-1634619754604)]

然後運行,發現控制台列印出

[圖片上傳失敗...(image-4b70-1634619754604)]

嗯,framework打包成功了。

問題

通常,我們希望暴露給外部的介面是純Swift,而OC文件的具體介面應該隱藏,這就是我標題中的優雅兩個字的含義。

如果你好奇,你會發現,在ViewController.swift中你可以這么調用

[圖片上傳失敗...(image-fefccf-1634619754604)]

也就是說,OC的內容也暴露出來了,這破壞了Framework的封裝特性。

通過查看MixFramework的編譯結果,發現最後暴露出的介面是這樣子的

[圖片上傳失敗...(image-8b0488-1634619754604)]

這一行,把OC對應的實現暴露出來了

[圖片上傳失敗...(image-9c74a7-1634619754604)]

優雅的解決方案

不再通過umbrella header的方式讓framework中的Swift調用OC方法。而是通過molemap。

新建一個mole.molemap文件,內容如下

[圖片上傳失敗...(image-633a91-1634619754604)]

[圖片上傳失敗...(image-d30f90-1634619754604)]

這里的#(SRCROOT)是XCode的宏,會自動替換成項目所在的根目錄,這里輸入的路徑是mole.molemap文件所在的路徑。

然後,刪除MixFramework.h(umbrella header)中#import 的OC header。

把OCSource.h的許可權改回默認的project。

[圖片上傳失敗...(image-291cca-1634619754604)]

再編譯,發現OC的類被隱藏了。

⑻ ios framework 製作和合並

1、 run -> debug 模式換成 release
2、默認創建的framework 是動態庫,在 build setting 設置 Mach-O type = StaticLibrary

3、輸入 在 build setting 設置 Build Active Architecture Only = NO 代表 當前輸出的是 支持所有設備, YES 是當前選擇的設備。

1創建 demo 工程,然後 在 file > save as workspace
關閉項目,打開 .workspace ,然後把 framework 工程拷貝到同目錄,在工程中拖入framework的 .project 文件, 在 run 的裡面可以選擇 framework或者demo工程,直接修改framework之後 command+b ,切換到demo 運行即可,調試

在xcode12之前,上面的操作,完全可以輸入合並的。

xcode12上出現的

我自己的做法是,在模擬器 command+b 的時候 修改配置項:

導出真機的時候,刪除加入的 arm64 執行 command+b ,
這樣再去合並。就能解決這個問題了。

貌似是swift版本的才有這個問題

在模擬器和真機合並framework之後,還會出現這個問題,就需要把 framework 中 Moles 的文件拷貝到合並的 framework 中:

如圖, -output 路徑為 Realse-iphoneos ,所以把 Realse-iphonesimulator->Moles 中的紅色標注,拷貝到 Realse-iphoneos 對應位置。
解決問題。

熱點內容
安卓70能用什麼軟體 發布:2025-05-16 01:45:09 瀏覽:480
編程發展史 發布:2025-05-16 01:38:52 瀏覽:528
android圖片氣泡 發布:2025-05-16 01:38:40 瀏覽:885
文件加密編輯器下載 發布:2025-05-16 01:30:41 瀏覽:343
linuxapacheyum安裝 發布:2025-05-16 01:30:31 瀏覽:476
大連賓利浴池wifi密碼是多少 發布:2025-05-16 01:25:36 瀏覽:172
緩存數據生產服務 發布:2025-05-16 01:08:58 瀏覽:584
普通電腦伺服器圖片 發布:2025-05-16 01:04:02 瀏覽:971
伺服器地址和埠如何區分 發布:2025-05-16 01:03:17 瀏覽:834
重新編目資料庫 發布:2025-05-16 00:54:34 瀏覽:514