iOS項目功能模塊封裝SDK使用總結

1、功能模塊SDK封裝步驟:ios

一、建立IOS Framework工程web

先咱們須要建立一個iOS的CocoaTouch工程,點擊Next,輸入咱們Framework的名字便可。下方咱們暫且將該Framework的名字命名爲「CreateLoginSDKFramework」。操做以下所示:shell

Xcode ——》File\New\Project ——》iOS\Framework and Library\Cocoa Touch Framework ——》命名項目工程xcode

 

二、設置兼容版本:架構

建立完工程後,咱們要選擇「Deployment Target」, 此處咱們選擇的是8.0。也就是說此處咱們封裝的SDK所支持的iOS系統版本是iOS8.0+。操做所示:app

Xcode ——》Project ——》Targets ——》General ——》Deployment Info ——》iOS8.0(最低支持的兼容版本)iphone

 

3.一、配置動態庫:測試

建立的framework默認是動態庫,操做以下所示:ui

Xcode ——》Project ——》Targets ——》Build Settings ——》Msch-O Type——》Dynamic Libraryspa

Xcode ——》Project ——》Targets ——》Build Settings ——》Build active Architecture only——》NO

 

3.二、配置靜態庫:

因爲建立的framework默認是動態庫,因此咱們要講Mach-O Type設置爲靜態庫「Static Library」。操做以下所示:

Xcode ——》Project ——》Targets ——》Build Settings ——》Msch-O Type——》Static Library

Xcode ——》Project ——》Targets ——》Build Settings ——》Build active Architecture only——》NO

Xcode ——》Project ——》Targets ——》Build Settings ——》Dead Code Stripping——》NO

Xcode ——》Project ——》Targets ——》Build Settings ——》Link With Standard Libraries——》NO

 

四、設置支持全部架構(armv7/armv7s/arm64):

Xcode ——》Project ——》Targets ——》Build Settings ——》Build Active Architecture Only——》NO

 

五、導入源代碼文件,設置要公開的全部頭文件:

將事先準備好的SDK源代碼引入到咱們的Framework的工程中進行編譯了,在編譯以前咱們要選擇SDK用戶能夠看到的文件。在Build Phases下的Headers中進行設置的。將用戶能夠看到的頭文件放在Public中,用戶看不到的放在Project中。操做以下所示:

Xcode ——》Project ——》Targets ——》Build Phases ——》Headers——》Public/Private/Project

 

六、編譯工程:

設置和配置完畢後,咱們就要對我們的Framework程進行編譯了。先選擇模擬器進行編譯,而後選擇真機進行編譯。編譯完後,在Products下會生成相應的Framework, 而後經過Show in Finder進行查看便可。查看時,若是想看「模擬器」和「真機」的framework的話,在Show in finder後,須要前往上層文件夾查看。

 

七、第一種方式(使用命令行合併模擬器和真機Framework庫):

由於在模擬器下編譯會生成模擬器下使用的Framework,在真機下編譯會生成真機使用的Framework。若是想咱們生成的Framework既能夠在真機下使用,也能夠在模擬器下使用,那麼咱們須要將兩個Framework進行合併。使用終端命令將上述兩個文件進行合併。下方就是合併上述兩個文件的執行命令, 執行完下方命令後會生成合並後的新文件。操做以下所示:

打開終端 ——》lipo -create 模擬器framework路徑  真機framework路徑 -output 新的文件

注意事項:

一、編譯Framework工程前,須要設置Edit Scheme, 選擇run->將Debug模式改爲Release模式,選擇Close。

二、合併Framework出現error:can't map input file: xxxFramework.framework/ (Invalid argument),緣由是若是工程名稱和Framework的Target名稱不同的話,要自定義FrameworkName。

lipo -info xxxFramework.framework/xxxFramework

 或者

cd xxxFramework.framework

lipo -info xxxFramework

完整命令以下:

