萬能的老板想把產(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
將此文件放入任意工程即可使用。