iOS Framework 實用開發(fā)技巧

時間:2020年7月

版本:Xcode 11.5 (11E608c)

語言:Objective-C

作者:非著名程序員


介紹自己在實際開發(fā)SDK過程中遇到的實際問題割捅,以及解決方案。僅供參考帚桩。

  1. Framework與主工程(App)實時聯(lián)調
  2. Framework亿驾、主工程(App)以及 Pod 等三個工程實時聯(lián)調
  3. 使用腳本合并真機、模擬器等多種架構的Framework
  4. Framework中使用.bundle資源文件
  5. Framework中使用Category
  6. Framework支持bitcode


一账嚎、Framework與主工程(App)實時聯(lián)調

① 為什么需要實時聯(lián)調莫瞬?

首先說明,F(xiàn)ramework指的是我們自己開發(fā)的Framework(SDK)郭蕉,主工程(App)泛指那些要接入你的SDK的App乏悄。

朕之前在寫SDK進行調試的時候都是先創(chuàng)建一個Framework的工程,代碼都寫完之后打包成Framework靜態(tài)庫恳不,然后再把Framework拉到App的主工程中去驗證功能檩小。這樣的調試方式沒什么不可以,但是非常的浪費時間烟勋,需要一遍又一遍的打包Framework规求,而且Framework中的問題不可以打斷點排查。

② 實時聯(lián)調最終要達到什么效果卵惦?

實時聯(lián)調最終要達到的效果是:僅需要讓主工程跑起來就可以同時調試Framework和App兩個工程的代碼阻肿。

這樣一來,F(xiàn)ramework不用每次都去打包一遍沮尿,再拖進App工程丛塌。大致的流程可以理解為:先build Framework较解,F(xiàn)ramework編譯完成后自動添加到App中,最后build App赴邻。


③ 干

1. 創(chuàng)建App工程印衔,命名為RealDemo

image.png


2. 創(chuàng)建Framework工程,命名為RealSDK

image.png

注意路徑姥敛!

image.png


3. 設置Framework工程的Build Settings

image.png
image.png
image.png


4. 創(chuàng)建WorkSpace奸焙,命名為RealDemo

image.png

注意路徑!

image.png


5. 連接Framework工程和App工程

打開 RealDemo.xcworkspace彤敛,毫無疑問与帆,空空如也


image.png

直接把需要連接的Framework工程和App工程拖進來即可


image.png

哎~你瞧,這就有了


image.png


6. 把Framework添加到App工程中

image.png
image.png

添加完是這樣的


image.png




有過SDK開發(fā)經驗的道友到這里應該已經看明白了墨榄,所謂實時聯(lián)調說白了就是用WorkSpace把兩個工程連接起來而已玄糟,跟Pod的原理有幾分相似。

繼續(xù)袄秩,咱們驗證一下


7. 給Framework加點功能

增加一個RealDog類茶凳,定義一個eat方法,實現(xiàn)里面打印一句話“吃骨頭”播揪。最后在SDK的公開頭文件RealSDK.h中集中引用一下贮喧。

image.png

// RealDog.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface RealDog : NSObject

- (void)eat;

@end

NS_ASSUME_NONNULL_END
// RealDog.m

#import "RealDog.h"

@implementation RealDog

- (void)eat {
    NSLog(@"吃骨頭");
}

@end

// RealSDK.h

#import <Foundation/Foundation.h>

//! Project version number for RealSDK.
FOUNDATION_EXPORT double RealSDKVersionNumber;

//! Project version string for RealSDK.
FOUNDATION_EXPORT const unsigned char RealSDKVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <RealSDK/PublicHeader.h>


#import <RealSDK/RealDog.h>


8. 在App的ViewController調用一下SDK的方法

// ViewController.m

#import "ViewController.h"
#import <RealSDK/RealSDK.h>

@interface ViewController ()

@property (nonatomic, strong) RealDog *dog;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.dog = [[RealDog alloc] init];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self.dog eat];
}

@end

OK,實時聯(lián)調到此結束猪狈。


二箱沦、Framework、主工程(App)以及 Pod 等三個工程實時聯(lián)調

再加上Pod之后雇庙,三個工程實時聯(lián)調其實也沒什么難的谓形,只要保證剛剛第一部分的工程文件夾層級關系,然后直接創(chuàng)建Podfile疆前,pod install即可寒跳。

image.png

注意:此處Podfile里面的target是RealDemo!

platform :ios, '10.0'

target 'RealDemo' do
  
  pod 'AFNetworking', '~> 4.0.1'
  
end

三個工程順利組到一起竹椒,全部可實時聯(lián)調童太。

image.png

三、使用腳本合并真機胸完、模擬器等多種架構的Framework

  1. 添加一個Aggregate Target书释。路徑:RealSDK Project -> TARGETS -> "+"(左下角) -> Cross-platform - Other -> Aggregate
    WX20200718-110427@2x.png


  1. Aggregate Target 命名為“RealDemo-Script”
    WX20200718-110553@2x.png

    WX20200718-110835@2x.png


  1. 依賴RealSDK


    WX20200718-112151@2x.png


  1. 添加腳本


    WX20200718-112823@2x.png

    WX20200718-113154@2x.png

