1. 程式人生 > >ios開發:Xcode8製作framework及使用

ios開發:Xcode8製作framework及使用

前言

網上關於Framework製作的教程數不勝數,然而都過於陳舊,最新的也是使用Xcode7的教程,而且有些設定也只給出步驟,並沒有給出原因,而且按照有些教程製作出的framework還有些問題,所以我把自己製作framework的過程記錄下來,並且使用的是最新的Xcode8環境。

正文

首先新建一個專案,選擇Cocoa touch Framework

然後隨便取一個名字

然後將要封裝成framework的程式碼拖入工程

選擇工程檔案>target第一項>Build Setting>搜尋linking,然後幾個需要設定的選項都顯現出來,首先是Dead Code Stripping設定為NO,網上對此項的解釋如下,大致意思是如果開啟此項就會對程式碼中的”dead”、”unreachable”的程式碼過濾,不過這個開關是否關閉,似乎沒有多大影響,不過為了完整還原framework中的程式碼,將此項關閉也未曾不可。

The resulting executable will not include any “dead” or unreachable code

然後將Link With Standard Libraries關閉,我想可能是為了避免重複連結

最後將Mach-O Type設為Static Library,framework可以是動態庫也可以是靜態庫,對於系統的framework是動態庫,而使用者製作的framework只能是靜態庫。

然後將需要公開的標頭檔案從Project中拖入Public,至於是否需要將私有的標頭檔案拖入Private,我覺得直接放在Project中即可,若是Private中有標頭檔案,打包以後的framework中會多出一個Private的資料夾包含著放入Private的標頭檔案,不過我覺得如果是私有最好還是不要讓別人看到。

為了對一些特殊機型的支援,新增armv7s架構,當然不新增也沒什麼問題,只有5和5c使用了此架構。

下面就開始編譯了,先選擇Generic iOS Device,按下Command+B:Build一下

然後隨意選擇一個模擬器再次Build一下

找到Build後的framework

我們看到總共有兩個資料夾,上面是真機編譯生成的檔案,下面是模擬器編譯生成的檔案。

然後用命令列將下面兩個檔案進行合成


將合成後的檔案輸出到桌面之上,這裡解釋一下這看似很複雜的命令:lipo -create +上面兩個檔案的路徑 + -output + 合成後文件的輸出路徑


然後用輸出在桌面上的YuXinSDK替換掉前面Debug-iphoneos中framework中的YuXinSDK

將這做好的framework直接拖入要使用的工程中

注意將Copy items if needed打勾

然後在工程的search path中加上此framework的Headers的路徑


本以為大功告成,按下了Command+R悠閒的等著編譯執行,然而在連結的時候卻出了問題

很經典的錯誤,庫中缺少了i386架構的檔案,這時我就比較困惑了,明明將模擬器生成的庫檔案合併進來了,怎麼在模擬器上編不通呢!用lipo命令檢視一下,果然沒有i386架構的檔案

再看一下用模擬器生成的framework

居然只有x86_64架構

我換成iPhone 4s模擬器,編譯後生成的檔案居然包含了i386

經過我的測試,在iPhone5之前編譯的framework都是i386架構,iPhone 5s之後都是x86_64架構,然而在所有模擬器上執行時,這兩種架構缺一不可,然後我將這兩種架構的framework合併在與真機的合併

拖入工程後終於能夠正常運行了

後來經過摸索發現之前按照網上的教程卻把自己坑了

開始將上圖中的選項設為YES,導致其編譯時只生成當前機器的框架,將其設定為NO後,發現用模擬器編譯後生成的framework同時包含x86_64和i386架構。

bitCode錯誤

在專案中引入靜態庫後,archive的時候又會出現錯誤

bitcode bundle could not be generated because ... was built without full bitcode.All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64

Bitcode是蘋果在Xcode7及以後推出的新功能。用於程式碼的二次編譯,針對CPU進行優化,編譯工作由蘋果AppStore後臺來完成。
針對iOS是可選項,預設開啟。watchOS 和 tvOS 是必選項。

