真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ios開(kāi)發(fā)sdk,IOS開(kāi)發(fā)者模式

iOS SDK框架開(kāi)發(fā)中的那些坑

????最近業(yè)務(wù)需求需要開(kāi)發(fā)一個(gè)SDK集成到友方App中,于是就有了本文中的這些經(jīng)驗(yàn)(掉坑-爬坑-掉下一個(gè)坑)。

成都創(chuàng)新互聯(lián)是專(zhuān)業(yè)的尖扎網(wǎng)站建設(shè)公司,尖扎接單;提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行尖扎網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

????這個(gè)其實(shí)不涉及技術(shù)問(wèn)題,但是也需要謹(jǐn)慎,因?yàn)槲覀兊腟DK屬于一個(gè)比較完整的業(yè)務(wù)模塊,所以依賴(lài)的第三方庫(kù)還是挺多的,其中就用到了高德地圖,(開(kāi)始我們就用的通用版本,結(jié)果友方用的是另一個(gè)版本,結(jié)果為了能夠集成成功,后期不得不更改高德地圖版本),所以建議如果是這種明確合作方的SDK這種框架還是需要提前溝通好。

????PS:忍不住吐槽一下,高德地圖整出一大堆亂七八糟的框架目的是個(gè)啥呢,又不能互相兼容,開(kāi)發(fā)者還不知道選擇哪個(gè)合適。

????原生App開(kāi)發(fā),資源文件最多的無(wú)非是圖片,在平時(shí)項(xiàng)目開(kāi)發(fā)中一般會(huì)放到asset文件夾中,但是在SDK中,需要?jiǎng)?chuàng)建.bundle文件(建議與項(xiàng)目同名)對(duì)資源文件進(jìn)行管理。

????該方法在項(xiàng)目中使用舉例:

????簡(jiǎn)單來(lái)說(shuō),在生成模擬器.framework中與生成真機(jī).framework時(shí),都存在arm64架構(gòu),網(wǎng)上提供的通過(guò)后期命令行刪除某個(gè)arm64的方式始終無(wú)法解決該問(wèn)題。此時(shí)需要配置如圖選項(xiàng),大概意思是在模擬器生成的.framework的框架不再添加arm64,后期將模擬器庫(kù)與真機(jī)庫(kù)合并,各個(gè)架構(gòu)模式就都存在了。

模擬器包與真機(jī)包合并命令行

制作遠(yuǎn)程私有庫(kù)的教程有很多,此處就不展開(kāi)來(lái)仔細(xì)說(shuō)明了。 iOS開(kāi)發(fā): 配置CocoaPods遠(yuǎn)程私有倉(cāng)庫(kù) 重點(diǎn)說(shuō)一下針對(duì)非開(kāi)源的.framework框架,如何去配置spec

設(shè)置自己的非開(kāi)源SDK

設(shè)置項(xiàng)目SDK相關(guān)的資源文件夾(bundle)

當(dāng)自己開(kāi)發(fā)的SDK中包含類(lèi)目文件時(shí),編譯就會(huì)有提示找不到,此時(shí)需要在設(shè)置頁(yè)other_laflags添加'-objc',但是在SDK中無(wú)法設(shè)置,只能寫(xiě)在spec文件。

當(dāng)調(diào)用pod lib lint --verbose --use-libraries時(shí)報(bào)了如下錯(cuò)誤:

Ld .../Build/Intermediates.noindex/App.build/Release-iphonesimulator/App.build/Objects-normal/arm64/Binary/App normal arm64

解決方案:

????經(jīng)歷了整個(gè)SDK的完整開(kāi)發(fā)流程,一步步排除問(wèn)題,最終達(dá)到了最終結(jié)果。在此感謝一起解決問(wèn)題的同事--卞老板。

iOS 五款SDK工具

盡管App store里存在眾多種類(lèi)繁雜,服務(wù)各異的應(yīng)用,但所有App都有一個(gè)共同的目標(biāo):提供 極致的用戶體驗(yàn)。

