轉(zhuǎn)載地址https://www.meiwen.com.cn/subject/lspbxqtx.html
靜態(tài)方式開發(fā)初斑,一直是iOS SDK開發(fā)的主流方式浦马。百度地圖、高德地圖等大型三方SDK均是采用靜態(tài)的方式開發(fā)簿晓。也有采用動(dòng)態(tài)的方式開發(fā)SDK的如:環(huán)信始鱼。
靜態(tài)方式和動(dòng)態(tài)方式比較:
靜態(tài)SDK不能嵌套。見iOS中Framework Library嵌套使用兆衅。因此地沮,當(dāng)SDK需要引用其他SDK,且不希望暴露給用戶時(shí)羡亩,只能采用動(dòng)態(tài)庫(kù)的開發(fā)方式摩疑。
若SDK和項(xiàng)目中用到相同的三方庫(kù)(如:AFNetworking)。動(dòng)態(tài)庫(kù):工程和項(xiàng)目中可以存在2份AFNetworking,因此開發(fā)方便畏铆。靜態(tài)庫(kù)只會(huì)存在一份雷袋,因此開發(fā)相對(duì)復(fù)雜,但減少了代碼的冗余辞居。
現(xiàn)以SDK和項(xiàng)目中都需要用到相同的三方庫(kù)(如AFNetWorking)為例楷怒,介紹靜態(tài)庫(kù)開發(fā)和使用。Demo見https://github.com/wutao23yzd/SDKDemo瓦灶, StaticSDK目錄下鸠删。
本文分為開發(fā)和使用2個(gè)部分:
開發(fā):
靜態(tài)SDK的創(chuàng)建和配置
利用workspace將sdk和Demo工程建立關(guān)聯(lián)
SDK中Bundle和腳本的配置和使用
SDK中斷點(diǎn)調(diào)試
使用:
SDK和項(xiàng)目共用一份AFNetworking
利用.spec的方式安裝SDK和相關(guān)依賴。
前期準(zhǔn)備
開發(fā)環(huán)境:
Xcode 10
cocoaPods version:?1.6.0.beta.2
當(dāng)為Xcode10時(shí)贼陶,需要升級(jí)cocoaPods為最新刃泡,否則會(huì)報(bào)錯(cuò)
RuntimeError - [!] Xcodeproj doesn't know about the following attributes {"inputFileListPaths"=>[], "outputFileListPaths"=>[]} for the 'PBXShellScriptBuildPhase' isa.
升級(jí)cocoaPods
// 升級(jí)
sudo gem install cocoapods --pre -n /usr/local/bin
// 查看版本
pod --version
2.知識(shí)儲(chǔ)備:了解?Xcode中的 workspace, project, target, scheme區(qū)別
開發(fā)
創(chuàng)建SDK工程和Demo工程
將SDK和Demo工程用一個(gè)workspace管理巧娱。
創(chuàng)建SDK
創(chuàng)建SDK工程
取名為HelloSDK,并做如下配置烘贴。
創(chuàng)建SDK
配置Deployment Target?iOS 9.0
Mach-O Type?Static Library
Enable Bitcode?No
Edit Scheme - Run - Info - Build Configuration?Release
在SDK工程中創(chuàng)建Bundle禁添。
SDK 中xib,圖片等一切資源都需要添加到Bundle中
依次選擇,file?-New?-Target-macOS?-?Bundle;取名為 HelloSDKBundle桨踪。并做如下配置老翘。
Build Settings - Base SDK - iOS
Deployment Target -9.0
Enable Bitcode 設(shè)置為NO
清除Build settings - Installation Directory路徑信息
COMBINE_HIDPI_IMAGES設(shè)置為NO
Edit Scheme - Run - Info - Build Configuration?Release
在SDK工程中創(chuàng)建腳本。
SDK以模擬器編譯時(shí)锻离,會(huì)生成對(duì)應(yīng)模擬器架構(gòu)的SDK( i386,x86_64);以Generic iOS Device編譯時(shí)铺峭,會(huì)生成真機(jī)架構(gòu)的SDK(arm7,arm64)。腳本的作用是將這兩個(gè)sdk合成一個(gè)汽纠,使的同時(shí)適用于真機(jī)和模擬器逛薇。
file?-New?-?Target-Cross-platform?-?Aggregate;取名為?CommonStatic。
Run Script中添加以下腳本
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
#open "${SRCROOT}/Products"
fi
在其?Build Phases?-?Target Dependencies中疏虫,添加?Hello SDK。
點(diǎn)擊+號(hào)啤呼,選擇New run Script添加腳本
為腳本Target做如下配置
Enable Bitcode 設(shè)置為NO
Edit Scheme - Run - Info - Build Configuration?Release
創(chuàng)建Demo工程
在HelloSDK同目錄下卧秘,創(chuàng)建StaticSDKDemo工程。
創(chuàng)建工程
并做如下設(shè)置
Enable Bitcode 設(shè)置為NO
Deployment Target -9.0
創(chuàng)建workspace
打開終端官扣, cd 到 StaticSDKDemo目錄下翅敌,執(zhí)行pod init,在工程目錄下會(huì)生成Podfile文件惕蹄。打開Podfile,輸入以下蚯涮。
# platform :ios, '9.0'
workspace 'StaticSDKDemo'
def shared_pods
? ? pod 'AFNetworking'
end
target 'StaticSDKDemo' do
? ? project 'StaticSDKDemo'
? ? shared_pods
end
target 'HelloSDK' do
? ? project '../HelloSDK/HelloSDK'
? ? shared_pods
end
在終端種執(zhí)行pod install,打開生成的workspace。此時(shí)可見
工程列表
現(xiàn)在Demo工程和SDK在一個(gè)workspace中卖陵,已建立了關(guān)聯(lián)遭顶,并可共用一個(gè)AFNetworking(其他三方庫(kù),在 podfile中的?shared_pods中添加即可)泪蔫。
現(xiàn)在SDK工程和Demo工程已創(chuàng)建完畢棒旗。
開發(fā)
SDK中添加代碼
在HelloSDK中創(chuàng)建HSViewController,并編寫如下代碼。
代碼
設(shè)置SDK公開頭文件
設(shè)置公開頭文件步驟一
在上圖中每設(shè)置一個(gè)公開頭文件撩荣,都在下圖中的.h文件中铣揉,都需要引入該頭文件。
設(shè)置公開頭文件步驟二
刪掉SDK中的資源餐曹,后續(xù)Bundle中會(huì)包含逛拱。
刪掉資源
編譯SDK,并將SDK導(dǎo)入到Demo工程中
切換Target為HelloSDK,選中一款模擬器,comand?+?B,編譯
這里選擇模擬器台猴,是為了方便用模擬器演示功能朽合。當(dāng)然也可以選擇?Generic iOS Device使之適用于真機(jī)俱两。當(dāng)利用模擬器和Generic iOS Device分別編譯后,再利用之前創(chuàng)建的CommonStatic編譯(選擇Generic iOS Device)旁舰,便會(huì)生成同時(shí)適用于真機(jī)和模擬器的SDK锋华。
編譯SDK
編譯好后,在Demo工程中箭窜,添加SDK
選中StaticSDKDemo?Target,依次選擇Build Phases?-?Link Binary With Libraries,點(diǎn)擊?+號(hào)毯焕,添加SDK
引入SDK
編譯Bundle,并將Bundle導(dǎo)入到Demo工程中
在HelloSDK工程中,選中HelloSDKBundle,在其copy Bundle Resources中磺樱,點(diǎn)擊+號(hào)纳猫,添加資源
添加資源
編譯Bundle,并在其products目錄中,show in finder找到,復(fù)制到Demo工程目錄
編譯Bundle
復(fù)制到Demo工程目錄
在Demo 工程的?Copy Bundle Resources中竹捉,點(diǎn)擊+號(hào)引入Bundle(在彈出的框中芜辕,可不選復(fù)制)
引入Bundle
在Demo工程中,添加代碼查看效果
添加如下代碼块差,運(yùn)行模擬器侵续,便查看到效果了。
添加代碼
效果圖
同時(shí)憨闰,當(dāng)我們?cè)赟DK里面的點(diǎn)擊事件里状蜗,設(shè)置斷點(diǎn)時(shí),是有效的鹉动,這就方便我們的調(diào)試轧坎。
設(shè)置斷點(diǎn)
當(dāng)我們?cè)赟DK里更改了代碼時(shí),需要編譯一遍SDK,在Demo工程中Link Binary With Libraries,點(diǎn)擊-去掉SDK,直接運(yùn)行Demo工程就有效果了泽示;如果再次更改缸血,點(diǎn)擊+添加SDK,運(yùn)行工程就有效果(原因未知)械筛。如果更改了xib.新增了圖片時(shí)捎泻,就必須重新編譯Bundle,并用新的覆蓋掉原來老的,才會(huì)產(chǎn)生效果埋哟。
以上便是SDK靜態(tài)庫(kù)開發(fā)的全部?jī)?nèi)容族扰。
使用
AFNetWorking應(yīng)用
在SDK中新建AFAppDotNetAPIClient
.h文件代碼
.m文件代碼
在HSViewController中添加如下代碼,
網(wǎng)絡(luò)請(qǐng)求
編譯SDK,并按照上面說的定欧,在Demo工程中Link Binary With Libraries,點(diǎn)擊-去掉SDK,直接運(yùn)行Demo工程便見到Label上顯示了一句古詩(shī)渔呵。
SDK腳本導(dǎo)出
分別將sdk在模擬器(隨便選一款模擬器)和Generic iOS Device下編譯 (選擇該target,command + B)。這會(huì)編譯生成2個(gè)SDK砍鸠,一個(gè)適用于模擬器扩氢,一個(gè)適用于真機(jī)。
模擬器編譯
Generic iOS Device編譯
選擇Target選為CommonStatic編譯爷辱,這會(huì)將上面生成的2個(gè)SDK合成一個(gè)录豺,編譯完成后朦肘,會(huì)發(fā)現(xiàn)在項(xiàng)目根目錄會(huì)生成Products文件夾,便是所制作的sdk
腳本編譯
生成最終SDK
利用spec文件安裝SDK及其依賴
現(xiàn)在SDK已經(jīng)開發(fā)完了双饥,需要交給客戶的開發(fā)人員使用了媒抠。且我們的SDK需要依賴AFNetWorking。
創(chuàng)建名為cusProject工程,假定為客戶的項(xiàng)目工程咏花,且采用CocoPods管理趴生。注意修改其Deployment Target和?bit code
創(chuàng)建客戶工程
在工程目錄下新建HelloSDK文件夾,并將上面腳本生成的SDK拷貝到該文件夾下昏翰,編譯Bundle也拷貝到該文件夾下苍匆。
SDK和Bundle
打開終端,cd到HelloSDK文件夾下棚菊,執(zhí)行如下命令浸踩,創(chuàng)建spec文件。
pod spec create HelloSDK
打開生成的podspec文件统求,刪除里面的全部?jī)?nèi)容检碗,并添加如下:
Pod::Spec.new do |spec|
? spec.name? ? ? ? = "HelloSDK"
? spec.version? ? ? = "1.0.0"
? spec.summary? ? ? = "A short description of HelloSDk"
? spec.description? = <<-DESCRIPTION
pod spec create xx
DESCRIPTION
? spec.homepage? ? = "http://www.baidu.com"
? spec.license? ? ? = "None"
? spec.author? ? ? = { "wutao" => "359424792@qq.com" }
? spec.source? ? ? = { :path => '/'}
? spec.static_framework = true
? spec.requires_arc = true
? spec.platform? ? = :ios, '9.0'
? spec.ios.vendored_frameworks = 'HelloSDK.framework'
? spec.resource? = "HelloSDKBundle.bundle"
? spec.dependency 'AFNetworking'
end
下圖中?spec.name = "HelloSDk",k應(yīng)該改為大寫的K
編寫spec文件,ruby語(yǔ)言
打開cusProject工程码邻,在Podfile文件中按圖示添加:
編寫Podfile
打開終端后裸,cd到項(xiàng)目目錄下,執(zhí)行pod install冒滩;現(xiàn)在HelloSDK和AFNetworking都添加到項(xiàng)目中了。此時(shí)HelloSDK和客戶的項(xiàng)目就可以共用一份AFNetworking
安裝SDK和依賴
在主項(xiàng)目中編寫代碼測(cè)試浪谴。
在ViewController中添加如下代碼开睡,運(yùn)行模擬器。
vc中邏輯
效果圖
以上便是SDK使用的全過程苟耻,我們已實(shí)現(xiàn)了SDK和項(xiàng)目主工程共用一份AFNetworing篇恒,且SDK和Bundle交由Pods管理。