lipo -create /Users/yh/Library/Developer/Xcode/DerivedData/YouHone_SDK-dchvyxjtxmxejegowpxcteqnerux/Build/Products/Release-iphonesimulator/YouHone_SDK.framework/YouHone_SDK  /Users/yh/Library/Developer/Xcode/DerivedData/YouHone_SDK-dchvyxjtxmxejegowpxcteqnerux/Build/Products/Release-iphoneos/YouHone_SDK.framework/YouHone_SDK -output /Users/yh/Desktop/NewSDK/YouHone_SDK

 

注意:記得將新合成的YouHone_SDK文件,替換成發佈模式的真機裏面YouHone_SDK文件

Debug-iphonesos(測試模式真機)

Debug-iphonesimulator(測試模式模擬器)

Release-iphonesos(發佈模式真機)

Release-iphonesimulator(發佈模式模擬器)

 

三、若是須要隱藏文件中的分類建立的類,須要在工程添加

Xcode ——》Project ——》Targets ——》Build Phases ——》 Other Linker Flags ——》-all_load

 

八、第二種方式(使用腳本合併模擬器和真機Framework庫):

一、編譯framework的shell腳本

#buildtarget TARGET_NAME=${PROJECT_NAME} if [[ $1 ]] then TARGET_NAME=$1 fi UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}_Products/" #建立輸出目錄,並刪除以前的framework文件 mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}" rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework" #分別編譯模擬器和真機的Framework xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build #拷貝frameworkuniver目錄 cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}" #合併framework,輸出最終的frameworkbuild目錄 lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}" #刪除編譯以後生成的無關的配置文件 dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/" for file in ls $dir_path do if [[ ${file} =~ ".xcconfig" ]] then rm -f "${dir_path}/${file}" fi done #判斷build文件夾是否存在,存在則刪除 if [ -d "${SRCROOT}/build" ] then rm -rf "${SRCROOT}/build" fi rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos" #打開合併後的文件夾 open "${UNIVERSAL_OUTPUT_FOLDER}"

二、編譯library(靜態庫.a文件)的腳本

#要build的target名 target_Name=${PROJECT_NAME} if [[ $1 ]] then target_Name=$1 fi UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}_Products" # 建立輸出目錄,並刪除以前的文件 rm -rf "${UNIVERSAL_OUTPUT_FOLDER}" mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}" # 分別編譯真機和模擬器版本 xcodebuild -target "${target_Name}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build xcodebuild -target "${target_Name}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build #複製頭文件到目標文件夾 HEADER_FOLDER="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/include/${target_Name}" if [[ -d "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/usr/local/include" ]] then HEADER_FOLDER="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/usr/local/include" fi cp -R "${HEADER_FOLDER}" "${UNIVERSAL_OUTPUT_FOLDER}" #合成模擬器和真機.a包 lipo -create "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${target_Name}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${target_Name}.a" -output "${UNIVERSAL_OUTPUT_FOLDER}/lib${target_Name}.a" # 判斷build文件夾是否存在,存在則刪除 if [ -d "${SRCROOT}/build" ] then rm -rf "${SRCROOT}/build" fi #打開目標文件夾 open "${UNIVERSAL_OUTPUT_FOLDER}"

 

2、資源文件的Bundle封裝步驟:

一、Bundle工程的建立:

首先像建立Framework工程同樣建立一個Bundle工程,由於iOS工程下方沒有Bundle類型的工程,因此咱們須要在OS X -> Framework & Library -> Bundle下面來建立咱們的Bundle工程。操做以下所示:

Xcode ——》File\New\Project ——》macOS\Framework and Library\Bundle——》命名項目工程

 

二、配置Bundle工程:

建立完Bundle工程後,咱們要對其進行相應的配置。由於咱們是選擇OS X建立的Bundle,默認的Bundle是不能在iOS中使用的,因此咱們得將Base SDK進行設置,選擇相應的iOS樣式便可(默認Mac OS樣式),以下所示。選擇完Base SDK後,咱們還要像上面Framework的封裝同樣,設置一下要兼容的iOS版本(iOS Deployment Target)。操做以下所示:

A、Xcode ——》Project ——》Targets ——》Build Settings ——》Base SDK ——》iOS樣式