好的用戶體驗(yàn)是由許多因素構(gòu)成的。我們需要知道,一款好產(chǎn)品背后必定是經(jīng)過(guò)團(tuán)隊(duì)多方面打磨、迭代而成。產(chǎn)品迭代必不可少的一項(xiàng)內(nèi)容,就是取決于你所使用的工具,比如iOS SDK(軟件開(kāi)發(fā)工具)開(kāi)放的通用模塊,從beta測(cè)試和錯(cuò)誤監(jiān)控到用戶行為分析和A/B測(cè)試,都有相應(yīng)的產(chǎn)品,可以大大縮減金錢(qián)、時(shí)間成本,從而提高應(yīng)用整體運(yùn)營(yíng)的敏捷性。

這里列出了幾款iOS必備軟件開(kāi)發(fā)工具,直接根據(jù)需要配置即可。

地址:

UserTesting的按需測(cè)試平臺(tái)由一個(gè)超過(guò)一百萬(wàn)測(cè)試者的座談小組組成,可以在移動(dòng)設(shè)備上測(cè)試網(wǎng)站、App甚至是原型。在這里幾小時(shí)內(nèi)就可以得到人工的反饋意見(jiàn),包括一段記錄測(cè)試過(guò)程的視頻和一份完整的文字報(bào)告。開(kāi)發(fā)者可以通過(guò)這些內(nèi)容詳細(xì)地了解用戶的使用習(xí)慣,以及產(chǎn)品在使用過(guò)程中遇到的各種問(wèn)題。

主要特點(diǎn):

超過(guò)百萬(wàn)的用戶網(wǎng)絡(luò)

可直接面試

視頻模式和自動(dòng)轉(zhuǎn)錄信息

地址:

openinstall SDK能提供多種服務(wù),包括最讓開(kāi)發(fā)者頭疼的iOS多渠道統(tǒng)計(jì),相對(duì)iTunes Connect 的“營(yíng)銷(xiāo)活動(dòng)”統(tǒng)計(jì)維度更豐富,且實(shí)時(shí)靈活,適合多渠道推廣使用。同時(shí)提供免填邀請(qǐng)碼安裝、一鍵拉起(Deeplink)、攜帶參數(shù)安裝、地推統(tǒng)計(jì)、CP結(jié)算、廣告投放統(tǒng)計(jì)等多個(gè)使用場(chǎng)景以及應(yīng)用優(yōu)化功能,讓App用戶體驗(yàn)更佳,拉新轉(zhuǎn)化率更高。

主要特點(diǎn):

多渠道攜帶參數(shù)統(tǒng)計(jì)

免填邀請(qǐng)碼等優(yōu)化用戶體驗(yàn)

提高拉新轉(zhuǎn)化率

地址:

另一個(gè)具有多種功能的SDK是Instabug?,它包括了bug報(bào)告工具,讓您的用戶可以將bug發(fā)送給您;還有崩潰報(bào)告工具,可以向您發(fā)送所需的堆棧跟蹤信息,甚至不用導(dǎo)航。您還可以對(duì)比當(dāng)前版本和前一個(gè)版本,觀看用戶操作的屏幕記錄。Instabug 可以與您的工作流程集成,然后通過(guò)Slack和JIRA發(fā)送提醒給整個(gè)團(tuán)隊(duì)。

主要特點(diǎn):

bug屏幕記錄

交互式用戶反饋

Bug的建議和類(lèi)型分析

地址:

Optimizely?的試驗(yàn)平臺(tái)給web網(wǎng)站、移動(dòng)端網(wǎng)頁(yè)和移動(dòng)端App提供解決方案。移動(dòng)工具可以讓您很流暢地對(duì)應(yīng)用的各個(gè)部分進(jìn)行即時(shí)實(shí)驗(yàn)。快速迭代是這個(gè)工具的特點(diǎn),您不需要等待應(yīng)用商店的審核即可更新應(yīng)用。同時(shí),Optimizely 還可以讓您根據(jù)精準(zhǔn)化的目標(biāo)市場(chǎng)創(chuàng)造個(gè)性化的體驗(yàn)。

主要特點(diǎn):

即時(shí)推出和分階段推出

視覺(jué)編輯

自定義受眾以及精準(zhǔn)化目標(biāo)定位

地址:

