楔子
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


2. 配置framework各項(xiàng)編譯參數(shù)
2.1. 適配最低iOS SDK 版本


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

2.設(shè)置編譯打包時(shí)支持所有版本
Build Active Architecture Only 設(shè)置為NO

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ù)鏈接 |

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

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

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

3. 編譯生成framework
3.1. 編譯
command+B 選擇Generic iOS Device或一部真機(jī),Build在真機(jī)上跑的包

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

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

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

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及使用