從CPU架構(gòu)到 Xcode8 創(chuàng)建 framework 那些事兒

楔子

framework只暴露少許接口卻能實(shí)現(xiàn)強(qiáng)大功能,簡(jiǎn)直把封裝做到了極致。本文以Xcode8.3.3為工具,介紹怎么簡(jiǎn)潔有效的新鮮出爐一個(gè)熱乎的framework。順帶給看官朋友們贈(zèng)送了CPU架構(gòu)和lipo操作靜態(tài)包的點(diǎn)心,希望合乎大家口味。

GitHub demo 地址 https://github.com/guoxiangyang110/iOSSDKDemo

知識(shí)點(diǎn)

大家都知道計(jì)算機(jī)CPU又稱中央處理器,X86和ARM兩種架構(gòu)幾乎是當(dāng)今世界CPU類型的兩大王者。

  • X86

X86是英特爾Intel首先開發(fā)制造的一種微處理器體系結(jié)構(gòu)的泛稱,包括Intel8086、80186、80286、80386以及80486以86結(jié)尾系列,英特爾統(tǒng)治整個(gè)CPU產(chǎn)業(yè)鏈長達(dá)數(shù)十年,是PC端當(dāng)之無愧的王者。使用的是復(fù)雜指令集。

  • ARM

ARM(Advanced RISC Machines)公司是蘋果、Acorn、VLSI、Technology等公司的合資企業(yè)。ARM采用將芯片的設(shè)計(jì)方案授權(quán)(licensing)給其他公司生產(chǎn)的模式,在世界范圍結(jié)成了超過100個(gè)的合作伙伴(Partners),將封閉設(shè)計(jì)的Intel公司變成全民公敵。現(xiàn)在幾乎所有的智能手機(jī)CPU 都是 采用 ARM架構(gòu),Apple的A系列處理器也是在ARM結(jié)構(gòu)之上的。ARM在便攜式設(shè)備的地位也是無人能及。ARM用的是精簡(jiǎn)指令集。

欲知詳情,且看這篇文章:ARM與X86 CPU架構(gòu)對(duì)比區(qū)別


認(rèn)真看看下面列表,認(rèn)真看看下面列表,認(rèn)真看看下面列表,回過頭來再看。

CPU架構(gòu) 對(duì)應(yīng)設(shè)備
armv6 iPhone, iPhone2, iPhone 3G, 第一代、第二代iPod Touch
armv7 iPhone 3GS,iPhone 4,iPhone 4S, iPad ,iPad 2,iPod Touch 3G,iPod Touch 4
armv7s iPhone 5,iPhone 5c, iPad4
arm64 iPhone 5S,iphone6,iphone6plus,iPhone6s,iPhone6s Plus,iPhone7,iPhone7 Plus, iPad Air
i386 Mac上跑32位模擬器
x86_64 Mac上跑64位模擬器

terminal lipo命令
有興趣的同學(xué)可以戳這篇文章: lipo命令

lipo 用途
lipo -create [真機(jī)包路徑] [模擬器包路徑] -output [合并包輸出路徑] 合并靜態(tài)包
lipo -thin [合并包路徑] -output [拆分包路徑] 拆分靜態(tài)包
lipo -info [包路徑] 查看包信息

干貨

1. 創(chuàng)建一個(gè) iOS framework 項(xiàng)目

打開Xcode,選中 iOS-->Cocoa Touch Framework

創(chuàng)建framework

SDK信息

2. 配置framework各項(xiàng)編譯參數(shù)

2.1. 適配最低iOS SDK 版本
PROJECT SDK
TARGET SDK
2.2. Build Settings設(shè)置

1.添加armv7s 適配iPhone5、iPhone 5c
Xcode6后,默認(rèn)不支持armv7s,需要選擇是否支持armv7s

添加armv7s.png

2.設(shè)置編譯打包時(shí)支持所有版本

Build Active Architecture Only 設(shè)置為NO

打包所有版本.png

3.鏈接設(shè)置
選擇工程文件>target>Build Setting>linking

項(xiàng)目 作用
Mach-O Type Static Library framework可以是動(dòng)態(tài)庫也可以是靜態(tài)庫,系統(tǒng)的framework是動(dòng)態(tài)庫,用戶制作的framework只能是靜態(tài)庫
Dead Code Stripping NO 現(xiàn)在設(shè)置為YES似乎也行
Link With Standard Libraries NO 避免重復(fù)鏈接
靜態(tài)設(shè)置.png

4.添加 UIKit

用到UIKit框架內(nèi)容的需要將UIKit框架添加進(jìn)去一起打包,否則framework建成之后相關(guān)部分會(huì)出現(xiàn)問題,此處特別需要注意

添加UIKit.png

5.設(shè)置公開權(quán)限
設(shè)置公開和非公開的文件,也就是framework里headers文件夾下顯露的文件
TARGET-->Build Phases-->headers

設(shè)置暴露文件.png

設(shè)置SDK公開的頭文件,使用時(shí)只需引入#import <MySDK/MySDK.h>即可

設(shè)置暴露頭文件.png

3. 編譯生成framework

3.1. 編譯

command+B 選擇Generic iOS Device或一部真機(jī),Build在真機(jī)上跑的包

編譯真機(jī)對(duì)應(yīng)的包

command+B 選擇任一模擬器,Build在模擬器上跑的包

編譯模擬器對(duì)應(yīng)的包
3.2. 合并

在terminal用命令行合并兩個(gè)包,使framework同時(shí)適用于真機(jī)和模擬器
先找到之前build的framework

找到生成framework.png

生成的真機(jī)包路徑:Debug-iphoneos-->MySDK.framework-->MySDK
生成的模擬器包路徑:Debug-iphonesimulator-->MySDK.framework-->MySDK

找到生成的包.png

terminal 執(zhí)行合并命令,指定目錄生成合并包
lipo -create [真機(jī)包路徑] [模擬器包路徑] -output [合并包輸出路徑]

bogon:~ guoxiangyang$ lipo -create /Users/guoxiangyang/Library/Developer/Xcode/DerivedData/MySDK-dnpdqcirtujccudetmplklzdxttf/Build/Products/Debug-iphoneos/MySDK.framework/MySDK  /Users/guoxiangyang/Library/Developer/Xcode/DerivedData/MySDK-dnpdqcirtujccudetmplklzdxttf/Build/Products/Debug-iphonesimulator/MySDK.framework/MySDK  -output /Users/guoxiangyang/Desktop/Test/text/MySDK

terminal 執(zhí)行命令,查看合并包的信息,支持 armv7 armv7s i386 x86_64 arm64,符合各真機(jī)及模擬器的要求

bogon:~ guoxiangyang$ lipo -info /Users/guoxiangyang/Desktop/Test/text/MySDK
Architectures in the fat file: /Users/guoxiangyang/Desktop/Test/text/MySDK are: armv7 armv7s i386 x86_64 arm64
3.3. 組合framework

用輸出的MySDK替換掉前面Debug-iphoneos中framework中的MySDK
將做好的framework直接拖入要使用的工程中

然后直接引入開放頭文件即可

#import <MySDK/MySDK.h>

他山之石

本文特別感謝包括并不限于以下優(yōu)秀文章:
iOS開發(fā):Framework的創(chuàng)建
ios開發(fā):Xcode8制作framework及使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容