Foresee?提供了一套多渠道的“用戶體驗(yàn)”工具,其中包括自助用戶反饋工具。通過(guò)Foresee的反饋工具,您可以鼓勵(lì)用戶填寫(xiě)簡(jiǎn)單的調(diào)查問(wèn)卷,讓他們提出問(wèn)題,以避免問(wèn)題擴(kuò)大化。此外,您還可以為核心用戶快速部署評(píng)級(jí)和審核提示。此外,F(xiàn)oresee還可以重播整個(gè)會(huì)話,提供App用戶體驗(yàn)的全貌。

主要特點(diǎn):

簡(jiǎn)單,自助化

個(gè)性化評(píng)分和評(píng)審

提醒會(huì)話重播

相比于采購(gòu)需要大量定制化開(kāi)發(fā)或自研的產(chǎn)品,使用標(biāo)準(zhǔn)化通用的SDK,可以大大縮減金錢(qián)、時(shí)間成本,從而提高公司整體運(yùn)營(yíng)的敏捷性。

這就像你需要用電,但并不需要從頭建發(fā)電廠,更明智地做法是主動(dòng)關(guān)注哪些能力是市面上的SDK廠商已可提供的,哪些還不成熟;做好SaaS、定制化軟件和自研工具之間的分配,為那些需要“拼速度”的一線業(yè)務(wù)準(zhǔn)備好“利器”。

iOS 封裝靜態(tài)庫(kù)(SDK)的詳細(xì)過(guò)程

最近公司由于業(yè)務(wù)需求,需要提供一個(gè)SDK以供第三方公司的集成開(kāi)發(fā),之前沒(méi)有這方面的開(kāi)發(fā)經(jīng)驗(yàn)有點(diǎn)迷茫。然后就在網(wǎng)上查看了一些相關(guān)的資料,自己研究了一天,成功的封裝出了自己iOS開(kāi)發(fā)過(guò)程中的第一個(gè)SDK包。同時(shí)也是為了以后開(kāi)發(fā)SDK留下一個(gè)比較完整的筆記。

SDK的英文全名是:software development kit,翻譯成中文的意思就是“軟件開(kāi)發(fā)工具包”,我個(gè)人的理解就是一個(gè)工具包,完全可以理解成開(kāi)發(fā)中我們的一個(gè)公共類(lèi)。

二、怎么實(shí)現(xiàn)SDK的封裝呢?

1.打開(kāi)Xcode開(kāi)發(fā)工具創(chuàng)建我們的工具類(lèi)

注:本文中使用的開(kāi)發(fā)工具為xcode9.3

創(chuàng)建完成后

創(chuàng)建完成后,我們新建兩個(gè)繼承于基類(lèi)的文件,一個(gè)用于封裝網(wǎng)絡(luò)請(qǐng)求一個(gè)用于封裝我們需要提供給他人使用的方法以及需要?jiǎng)討B(tài)改變的參數(shù)。

2.網(wǎng)絡(luò)請(qǐng)求添加到SDK中一起封裝

因?yàn)槲覀兎庋b的SDK有的數(shù)據(jù)涉及到網(wǎng)絡(luò)請(qǐng)求,所以我們封裝的時(shí)候,順便把需要用到的網(wǎng)絡(luò)請(qǐng)求也封裝進(jìn)去。

1).使用cocoapods導(dǎo)入第三方庫(kù)AFNetWorking

具體使用 見(jiàn)印象筆記內(nèi)容,包含了使用cocoapods遇到的問(wèn)題以及解決方法: ??

2).在封裝的SDK中如果涉及到使用第三方的庫(kù)引用的時(shí)候,一定要在.m文件中進(jìn)行引用

3.做完想要封裝的文件后,開(kāi)始進(jìn)行封裝

先進(jìn)行編輯設(shè)置,在product --Scheme---Edit Scheme

此處必須是release,不能用debug模式,選擇SDK是在iOS 、tvOS還是watchOS 4上面運(yùn)行的SDK,在這兒我們選擇iOS

在build Setting里面 搜索linking 設(shè)置Mach-O Type 為 static library

