iOS项目功能模块封装SDK使用总结
一、功能模塊SDK封裝步驟:
1、創建IOS Framework工程
先我們需要創建一個iOS的CocoaTouch工程,點擊Next,輸入我們Framework的名字即可。下方我們暫且將該Framework的名字命名為“CreateLoginSDKFramework”。操作如下所示:
Xcode ——》File\New\Project ——》iOS\Framework and Library\Cocoa Touch Framework ——》命名項目工程
?
2、設置兼容版本:
創建完工程后,我們要選擇“Deployment Target”, 此處我們選擇的是8.0。也就是說此處我們封裝的SDK所支持的iOS系統版本是iOS8.0+。操作所示:
Xcode ——》Project ——》Targets ——》General ——》Deployment Info ——》iOS8.0(最低支持的兼容版本)
?
3.1、配置動態庫:
創建的framework默認是動態庫,操作如下所示:
Xcode ——》Project ——》Targets ——》Build Settings ——》Msch-O Type——》Dynamic Library
Xcode ——》Project ——》Targets ——》Build Settings ——》Build active Architecture only——》NO
?
3.2、配置靜態庫:
由于創建的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
?
4、設置支持所有架構(armv7/armv7s/arm64):
Xcode ——》Project ——》Targets ——》Build Settings ——》Build Active Architecture Only——》NO
?
5、導入源代碼文件,設置要公開的所有頭文件:
將事先準備好的SDK源代碼引入到我們的Framework的工程中進行編譯了,在編譯之前我們要選擇SDK用戶可以看到的文件。在Build Phases下的Headers中進行設置的。將用戶可以看到的頭文件放在Public中,用戶看不到的放在Project中。操作如下所示:
Xcode ——》Project ——》Targets ——》Build Phases ——》Headers——》Public/Private/Project
?
6、編譯工程:
設置和配置完畢后,我們就要對我們的Framework工程進行編譯了。先選擇模擬器進行編譯,然后選擇真機進行編譯。編譯完后,在Products下會生成相應的Framework, 然后通過Show in Finder進行查看即可。查看時,如果想看“模擬器”和“真機”的framework的話,在Show in finder后,需要前往上層文件夾查看。
?
7、第一種方式(使用命令行合并模擬器和真機Framework庫):
因為在模擬器下編譯會生成模擬器下使用的Framework,在真機下編譯會生成真機使用的Framework。如果想我們生成的Framework既可以在真機下使用,也可以在模擬器下使用,那么我們需要將兩個Framework進行合并。使用終端命令將上述兩個文件進行合并。下方就是合并上述兩個文件的執行命令, 執行完下方命令后會生成合并后的新文件。操作如下所示:
打開終端 ——》lipo -create 模擬器framework路徑 ?真機framework路徑 -output 新的文件
注意事項:
1、編譯Framework工程前,需要設置Edit Scheme, 選擇run->將Debug模式改成Release模式,選擇Close。
2、合并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(發布模式模擬器)
?
3、如果需要隱藏文件中的分類創建的類,需要在工程添加
Xcode ——》Project ——》Targets ——》Build Phases ——》?Other Linker Flags ——》-all_load
?
8、第二種方式(使用腳本合并模擬器和真機Framework庫):
1、編譯framework的shell腳本
#要build的target名 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 #拷貝framework到univer目錄 cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}" #合并framework,輸出最終的framework到build目錄 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}"
2、編譯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}"
?
二、資源文件的Bundle封裝步驟:
1、Bundle工程的創建:
首先像創建Framework工程一樣創建一個Bundle工程,因為iOS工程下方沒有Bundle類型的工程,所以我們需要在OS X -> Framework & Library -> Bundle下面來創建我們的Bundle工程。操作如下所示:
Xcode ——》File\New\Project ——》macOS\Framework and Library\Bundle——》命名項目工程
?
2、配置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模式)
?
3、導入Bundle資源文件并進行編譯:
進行上述配置完后,接下來就是引入資源文件進行編譯了,下方引入的資源文件就是我們的LoginSDK.storyboard。引入資源后,進行編譯,編譯后會在Products下面生成相應的Bundle資源文件,該文件就可以和我們的Framework進行使用了。
Xcode ——》Project ——》Targets ——》Build Phases——》Copy Bundle Resources ——》添加圖片資源
?
4、項目中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]
?
5、注意事項:
如果Bundle工程中中引用了資源文件,工程編譯過后會出現.storyboardc或者.xibc文件才算真正封裝成功。
?
三、封裝后的SDK文件的使用步驟:
1、導入SDK,進行路徑配置:
導入SDK到我們的App工程后,我們要對其進行相應的配置。首先我們要對Framework Search Paths進行配置,也就是說告訴編譯器我們的第三方SDK所在的位置。下方這個配置項在引入SDK后就默認存在的,如果沒有的話就進行配置即可。操作如下所示:
Xcode ——》Project ——》Targets ——》Build Settings ——》Search Paths\Framework Search Paths ——》$(PROJECT_DIR)/LoginSDK
?
2、進行編譯配置:
配置完路徑后,接下來我們要在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
?
3、SDK的使用:
配置完畢后,接下來就是在我們App中使用該SDK了。下方代碼就是我們上述LoginSDK的使用方式,首先獲取單例,然后檢查是否登錄,登錄成功后根據Block回調跳轉到首頁,如果未登錄,就通過LoginAPI獲取登錄頁面進行登錄。
?
4、 注意事項:
《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里的資源文件。
?
轉載于:https://www.cnblogs.com/yuhao309/p/8960730.html
總結
以上是生活随笔為你收集整理的iOS项目功能模块封装SDK使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS移动显示
- 下一篇: spring 改变url