B、Xcode ——》Project ——》Targets ——》General ——》Deployment Info ——》Deployment Target——》ios8.0(最低支持的兼容版本)

C、Xcode ——》Project ——》Targets ——》Build Settings ——》Installation Directory ——》清空路徑

D、Xcode ——》Project ——》Targets ——》Build Settings ——》Skip Install ——》默認YES,跳過安裝過程

E、Xcode ——》Project ——》Targets ——》Build Settings ——》COMBINE_HIPI_IMAGES ——》設置NO(若是爲YES,圖片是TIFF模式)

 

三、導入Bundle資源文件並進行編譯:

進行上述配置完後,接下來就是引入資源文件進行編譯了,下方引入的資源文件就是咱們的LoginSDK.storyboard。引入資源後,進行編譯,編譯後會在Products下面生成相應的Bundle資源文件,該文件就能夠和咱們的Framework進行使用了。

Xcode ——》Project ——》Targets ——》Build Phases——》Copy Bundle Resources ——》添加圖片資源

 

四、項目中Bundle資源的加載:

生成完Bundle資源文件後,咱們在SDK的源代碼中,要從Bundle資源文件中進行資源的加載。下方代碼就是加載相應Bundle的代碼。經過下方的宏定義,就能夠經過「Bundle」的名字來加載Bundle。

#define LOGIN_SDK_BUNDLE_NAME   @"LoginSDKResource.bundle"

#define LOGIN_SDK_BUNDLE_PATH   [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: LOGIN_SDK_BUNDLE_NAME]

#define LOGIN_SDK_BUNDLE        [NSBundle bundleWithPath: LOGIN_SDK_BUNDLE_PATH]

 

五、注意事項:

若是Bundle工程中中引用了資源文件,工程編譯事後會出現.storyboardc或者.xibc文件纔算真正封裝成功。

 

3、封裝後的SDK文件的使用步驟:

一、導入SDK,進行路徑配置

導入SDK到咱們的App工程後,咱們要對其進行相應的配置。首先咱們要對Framework Search Paths進行配置,也就是說告訴編譯器咱們的第三方SDK所在的位置。下方這個配置項在引入SDK後就默認存在的,若是沒有的話就進行配置便可。操做以下所示:

Xcode ——》Project ——》Targets ——》Build Settings ——》Search Paths\Framework Search Paths ——》$(PROJECT_DIR)/LoginSDK

 

二、進行編譯配置

配置完路徑後,接下來咱們要在Other Linker Flags添加上-Objc和-all_load選項。-Objc這個flag告訴連接器把庫中定義的Objective-C類和Category都加載進來。而-all_load會強制連接器把目標文件都加載進來,即便沒有objc代碼。操做以下所示:

Xcode ——》Project ——》Targets ——》Build Settings ——》Linking\Other Link Flags——》-Objc和-all_load

 

三、SDK的使用:

配置完畢後,接下來就是在咱們App中使用該SDK了。下方代碼就是咱們上述LoginSDK的使用方式,首先獲取單例,而後檢查是否登陸,登陸成功後根據Block回調跳轉到首頁,若是未登陸,就經過LoginAPI獲取登陸頁面進行登陸。

 

四、 注意事項:

《A》若是打包導出的是動態庫,須要在新的工程

Xcode ——》Project ——》Targets ——》General ——》Embedded Binaries ——》添加導入Framework庫

 

《B》若是打包導出的是態庫,須要在新的工程

Xcode ——》Project ——》Targets ——》General ——》Link Binary With Libraries ——》添加導入Framework庫

若是是態庫,那麼在新的工程還須要額外的配置:

Xcode ——》Project ——》Targets ——》Build Phases ——》New Copy Files phase ——》添加導入Framework庫

若是是態庫,資源打包進Framework是讀取不了的。靜態Framework和.a文件都是編譯進可執行文件裏面的。只有動態Framework能在.app的Framework文件夾下看到,並讀取.framework裏的資源文件。

相關文章
相關標籤/搜索