在build Phases --- headers 中添加需要暴露的類(lèi),將Project里面想暴露的文件.h拖動(dòng)到Public里面進(jìn)行文件暴露

完成所有設(shè)置后,我們進(jìn)行真機(jī)編輯和模擬器編輯最后合并成一個(gè)可以在真機(jī)和模擬器上運(yùn)行的第三方SDK,

4.到這一步我們的SDK封裝就差最后一步了,合并成能在真機(jī)和模擬器上運(yùn)行的SDK

選中編輯好的包,我這兒是Demo_SDK.framework然后右擊顯示文件內(nèi)容

找到這兩個(gè)文件后,我們開(kāi)始合并,得到我們想要的SDK

1).打開(kāi)終端---輸入lipo -create 加上文件路徑

1.為真機(jī)的文件,2為模擬器的文件,3為合并后輸出問(wèn)的地址

注意:我們所合并的文件是Demo_SDK,并不是所有的文件

合并到處文件為lipo結(jié)尾的

更改合并和的文件名稱(chēng)和合并前文件名稱(chēng)相同,并且去掉后綴。用合并和的文件替換掉和并前的文件

合并完成后拷貝處我們封裝的SDK,在其他項(xiàng)目中引用就可以了

總結(jié):截圖比較多,為了照顧像我這樣的小白,希望大家理解。第一次寫(xiě),不喜勿噴,這只是作為自己的個(gè)人筆記,如果有什么不對(duì)的地方,希望大家指出一起交流學(xué)習(xí),Thanks?(?ω?)?

Demo鏈接:

iOS SDK開(kāi)發(fā)中的情形

iOS SDK開(kāi)發(fā)就是為某一個(gè)應(yīng)用場(chǎng)景、或領(lǐng)域、或需求,提供一個(gè)已實(shí)現(xiàn)的、封裝好的、可供直接使用的模塊。

其主要由兩部分組成:用來(lái)為類(lèi)型或常量聲明的頭文件列表、具體實(shí)現(xiàn)的二進(jìn)制文件。

所以SDK開(kāi)發(fā)中的主要問(wèn)題點(diǎn)集中在:

1. 頭文件是否能被使用的工程索引到

2. 二進(jìn)制文件是否能被使用的工程搜索到

本篇文章不寫(xiě)制作SDK的具體步驟,僅僅討論制作SDK時(shí)的一些情形。

SDK開(kāi)發(fā)中關(guān)于頭文件設(shè)置:

凡是提供給外界使用的類(lèi)、結(jié)構(gòu)體、枚舉、常量等,定義它們的頭文件必須要在工程的Build Phases-Headers-public下面。并且這些頭文件都需要包含在與SDK工程同名的頭文件中(這條不是必須,只是這么做會(huì)顯得更加規(guī)范。別人使用SDK的時(shí)候,只需要引入SDK同名的頭文件即可)

設(shè)置庫(kù)文件生成動(dòng)態(tài)的還是靜態(tài)的:

Project Name-Target Name-Build Settings-搜索框搜“Mach”-修改“Mach-O Type”為動(dòng)態(tài)或靜態(tài),則相應(yīng)可生成動(dòng)態(tài)或靜態(tài)的庫(kù)文件。

先解釋說(shuō)明以下圖片中出現(xiàn)的工程名字:

SDKDemo :制作的向外提供的SDK庫(kù)文件(與SDK工程名同名)

SDKApp :引用SDK庫(kù)文件(本文指的是SDKDemo)的App工程

SDKStatic :新建工程時(shí),選擇iOS-Framework Library-Cocoa Touch Static Library. 用來(lái)生成.a文件的工程

SDKFramework : ?是個(gè)Framework庫(kù)文件(可能是動(dòng)態(tài)的,也可能是靜態(tài)的),用于模擬被SDK依賴(lài)的.framework文件

下面分幾種情況來(lái)討論SDK開(kāi)發(fā)的注意事項(xiàng):

1. 生成動(dòng)態(tài)SDK庫(kù)文件。

創(chuàng)建工程的時(shí)候,根據(jù)默認(rèn)配置編譯是生成動(dòng)態(tài)庫(kù)的。

