iOS靜態(tài)庫封裝

萬能的老板想把產(chǎn)品做成插件式,讓更多的人能參與到產(chǎn)品的研發(fā),又不讓外人看到源碼,所以默默的學(xué)習(xí)怎么才能封裝一個(gè)真機(jī)和模擬器一起使用的靜態(tài)庫,再此分享下學(xué)習(xí)的成果,話不多說:

一、新建靜態(tài)庫工程

首先簡(jiǎn)歷一個(gè)靜態(tài)庫文件:



接下來給你的靜態(tài)庫命名(在此博主以MyFirstStaticLib作為例子):


二、功能實(shí)現(xiàn)和添加

接下來在.h文件中寫出需要暴露出給外部使用的接口或者參數(shù):

#import


@interfaceMyFirstStaticLib?:?NSObject

-?(NSInteger)addNumA:(NSInteger)AandNumB:(NSInteger)B;

@end


再.m文件中實(shí)現(xiàn)功能:

#import "MyFirstStaticLib.h"

@implementationMyFirstStaticLib

-?(NSInteger)addNumA:(NSInteger)AandNumB:(NSInteger)B{

returnA+B;

}

@end

三、給所建立的靜態(tài)庫暴露頭文件



將需要暴露的頭文件加入Public中:


修改共有文件(需要暴露的文件)的路徑(改為:include/$(PROJECT_NAME)):



四、編譯:CMD+B

此時(shí)可以發(fā)現(xiàn)libMyFirstStaticLib.a文件由紅變黑,證明編譯成功。


由于默認(rèn)的是Debug模式,所以編譯出來的是模擬器使用的版本,所以在libMyFirstStaticLib.a路徑下只發(fā)現(xiàn)有個(gè)Debug-iphoneos文件夾:


為了讓真機(jī)可以使用我們的靜態(tài)庫,所以需要更改編譯模式為Release:


再次編譯CMD+B,發(fā)現(xiàn)目錄下多出文件Release-iphoneos



五、建造一個(gè)Framework


得到新的標(biāo)簽:


修改標(biāo)簽名為Build Framework:


修改此標(biāo)簽中得腳本文件內(nèi)容:


代碼為:

set -e

exportFRAMEWORK_LOCN="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework"

#?Create?the?path?to?the?real?Headers?die

mkdir?-p"${FRAMEWORK_LOCN}/Versions/A/Headers"

#?Create?the?required?symlinks

/bin/ln?-sfh?A"${FRAMEWORK_LOCN}/Versions/Current"

/bin/ln?-sfh?Versions/Current/Headers"${FRAMEWORK_LOCN}/Headers"

/bin/ln?-sfh"Versions/Current/${PRODUCT_NAME}"\

"${FRAMEWORK_LOCN}/${PRODUCT_NAME}"

#?Copy?the?public?headers?into?the?framework

/bin/cp?-a"${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/"\

"${FRAMEWORK_LOCN}/Versions/A/Headers"


再編譯CMD+B。



六、整合模擬器版本和真機(jī)版本。

添加Target:aggregate07



增加依賴項(xiàng):



增加腳本文件:

更改腳本命和腳本內(nèi)容:


腳本命:MultiPlatform Build

腳本內(nèi)容:

set -e

#?If?we're?already?inside?this?script?then?die

if[?-n"$RW_MULTIPLATFORM_BUILD_IN_PROGRESS"];?then

exit?0

fi

exportRW_MULTIPLATFORM_BUILD_IN_PROGRESS=1

RW_FRAMEWORK_NAME=${PROJECT_NAME}

RW_INPUT_STATIC_LIB="lib${PROJECT_NAME}.a"

RW_FRAMEWORK_LOCATION="${BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework"

functionbuild_static_library?{

#?Will?rebuild?the?static?library?as?specified

#?????build_static_library?sdk

xcrun?xcodebuild?-project"${PROJECT_FILE_PATH}"\

-target"${TARGET_NAME}"\

-configuration"${CONFIGURATION}"\

-sdk"${1}"\

ONLY_ACTIVE_ARCH=NO?\

BUILD_DIR="${BUILD_DIR}"\

OBJROOT="${OBJROOT}"\

BUILD_ROOT="${BUILD_ROOT}"\

SYMROOT="${SYMROOT}"$ACTION

}

functionmake_fat_library?{

#?Will?smash?2?static?libs?together

#?????make_fat_library?in1?in2?out

xcrun?lipo?-create"${1}""${2}"-output"${3}"

}

#?1?-?Extract?the?platform?(iphoneos/iphonesimulator)?from?the?SDK?name

if[["$SDK_NAME"=~?([A-Za-z]+)?]];?then

RW_SDK_PLATFORM=${BASH_REMATCH[1]}

else

echo"Could?not?find?platform?name?from?SDK_NAME:?$SDK_NAME"

exit?1

fi

#?2?-?Extract?the?version?from?the?SDK

if[["$SDK_NAME"=~?([0-9]+.*$)?]];?then

RW_SDK_VERSION=${BASH_REMATCH[1]}

else

echo"Could?not?find?sdk?version?from?SDK_NAME:?$SDK_NAME"

exit?1

fi

#?3?-?Determine?the?other?platform

if["$RW_SDK_PLATFORM"=="iphoneos"];?then

RW_OTHER_PLATFORM=iphonesimulator

else

RW_OTHER_PLATFORM=iphoneos

fi

#?4?-?Find?the?build?directory

if[["$BUILT_PRODUCTS_DIR"=~?(.*)$RW_SDK_PLATFORM$?]];?then

RW_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}"

else

echo"Could?not?find?other?platform?build?directory."

exit?1

fi

#?Build?the?other?platform.

build_static_library"${RW_OTHER_PLATFORM}${RW_SDK_VERSION}"

#?If?we're?currently?building?for?iphonesimulator,?then?need?to?rebuild

#???to?ensure?that?we?get?both?i386?and?x86_64

if["$RW_SDK_PLATFORM"=="iphonesimulator"];?then

build_static_library"${SDK_NAME}"

fi

#?Join?the?2?static?libs?into?1?and?push?into?the?.framework

make_fat_library"${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}"\

"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}"\

"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}"

#?Ensure?that?the?framework?is?present?in?both?platform's?build?directories

cp?-a"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}"\

"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework/Versions/A/${RW_FRAMEWORK_NAME}"

#?Copy?the?framework?to?the?user's?desktop

ditto"${RW_FRAMEWORK_LOCATION}""${HOME}/Desktop/${RW_FRAMEWORK_NAME}.framework"


選中我們的Target:Framework,再次編譯CMD+B,會(huì)發(fā)現(xiàn)桌面上已經(jīng)出現(xiàn)我們需要得靜態(tài)庫文件:MyFirstStaticLib.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)容