這篇文章主要記錄我自開始SDK開發(fā)以來的經(jīng)驗(yàn)總結(jié)以及所遇到的坑, 從17年3月份開始, 作為一個(gè)從未做過SDK開發(fā)的iOS開發(fā)人員, 基本也是把坑從頭到尾走過了一遍...
簡單介紹
靜態(tài)庫和動(dòng)態(tài)庫
動(dòng)態(tài)庫: 這是我們最常用的一類庫, 因?yàn)橄到y(tǒng)的UIKit.framework和Fundation.framework這兩種都是動(dòng)態(tài)庫. 包括我們自己也可以制作framework動(dòng)態(tài)庫
靜態(tài)庫: 我們常用的第三方SDK絕大多數(shù)都是靜態(tài)庫, 而且包括.a和.framework兩種形式
我們也看到了, framework既可以是動(dòng)態(tài)庫也可以是靜態(tài)庫, 只是在配置的時(shí)候配置一下就可以了, 操作并不麻煩
很多人有這么一個(gè)誤區(qū), 就是動(dòng)態(tài)庫影響審核上線, 在這里更正一下, 如果是你自己制作的動(dòng)態(tài)庫, 只要版本控制在iOS8以上, 是可以上線的, 親測(cè)!
制作.framework以及.a的流程我就不貼了, 很容易就搜到, 在這里我提幾個(gè)需要注意的幾個(gè)點(diǎn):
-
framework庫可以通過配置Mach-O Type (Static Library靜態(tài)庫)(Dynamic Library靜態(tài)庫)來選擇是動(dòng)態(tài)庫還是靜態(tài)庫
mach-o type.png -
使用分類出現(xiàn)問題, 在主工程加 -ObjC
-objc.png -
使用動(dòng)態(tài)庫的時(shí)候需要在Embedded Binaries導(dǎo)入, 不然會(huì)報(bào)image not found錯(cuò)誤
embedded.png -
需要在你的framework包的.h文件里面添加文件引用, 不然會(huì)報(bào)頭文件缺失
misssing.png
missing2.png
進(jìn)階
當(dāng)你SDK項(xiàng)目開發(fā)到一定階段的時(shí)候你會(huì)發(fā)現(xiàn)你又遇到問題了, 你需要使用其他第三方SDK的東西, 所以這里提供兩種方案給你們
- 如果你的項(xiàng)目是.a靜態(tài)庫, 是直接可以包含其他靜態(tài)庫的
- 如果你的項(xiàng)目是.framework靜態(tài)庫或者動(dòng)態(tài)庫, 那么你使用其他第三方靜態(tài)庫只能是依賴關(guān)系, 而不能是直接包含的關(guān)系
(目前我沒解決framework是否可以直接包含其他framework這個(gè)問題, 如有大神, 請(qǐng)指教)
寫文章能力有限, 這里把我遇到問題并解決問題的兩個(gè)博客分享給大家, 都是很有經(jīng)驗(yàn)的開發(fā)寫的, 大家一起互相學(xué)習(xí)~
方案1:包含.a靜態(tài)庫
< 第一種方案: 因?yàn)?a靜態(tài)庫可以直接包含, 所以通過修改framework為.a實(shí)現(xiàn)包含關(guān)系, 可以做到一個(gè)包包含多個(gè)包的方案
方案2:依賴第三方靜態(tài)庫
< 第二種方案: 不管是靜態(tài)framework還是動(dòng)態(tài)framework, 都只能是依賴的關(guān)系, 而不能直接包含, 具體怎么依賴, 大家可以詳細(xì)的看看這篇文章, 講得很仔細(xì), 只要一步步做, 肯定沒問題
關(guān)于使用bundle資源
動(dòng)態(tài)庫和靜態(tài)庫使用bundle資源的加載方式是不一樣的, 因?yàn)樗麄兊穆窂讲灰粯? 也致使我踩了N天的坑才找到問題所在, 也不算是解決問題??
大家先看下面的兩張截圖
大家可以看到動(dòng)態(tài)庫的最終路徑是HuiSDK.framework, 而靜態(tài)庫的路徑是HuiStationDemo.app, 也就是外部的主工程, 而不是framework本身, 這樣我們?cè)谑褂貌煌愋偷膄ramework的時(shí)候, 取資源文件就要注意用不同的方式了
動(dòng)態(tài)庫路徑 :
DynamicBundle.png
靜態(tài)庫路徑 :
StaticBundle.png
靜態(tài)庫加載方式:
現(xiàn)在我們?cè)赽undle資源新建一個(gè)storyboard, 然后在framework里面加載, 演示一下如何在SDK里面加載資源文件
然后要把bundle資源bopy進(jìn)主工程
這樣靜態(tài)庫通過這兩層關(guān)系我們就可以在SDK里面取到storyboard了, 如下:
動(dòng)態(tài)庫加載方式:
這里創(chuàng)建bundle和storyboard的方法和步驟和靜態(tài)庫是一樣的, 只是依賴關(guān)系和copy不太一樣, 具體如下截圖:
SDK:
Demo:
通過這三層關(guān)系, 我們可以在主工程調(diào)用SDK, 在SDK里面獲取資源文件了!
如有不懂, 可以參照demo
demo鏈接:
靜態(tài)庫:https://github.com/LeoTnT/StaticDemo
動(dòng)態(tài)庫:https://github.com/LeoTnT/DynamicDemo
以上內(nèi)容是本人在開發(fā)中實(shí)際遇到并解決的一些問題, 如有方式不對(duì)或者有問題, 歡迎留言討論!
祝大家新年快樂~??, 溜了溜了, 回家過年, 待更~