App工程中引入動(dòng)態(tài)庫(kù)的時(shí)候,需要在

App工程:Project Name-Target Name-General-Embedded Binaries下添加引入的動(dòng)態(tài)庫(kù)。否則運(yùn)行時(shí)會(huì)報(bào)如下類(lèi)型錯(cuò)誤:

嵌入動(dòng)態(tài)庫(kù)編譯后,生成的App文件中會(huì)多一個(gè)Frameworks目錄(可右鍵.App文件查看包內(nèi)容),里面全是Embedded Binaries下添加的動(dòng)態(tài)庫(kù)

2. 打包為靜態(tài)庫(kù)

SDK工程:Project Name-Target Name-Build Settings-搜索框搜“Mach”-修改“Mach-O Type”為靜態(tài)庫(kù)

App工程引入靜態(tài)庫(kù)很簡(jiǎn)單,直接引入就行,不需要額外配置:

tips:

合并真機(jī)與模擬器版本時(shí)的命令格式為:

lipo -create?模擬器版本的路徑?真機(jī)版本的路徑 -output 合并后的版本存放路徑

1. 合并時(shí)lipo -create接收的模擬器版本和真機(jī)版本兩個(gè)參數(shù)的前后順序沒(méi)有關(guān)系,合并后的版本通過(guò)命令查看架構(gòu)信息顯示結(jié)果是完全一致的。模擬器架構(gòu)信息顯示在前,真機(jī)架構(gòu)信息在后。

2. 合并后的版本無(wú)論替換真機(jī)版本的Framework中的目標(biāo)文件還是模擬器版本的Framework中的目標(biāo)文件,App工程中引入被替換的Framework后在真機(jī)和模擬器上都能跑起來(lái)

首先創(chuàng)建SDKStatic工程,生成一個(gè).a文件。

該工程只是簡(jiǎn)單繼承了UIButton,并重寫(xiě)了initWithFrame方法。為每一個(gè)MyButton對(duì)象默認(rèn)生成標(biāo)題和背景色:

生成的.a文件如下,可以看到里面包含了MyButton.o文件:

在SDK工程中引入.a文件。下面分兩種情況來(lái)看生成的SDK庫(kù)文件:

1. SDK庫(kù)文件做成動(dòng)態(tài)庫(kù)(設(shè)置方法看開(kāi)頭部分)

.a文件內(nèi)容被整合進(jìn)了SDK動(dòng)態(tài)庫(kù)文件中,引入App工程中時(shí),只需要引入SDK動(dòng)態(tài)庫(kù)就可以了

2. SDK庫(kù)文件做成靜態(tài)庫(kù)(設(shè)置方法看開(kāi)頭部分)

包中的信息:

.a文件內(nèi)容同樣被整合進(jìn)了SDK靜態(tài)庫(kù)文件中,這個(gè)更好理解。引入App工程中時(shí),只需要引入SDK靜態(tài)庫(kù)就可以了

總結(jié)下:

制作SDK庫(kù)時(shí),如果有依賴(lài)的.a文件,則最終生成的SDK庫(kù)文件會(huì)合并.a文件的內(nèi)容,而不論SDK庫(kù)文件是動(dòng)態(tài)還是靜態(tài)的。

下面的SDKFramework是個(gè)Framework庫(kù)文件(可能是動(dòng)態(tài)的,也可能是靜態(tài)的)

SDKFramework工程添加的內(nèi)容和SDKStatic工程是一樣的。也是自定義MyButton,默認(rèn)生成標(biāo)題和背景色(拷貝文件到工程):

SDKDemo工程自定義了MyView,默認(rèn)生成的MyView對(duì)象添加了一個(gè)MyButton按鈕和背景色:

1. 如果.framework文件是動(dòng)態(tài)庫(kù)

a. SDK打包為靜態(tài)庫(kù),如下:

靜態(tài)SDK包和動(dòng)態(tài)SDKFramework.framework文件是彼此獨(dú)立的。引入靜態(tài)SDK包時(shí),必須也導(dǎo)入SDKFramework.framework,否則編譯不過(guò),因?yàn)殪o態(tài)包有引入動(dòng)態(tài)庫(kù)中的符號(hào)。

