Framework打包

iOS app須要在許多不一樣的CPU架構下運行:xcode

  • arm7: 在最老的支持iOS7的設備上使用架構

  • arm7s: 在iPhone5和5C上使用app

  • arm64: 運行於iPhone5S的64位 ARM 處理器 上ui

  • i386: 32位模擬器上使用spa

  • x86_64: 64爲模擬器上使用調試

 

因爲須要打包的代碼部分大多數由Swift編寫。而後瞭解背景知識,Swift只支持動態庫(Dynamic)打包。code

因此先用動態庫進行打包。試坑吧:對象

1.打開Xcode(圖爲樓主更新到Xcode8以後採用樣式),建立項目圖片

選擇如圖下所示1建立Framework(2的話就是建立靜態庫,也就是.a)資源

2.建立bundle,在上面Framework的基礎上面Add Target選擇macOS中的Bundle(因爲建立的是默認的OS X,可是須要被實用的是在iOS上面使用的bundle 是點擊Build Settings欄,搜索Base SDK這一行 將OS X的SDK替換成iOS)

3.關於Framework和Bundle。framework裏面只能存放代碼和頭文件。bundle裏面則存放資源文件,相似於圖片,xib,plist等文件。

4.建立一個新的工程,而後將上面建立的Framework工程的xcodeproj拖拽進入工程。編譯一下確保可以正常工做。(建立了聯編工程就能夠很是方便的進行調試,弄出好的Framework)

5.關於使用的第三方庫問題:首先確定不能將全部的第三方庫打包進入Framework中,由於這樣會增大包體積,並且若是其餘的framework裏面也使用的話,同時若是你打進包裏面,那麼外面就沒法使用了。

6.關於存放在bundle裏面的圖片資源的調用 所有須要加上 bundle名字+圖片名字

iOS開發中不免會用到xib。因此關於xib獲取ViewController以及View都須要在bundle那一欄填入下面方法獲取的bundle

因爲樓主在項目中使用的圖片可能會被外面代碼使用,因此樓主直接將圖片資源放在外面,代碼能夠正常調用不須要加上bundle的名字。可是在Xib中若是使用了圖片那麼就會報錯,而且加載不出來,這個時候就須要在代碼從新調用一遍(有關在Framework的Xib中使用工程外面的圖片有方法顯示出來的能夠留言)。

7.有關Stroyboard的使用。也是能夠在封裝在bundle中,在Swift裏面直接指定Storyboard的module(前提是有這個framework並且指定Class和Storyboard ID)

樓主天真的認爲在OC中也能夠這樣使用。可是事實上並不能夠,因爲OC建立不併非Dynamic庫,因此沒法動態連接,因此視圖控制器會被加載出來,可是沒法連接到所對應的類(於是苦逼的樓主將Storyboard部分的視圖所有切換成了xib。若是有方法跪求告知

建立ViewController的Static寫法(重寫initwithNibname方法)(經過Xib)

建立ViewController的Dynamic寫法(經過Stroyboard)

 

因爲樓主剛剛使用Swift開發,因此不清楚framework裏面有這麼多坑。

因而乎付出了慘痛的代價,將相關的Swift代碼所有替換成了OC代碼。一切的原因是動靜態庫的問題

使用OC後只須要將下圖所示不勾選,而後在你的工程中添加該文件便可。可是在Swift打包的Dynamic庫中,不勾選就會報錯:沒有所謂的文件(樓主關於Swift打包Dynamic庫問題因爲項目以及時間緣由沒有來得及細細研究。暫時挖個坑在這,以便之後東山再起。(若是有同窗看到這篇文章而且能夠幫忙答疑解惑,那將萬分感激)

靜態庫須要注意的點) 若是主項目中採用了Category的話 須要在引用framework的工程中設置 Build Pharse -> Other Linker Flags中加上 -all_load 就OK了,再次運行工程,能夠完成全部的編譯過程.

-Objc這個標誌選項會讓連接器加載靜態庫全部的Objective-C的類和Category, 這樣就能把Category中實現的方法整合起來. 可是因爲這樣作會使可執行文件變大, 也會整合一些用不到的對象, 因此纔沒有默認使用-ObjC標誌, 而是須要咱們手動添加.

-all_load

加載全部靜態庫中的文件. 相比-ObjC, 不一樣點就是-all_load會將全部的(包括非Objective-C)文件都整合到靜態庫中.
*注意 : 假如你使用了不止一個靜態庫,而後又使用了這個參數,那麼你頗有可能會遇到duplicate symbol錯誤,由於不一樣的庫文件裏面可能會有相同的目標文件.

-force_load (path_to_archive)

加載指定路徑的靜態庫. 相比-all_load, 不一樣點就是-force_load只是徹底加載了一個庫文件,不影響其他庫文件的按需加載.

使用-all_load或者-force_load大部分緣由是由於Xcode4.2以前的版本的連接器的bug, 在64位iOS應用環境下當靜態庫中只有分類而沒有類的時候, -ObjC參數就會失效了. 因此爲了兼容Xcode4.2以前的版本, 有兩種解決方法:

1.使用-all_load或者-force_load來替代

2.能夠在分類中添加類的聲明以及實現

 

未完待續!!!

相關文章
相關標籤/搜索