iosSDK開發(fā)---轉(zhuǎn)載

轉(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管理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凶杖,一起剝皮案震驚了整個(gè)濱河市胁艰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌智蝠,老刑警劉巖腾么,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異杈湾,居然都是意外死亡解虱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門漆撞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殴泰,“玉大人于宙,你說我怎么就攤上這事『费矗” “怎么了捞魁?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)离咐。 經(jīng)常有香客問我谱俭,道長(zhǎng),這世上最難降的妖魔是什么健霹? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任旺上,我火速辦了婚禮,結(jié)果婚禮上糖埋,老公的妹妹穿的比我還像新娘宣吱。我一直安慰自己,他們只是感情好瞳别,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布征候。 她就那樣靜靜地躺著,像睡著了一般祟敛。 火紅的嫁衣襯著肌膚如雪疤坝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天馆铁,我揣著相機(jī)與錄音跑揉,去河邊找鬼。 笑死埠巨,一個(gè)胖子當(dāng)著我的面吹牛历谍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辣垒,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼望侈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了勋桶?” 一聲冷哼從身側(cè)響起脱衙,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎例驹,沒想到半個(gè)月后捐韩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹃锈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年奥帘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仪召。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寨蹋,死狀恐怖松蒜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情已旧,我是刑警寧澤秸苗,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站运褪,受9級(jí)特大地震影響惊楼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秸讹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一檀咙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧璃诀,春花似錦弧可、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至凿将,卻和暖如春校套,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牧抵。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工笛匙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犀变。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓妹孙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親弛作。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容