所以需要開啟庫工程的此選項並加上-fembed-bitcode引數,重新編譯

如此archive時就不會出問題了,到此我在製作使用framework時遇到的問題都在這裡了。

總結

架構

對於模擬器來說4s和5的模架構是i386的32位架構,5s至今是x86_64的64位架構。對於真機來說3GS~4s是armv7架構,5和5c是armv7s架構,5s至今是arm64架構

靜態庫

靜態庫: 連結時完整地拷貝至可執行檔案中,被多次使用就有多份冗餘拷貝。

動態庫

動態庫:連結時不會拷貝至可執行檔案中,執行時動態載入進記憶體,供程式呼叫,只加載一次,多個程式可以共用。

相關推薦

ios開發Xcode8製作framework使用

前言 網上關於Framework製作的教程數不勝數,然而都過於陳舊,最新的也是使用Xcode7的教程,而且有些設定也只給出步驟,並沒有給出原因,而且按照有些教程製作出的framework還有些問題,所以我把自己製作framework的過程記錄下來,並且使用

iOS開發自定義framework並打包

文/CveniEs(簡書作者) 原文連結:http://www.jianshu.com/p/305b716df620 著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。 關於打包製作屬於自己的framework  首先宣告一下,我是一個菜鳥,只是在工作

iOS 開發CocoaPods 安裝問題 ERROR: Error installing cocoapods: activesupport requires Ruby version>=2.2.2

iOS 開發:CocoaPods 安裝以及 ERROR:  Error installing cocoapods: activesupport requires Ruby version >= 2.2.2. 今天用新的Mac筆記本安裝coco

iOS開發在專案中新增podfile配置檔案使用cocoapods匯入第三方庫

新建一個專案中是沒有pods的配置檔案的,下面介紹一下怎麼在新建的專案工程裡面新增podfile配置檔案,以及包含xcodeproj的那個檔案的(前提是電腦上已經安裝了cocoapods,安裝過程我在另一篇文章中有寫)。 (1)新建一個Xcode專案,cd到該檔案目錄下 (2)執

iOS開發2017 蘋果APP上架更新應用版本注意事項APP版本迭代步驟方法

前幾天蘋果剛出臺新的政策協議,警告禁止使用APP熱更新,然後就收到蘋果發的警告郵件,然後並沒有在意,直到今天需要更新之前上架應用版本,才發現了問題。如果你的開發者賬號已經同意了蘋果開發者官網的最新協議

iOS開發UILabel的公共屬性拓展屬性

分享 十個 con copy atomic tin 方法 lba mode 在IOS開發的過程中,UILabel是很常用的一個控件,同時也是大量使用的一個控件。創建一個UILabel一般需要五六句代碼,如果我們需要創建幾十個UILabel,就意味著我們要寫五六十句代碼,其實

iOS開發UILabel字號根據屏幕縮放