腳本源碼

這個腳本是通用的,各位道友直接復制粘貼即可~

# Type a script or drag a script file from your workspace to insert its path.
UNIVERSAL_OUTPUTFOLDER=../Framework/

# 創(chuàng)建輸出目錄赊窥,并刪除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
rm -rf "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework"

# 分別編譯模擬器和真機的Framework
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}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

# 定義真機爆惧、模擬器Build文件夾路徑變量
IPHONE_BUILD=${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_BUILD=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework

# 拷貝framework到univer目錄
cp -R "${IPHONE_BUILD}" "${UNIVERSAL_OUTPUTFOLDER}/"

#cp -R "${SIMULATOR_BUILD}" "${UNIVERSAL_OUTPUTFOLDER}/"

# 定義輸出路徑變量
OUTPUT_PATH=${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework

# 合并framework,輸出最終的framework到build目錄 
lipo -create "${IPHONE_BUILD}/${PROJECT_NAME}" "${SIMULATOR_BUILD}/${PROJECT_NAME}" -output "${OUTPUT_PATH}/${PROJECT_NAME}"



  1. 運行腳本


    WX20200718-120005@2x.png


  1. 運行結果


    WX20200718-115622@2x.png


  1. 檢驗一下是否合成成功


    WX20200718-120516@2x.png

四锨能、Framework中使用.bundle資源文件

  1. 首先扯再,我們先隨便創(chuàng)建一個Bundle工程芍耘。


    WX20200718-152228.png


  1. Bundle工程命名為RealSDKResource。在Build Settings中修改Base SDK為iOS熄阻。
    WX20200718-152500.png


  1. 去掉Bundle文件的info.plist文件
    WX20200718-153145.png


  1. 修改Bundle文件名稱(可依需求選擇)


    WX20200718-153421.png


  1. 將Versioning System設置為None斋竞,默認Xcode會通過agvtool生成對應的版本信息,并打包進bundle文件中饺律,這會導致后續(xù)在SDK跟隨使用的App提交到AppStore的時候報錯窃页。


    WX20200718-153623.png


  1. 加一張圖片資源跺株,打包


    WX20200718-160219.png

    WX20200718-160246.png


  1. 測試一下RealSDK是否可以引用Bundle資源复濒,SDK中什么都不用設置,直接引用Bundle資源即可乒省。注意引用Bundle資源的方式:用字符串路徑讀取圖片巧颈。還可以用NSBundle獲取文件。
WX20200718-160609.png

用NSBundle獲取文件

WX20200718-161242.png


  1. 把Bundle文件拖到App工程中袖扛,寫一個測試代碼
WX20200718-161415.png


  1. 運行起來砸泛,看一下效果,OJBK
WX20200718-161706.png

五蛆封、Framework中使用Category

在Framework工程的Build Setting中添加-ObjC唇礁。另外,使用我們SDK的App的Build Setting中也要添加-ObjC惨篱。

在網上看到有人建議用-all_load盏筐,我個人建議使用-ObjC足矣。-all_load會比-ObjC范圍更大移袍,沒有必要的事情就不要做赁温,免得浪費性能业栅。具體區(qū)別我就不在這里具體說了,網上一大片漾抬。

六、Framework支持bitcode

WX20200718-165002.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末常遂,一起剝皮案震驚了整個濱河市纳令,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌克胳,老刑警劉巖泊碑,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毯欣,居然都是意外死亡馒过,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門酗钞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腹忽,“玉大人来累,你說我怎么就攤上這事【阶啵” “怎么了嘹锁?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長着裹。 經常有香客問我领猾,道長,這世上最難降的妖魔是什么骇扇? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任摔竿,我火速辦了婚禮,結果婚禮上少孝,老公的妹妹穿的比我還像新娘继低。我一直安慰自己,他們只是感情好稍走,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布袁翁。 她就那樣靜靜地躺著,像睡著了一般婿脸。 火紅的嫁衣襯著肌膚如雪粱胜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天狐树,我揣著相機與錄音焙压,去河邊找鬼。 笑死褪迟,一個胖子當著我的面吹牛冗恨,可吹牛的內容都是我干的。 我是一名探鬼主播味赃,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼掀抹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了心俗?” 一聲冷哼從身側響起傲武,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎城榛,沒想到半個月后揪利,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡狠持,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年疟位,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喘垂。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡甜刻,死狀恐怖绍撞,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情得院,我是刑警寧澤傻铣,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站祥绞,受9級特大地震影響非洲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蜕径,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一两踏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丧荐,春花似錦缆瓣、人聲如沸喧枷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隧甚。三九已至车荔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戚扳,已是汗流浹背忧便。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帽借,地道東北人珠增。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像砍艾,于是被迫代替她去往敵國和親蒂教。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348