b. SDK打包為動(dòng)態(tài)庫(kù),如下:

兩者還是彼此獨(dú)立的。動(dòng)態(tài)SDK包中會(huì)記錄依賴(lài)的動(dòng)態(tài).framework rpath,App運(yùn)行時(shí),dyld會(huì)根據(jù)這個(gè)信息去加載對(duì)應(yīng)的.framework依賴(lài)文件。如果找不到App將會(huì)在啟動(dòng)時(shí)奔潰...

2. 如果.framework文件是靜態(tài)庫(kù)

a. 首先SDK打包為動(dòng)態(tài)庫(kù)看看:

經(jīng)實(shí)踐,依賴(lài)的靜態(tài)庫(kù)會(huì)被整合進(jìn)動(dòng)態(tài)SDK包自身中。App中引入時(shí),只需要導(dǎo)入SDK包就可以。我們?cè)赟DKApp中導(dǎo)入SDKDemo,運(yùn)行可以看到如下效果:

b. 再看看SDK打包為靜態(tài)庫(kù):

根據(jù)上面截圖中信息,App中導(dǎo)入SDK包時(shí),也必須導(dǎo)入依賴(lài)的.framework了。否則編譯時(shí)將會(huì)出現(xiàn)如下圖所示找不到符號(hào)的錯(cuò)誤:

追加導(dǎo)入依賴(lài)的.framework,再次編譯運(yùn)行。OK?。?!

總結(jié):

1. 依賴(lài)的.framework為動(dòng)態(tài)庫(kù)

制作的SDK庫(kù)文件不論動(dòng)態(tài)還是靜態(tài)的。和依賴(lài)的.framework文件本身是彼此獨(dú)立的,不會(huì)發(fā)生符號(hào)整合的現(xiàn)象

2.?依賴(lài)的.framework為靜態(tài)庫(kù)

如果制作的SDK庫(kù)文件是動(dòng)態(tài)的,則依賴(lài)的.framework靜態(tài)庫(kù)內(nèi)容會(huì)被整合進(jìn)SDK庫(kù)文件中

如果制作的SDK庫(kù)文件是靜態(tài)的,則彼此是獨(dú)立的

這里又得分幾種情況討論:

1. Podfile中不使用use_frameworks! ?pods庫(kù)生成的是.a文件

a. 如果SDK制作成靜態(tài)庫(kù):

? SDK靜態(tài)庫(kù)不會(huì)整合Pods里三方庫(kù)中的符號(hào),最終導(dǎo)入App工程時(shí),需要SDK靜態(tài)庫(kù)、Pods中的三方庫(kù)文件一起導(dǎo)入

b. 如果SDK制作成動(dòng)態(tài)庫(kù):

? Pods庫(kù)中的符號(hào)會(huì)被合并整合進(jìn)入SDK庫(kù)中,導(dǎo)入工程時(shí),只需要導(dǎo)入SDK包就OK了

2. Podfile中使用use_frameworks! ?pods庫(kù)生成的是.framework文件。其中Pods_工程名.framework文件是個(gè)靜態(tài)庫(kù),管理的第三方庫(kù)生成的是framework動(dòng)態(tài)庫(kù)

a.如果SDK制作成動(dòng)態(tài)庫(kù):

SDK中會(huì)包含引入三方庫(kù)的rpath,App中引入SDK包時(shí),也必須引入三方庫(kù),否則dyld加載不了指定庫(kù)導(dǎo)致App啟動(dòng)時(shí)奔潰

b. 如果SDK制作成靜態(tài)庫(kù):

靜態(tài)SDK中會(huì)忽略Pods中的庫(kù)中定義的符號(hào)(也即彼此是獨(dú)立的)。如果靜態(tài)SDK中引用了動(dòng)態(tài)pods庫(kù)中定義的符號(hào),只要在App工程中也導(dǎo)入pods中動(dòng)態(tài)庫(kù),并在embeded binaries中添加。一樣是可以編譯運(yùn)行的。