control after call git 步驟 obj gin begin follow 場景: 假設我們有這樣一個需求,iPhone 6(屏幕寬度為375pt)上的設計圖上的字號為17pt,iPhone 6 Plus上的字號根據屏幕寬度縮放,即字號為(17pt x 4

iOS 開發Method Swizzling

是個 不足 沒有 int from ios 開發 解決方案 它的 nslog iOS 開發之Method Swizzling 前言 如果你還不知道什麽是Method Swizzling,你可以看看NSHipster 的文章 ,我簡單介紹一下,method swizzling

iOS 開發 解決Xcode7.3 不能自動索引標頭檔案,檔名等問題

iOS 開發: 解決Xcode7.3 不能自動索引標頭檔案,檔名,程式碼補全等問題 解決方案: 開啟Xcode –> Target –> BuildSettings –> Apple LLVM 7.1 -Language-Objective C 下面的 Weak

iOS開發UITableview的多選功能實現

一、 先看效果: 最近專案中要運用即時通訊實現群組功能, 在建立群時需要選擇新增多個成員: 二、思路: 第一次點選cell選中, 再次點選取消選中; 三、方法: 只需要設定兩個屬性, 操作兩個方法即可; 1、UITableview 自帶多選功能: //允許多選 _

iOS開發環信整合步驟以及常見錯誤

環信官方文件 一、整合: 下載SDK手動整合或者CocoaPod終端整合: 下載SDK 匯入檔案以及依賴庫: 關閉Bitcode: Build Settings → Linking → Enable Bitcode 中設定 NO。 二、常

iOS開發字典(NSDictionary)和陣列( NSArray)轉換成字串

概述: 在專案開發中,總是與伺服器進行著介面的互動,傳參是不可缺少的一部分。後臺返回的j son資料我們可以很好的解析使用,但是我們如何向後臺傳送j son資料的引數呢?要知道,一般伺服器是不允許傳物件的。以下是在專案中遇到的實際問題,在此總結一下,供大家交流。 一. 字典轉字串:

iOS開發發出系統的聲音!發出自己的聲音!

這個連結非常詳盡地列舉了IOS7裡面所有的系統聲音,聲音的ID,聲音的存放位置 儘管現在已經是ios8的時代,但是系統聲音這個東東不會因此過時,畢竟聲音就那幾十種,不會一下子有太大變化。 https://github.com/TUNER88/iOSSystemSou

iOS開發UILabel字號根據螢幕縮放

場景: 假設我們有這樣一個需求,iPhone 6(螢幕寬度為375pt)上的設計圖上的字號為17pt,iPhone 6 Plus上的字號根據螢幕寬度縮放,即字號為(17pt x 414pt / 375pt)= 18.768pt 解決方案: 如果一個一個設定太麻煩,容易遺漏,這時候我們採用 runtime

iOS開發常用的UIView控制元件——UILabel、UITextField、UIButton

前面幾篇文章已經對iOS開發中比較基本的幾個檔案進行了瞭解,今天主要學習StoryBoard檔案和幾個常見的UI控制元件。 Storyboard功能是在iOS5開始新增的功能,一種新技術的出現大多是為了彌補舊技術的不足,而在storyboard之前iOS 開發設計介面是使用nib檔案(xib

iOS開發第一個iOS程式分析——AppDelegate.h檔案和檢視View、檢視控制器ViewController

在上一篇文章iOS開發:第一個iOS程式分析——代理,生命週期函式中主要介紹了iOS使用Objective-C開發的兩個主要檔案main.m和AppDelegate.m和控制程式生命週期的函式,接下來將介紹另外兩個檔案:AppDelegate.h檔案、UIViewController.m檔案和i

iOS開發第一個iOS程式分析——代理,生命週期函式

上一篇文章中我們開發了第一個iOS應用程式,用來計算兩個整數的和,今天我們將介紹其中的兩個檔案: 1.main.m檔案 首先展開supporting Files並且開啟其下的main.m檔案,其中main函式就是應用程式的入口,main函式只是標記了一個自動釋放池自動決定何時釋放記憶體,

iOS開發第一個iOS程式,加法計算器

相信很多學習程式設計的人,不管是學習C,C++,JAVA,還是iOS開發用的Objective-C,入門不久就迫切地想寫點看得見的介面玩玩。當然瞭解諸如iOS架構,系統層次這些是非常必要的,但是作為入門案例,我們不妨從最直觀的地方入手!! 下面開始編寫我們的第一個iOS程式: 1.使用的

iOS開發- UILabel 自動換行 高度自適應

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

iOS開發之日期格式轉換時間間隔判斷

0. 說明 支援時間戳與日期、日期和字串的相互轉換; 支援日期轉星期; 支援以下時間段判斷:一分鐘內、一小時內、昨天、今天、明天、今年; 1. 具體程式碼 // // NSDateExt.h // SwiftExercises // //