日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Framework打包

發布時間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Framework打包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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.可以在分類中添加類的聲明以及實現

?

未完待續!!!

轉載于:https://my.oschina.net/u/2483082/blog/752413

總結

以上是生活随笔為你收集整理的Framework打包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。