其實(shí)怎么編譯,SDK工程中是個(gè)什么情形都不重要。重要的是要明白庫(kù)文件的本質(zhì),及它是如何發(fā)揮作用的?在什么階段發(fā)揮作用?然后學(xué)會(huì)查看編譯運(yùn)行時(shí)的報(bào)錯(cuò)信息,并配合使用otool、nm、lipo、ar、file等這些命令去查看庫(kù)文件的一些信息,最終追蹤定位到問(wèn)題。

原諒我最后都沒(méi)怎么貼圖了,因?yàn)榱鞒潭己颓懊娌畈欢?。我也?xiě)的手累了。如果你還有什么疑惑可以在下面評(píng)論,我會(huì)盡量及時(shí)回復(fù)。

iOS開(kāi)發(fā):SDK依賴(lài)第三方庫(kù)及其踩過(guò)的坑

公司開(kāi)發(fā)的SDK,是集成了各個(gè)平臺(tái)的商品,包括購(gòu)買(mǎi)、分享、提現(xiàn)等功能,為了加快進(jìn)度,我是使用了一些第三方。但是有些需求,比如分享到微信朋友圈或者還有,必須用到微信的SDK??紤]到后期的維護(hù)成本和集成,筆者采用了cocoapods管理第三方庫(kù)。

筆者有片文章專(zhuān)門(mén)介紹SDK的開(kāi)發(fā)步驟的,大家可以參考,我這里就直接進(jìn)入主題了。

首先,你創(chuàng)建一個(gè)靜態(tài)的framework工程MyTestSDK,把這個(gè)工程集成cocpapods,至于如何集成cocpapods,網(wǎng)上有教程,自己搜索。這個(gè)時(shí)候把你項(xiàng)目中所用的第三方庫(kù)添加到Podfile文件中,然后 pod install。這個(gè)時(shí)候你command + B 編譯運(yùn)行,如果你的第三方庫(kù)中還有Bundle資源,那么編譯后,第三方庫(kù)的bundle資源會(huì)被編譯,一起放到Products文件下的framework文件中,右鍵Show in Finder就會(huì)看到。如下圖所示的MBProgressHUD文件夾,里面都是MBProgressHUD第三方的資源文件。

然后把你的項(xiàng)目放入SDK工程中,編譯運(yùn)行一下,看看有沒(méi)有錯(cuò)誤。之所以先把SDK工程選用cocoapods管理,就是怕你的項(xiàng)目放入SDK中運(yùn)行報(bào)錯(cuò)。沒(méi)有任何問(wèn)題,直接編譯即可。

由于SDK中的第三方是通過(guò)cocoapods管理的,所以接入者的項(xiàng)目也要用cocoapods管理。

1:把SDK工程中,Products文件夾下的framework文件copy到項(xiàng)目中,最好項(xiàng)目中建立一個(gè)文件夾,專(zhuān)門(mén)放SDK和bundle。我是放到了一個(gè)文件夾中,方便分類(lèi)尋找。如下圖所示:

2:打開(kāi)終端,cd到SDK所在的文件夾下,執(zhí)行如下命令,回車(chē),創(chuàng)建spec文件。

其中,MyTestSDK是你的SDK名稱(chēng)。

創(chuàng)建出來(lái)的spec文件,是個(gè)很長(zhǎng)的文件,但是大部分都是注釋的,我這里只提取了有用的信息展示出來(lái):

然后把spec中依賴(lài)的第三方庫(kù),逐個(gè)加入到項(xiàng)目中的Podfie文件中。然后 終端打開(kāi),cd到自己的項(xiàng)目中,pod install即可。

本人親自測(cè)試過(guò)的,No Problem。當(dāng)初感覺(jué)SDK如果依賴(lài)了第三方庫(kù),接入的項(xiàng)目中也有同樣的第三方庫(kù),會(huì)不會(huì)沖突啊,感覺(jué)好難搞啊。事實(shí)證明,通過(guò)spec進(jìn)行依賴(lài),可以很好的解決這個(gè)問(wèn)題,也就沒(méi)有那么麻煩了。

首次開(kāi)發(fā)SDK還是遇到了很多問(wèn)題,運(yùn)行出現(xiàn)很多bug,但是最后還是一一解決了,就是沒(méi)有記錄下bug和解決發(fā)的方法。

