2019獨角獸企業重金招聘Python工程師標準>>>
iOS app需要在許多不同的CPU架構下運行:
-
arm7: 在最老的支持iOS7的設備上使用
-
arm7s: 在iPhone5和5C上使用
-
arm64: 運行于iPhone5S的64位 ARM 處理器 上
-
i386: 32位模擬器上使用
-
x86_64: 64為模擬器上使用
?
由于需要打包的代碼部分大多數由Swift編寫。然后了解背景知識,Swift只支持動態庫(Dynamic)打包。
所以先用動態庫進行打包。試坑吧:
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.可以在分類中添加類的聲明以及實現
?
未完待續!!!