1;path路徑不對(duì),就會(huì)報(bào)錯(cuò) ,如下

是因?yàn)槲野崖窂綄?xiě)成了:

其實(shí)正確的寫(xiě)法是:把“/”放在前面

2:SDK中有第三方,但是項(xiàng)目中的Podfile里面沒(méi)有這個(gè)第三方,報(bào)錯(cuò)如下所示:

解決辦法是就是在項(xiàng)目中的 Podfile里面加入缺失的第三方庫(kù),重新 pod install。

IOS SDK制作

IOS開(kāi)發(fā)有些時(shí)候通過(guò)制作SDK進(jìn)行組件化, 封裝化開(kāi)發(fā)很方便, 那么怎么制作一個(gè)可用的SDK呢? 直接上干貨

當(dāng)前環(huán)境:

MacOS 12.3.1

Xcode13.4.1

Intel Core i9

xcode → File → New → Project

Frame Library → Framework → Next

Product Name 中填寫(xiě)SDK名字 → Next 之后選個(gè)自己能找的到的地方保存工程

創(chuàng)建好了最終是這個(gè)樣子

先修改 Deployment info 部署信息, 這個(gè)要根據(jù)自己的 目標(biāo)工程 配置。例如 我加入的目標(biāo)工程支持到 ios10.0, 不支持iPad, Mac, 那么我創(chuàng)建的SDK也要對(duì)應(yīng)修改

其實(shí)自己隨便一個(gè)項(xiàng)目加進(jìn)去即可, 留意下版本號(hào)對(duì)應(yīng)即可

接下來(lái) Command + N 創(chuàng)建一個(gè)類(lèi)便于后面調(diào)用

例如我這邊創(chuàng)建一個(gè) SpriteFactory 類(lèi), 類(lèi)型是 NSObject , 并寫(xiě)入一個(gè)實(shí)例方法 factoryProductSprite

建好之后, 在公共文件 ProductSprite.h (第一個(gè), 你自己建的那個(gè)名字), 引入頭文件. 留意下引入文件格式即可

接下來(lái)我們需要修改一下 Build Settings 中部分內(nèi)容

接下來(lái)我們建立個(gè)組群, 管理下SDK

建完之后如下, 多了一個(gè)這個(gè)

添加 framework 的腳本文件, Build Phases 點(diǎn)擊 + 選擇 New Run Script Phase

把這個(gè)復(fù)制進(jìn)去

上方選擇新加的 Targets 選擇 Any iOS Device 運(yùn)行

由于我們剛才已經(jīng)寫(xiě)腳本了, 所以會(huì)自動(dòng)生成模擬器真機(jī)的SDK, 并且自動(dòng)彈開(kāi), 如下

其他項(xiàng)目如果想使用, 把 .framework 拖進(jìn)去或者復(fù)制項(xiàng)目再 add 進(jìn)去即可

加入之后如下, 留意下 General 中 Frameworks, Libraries, and Embedded Content 這快, 如果沒(méi)有(老版本), 需要手動(dòng)加進(jìn)去 .framework

在合適地方調(diào)用, 引用頭文件格式 #import "ProductSprite/ProductSprite.h" , 下面寫(xiě)進(jìn)去對(duì)應(yīng)方法

運(yùn)行可看到

動(dòng)態(tài)庫(kù)如果正常按上面方式處理會(huì)報(bào)錯(cuò), 例如

Targets → Build Settings → Mach-O Type 為 Dynamic Library

運(yùn)行時(shí)候會(huì)這樣Crash

目標(biāo)文件: Build Phases 點(diǎn)擊 + , 選擇 New Copy File Phase

點(diǎn)擊 + , 選擇對(duì)應(yīng)動(dòng)態(tài)庫(kù)加進(jìn)去, Destination 留意選擇 Frameworks

修改 Targets → Build Settings → Build Options → Validate Workspace 為 Yes

配置完之后再運(yùn)行, 正常打印


當(dāng)前題目:ios開(kāi)發(fā)sdk,IOS開(kāi)發(fā)者模式
標(biāo)題路徑:http://weahome.cn/article/dsdpegp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部