iOS學習——iOS項目Project 和 Targets配置詳解,iostargets

來源:互聯網
上載者:User

iOS學習——iOS項目Project 和 Targets配置詳解,iostargets

  最近開始學習完整iOS項目的開發流程和思路,在實際的項目開發過程中,我們通常需要對項目代碼和資料進資料列版本設定和管理,一般比較常用的SVN或者Github進行代碼版本控制和專案管理。我們iOS項目的開發工具Xcode本來就整合了Github的代碼控制,所以用GitHub會更方便一些,想具體瞭解Xcode和GitHub連結具體操作步驟的小夥伴可以戳這裡:iOS學習——Xcode9上傳項目到GitHub

  建立完項目之後,我們再對一個項目進行代碼開發之前,我們首先需要對iOS項目的開發環境進行搭建,我們的應用程式名稱、項目名稱、應用表徵圖、啟動圖片等都是在這一步進行設定的,所以這一部分是整個項目開發的基礎,在後續的開發過程中也經常會有些設定需要用到這裡的步驟進行修改。但是目前網上查到的資料都非常簡短和零散,所以今天我們希望對Xcode上iOS項目搭建各種細節都進行一個詳盡的瞭解和學習。

一 Project 和 Targets區別

  首先,iOS項目的開發環境搭建主要就是基於我們項目的Project 和 Targets進行展開的。那麼,這兩個東西到底是啥玩意呢?我們點擊我們的項目名,就會出現所示的介面。從圖片中可以看到,在項目導航面板的右側面板上有藍色和紅色框所示的PROJECT和TARGETS兩部分。

  PROJECT和TARGETS到底是什麼意思呢?官網的解釋戳這裡:Xcode Concept,看到英文就頭疼的戳這裡看譯文:iOS:[譯]Xcode Concepts--概念Target、Project、Build Setting、Workspace、Scheme。簡單解釋如下:

  • project:project是所有檔案、資源、資訊/配置的repository。一個project包含所有build your products所需的內容並且維護他們之間關係。它可以包含多個targets。一個project為所有的target定義預設的build setting(每一個target可以自訂它們的build setting,這些自訂的setting會覆蓋project預設的build setting,這個在後面會講到)。 
  • target:簡單地說,target定義了project的編譯設定,確定了project中各種資源和代碼的編譯順序。每個target都唯一依賴於一個project,但是一個project中可以有多個targets,所示的target就有2個(KLBaiSi、KLBaiSiTest),每一個的設定不同,但是同一時間裡只有一個active Target,在編譯時間我們可以選擇用哪一個target進行編譯,具體操作選擇如所示。
  • 一個Target和它的product可以和其他Target聯絡,如果一個target build需要另一個target的“輸出”,可以說成第一個target依賴第二個。如果這倆個target在同一個workspace,Xcode會發現他們的依賴關係,從而build the products按照特定的順序。這樣的關係被稱為“ implicit dependency.” 你也可以為倆個targets指定明確的target 依賴關係在build setting裡面。例如,你可能build一個library和一個連結這個library的application(同一個workspace)。Xcode可以發現這種關係並且自動build這個library first。然而,你如果要去連結library的某個版本而不是one built in the workspace,你可以在build settings裡建立一個確定的依賴關係,它將會覆蓋implicit dependency。

   

二 project和target的屬性設定

  關於project和target的屬性設定,如所示就是project和target的屬性設定介面,左邊是project的屬性設定介面,右邊是target的屬性設定介面。相對而言project的比較簡單,只有info和build setting兩項,畢竟只是對項目資源進行簡單的設定,而target的設定則比較複雜,有general、capabilities、resource tags、 info、build setting、build phases和build rules七項,因為target的每一項設定都直接決定了我們最終App的顯示效果。下面我們就一一來學習和瞭解各個介面的設定有什麼作用。

   

2.1 project屬性設定

  project的屬性設定有兩塊內容,info和build setting,但是project的build setting和target的build setting之間是相關的,target的build setting的一部分設定會繼承project的build setting部分。所以,project的build setting部分內容就放在2.2target屬性設定部分進行統一講解,本小節就主要瞭解project的info屬性設定部分,info屬性的介面如下:

  主要分為三部分:Deployment Target、Configurations和Localizations

  • Deployment Target:部署配置,主要是對本project的產生的App的可以啟動並執行最低版本進行配置,預設是當前Xcode上API的最新版本,所以,在我們的項目中有需要對低版本適配的地方需要在這裡設定。同樣的,我們還可以在build setting中對這一屬性進行設定,兩者是同步的。
  • Localizations:本地化,這裡的功能主要是添加我們的App所支援的語言,通過最下面的紅色圈內的【+】【-】按鈕可以添加或刪除不同的語種,並可以選擇根據手機的設定進行不同語種的自適應。關於最下面的選擇是否開啟國際化,預設是開啟的,至於如何進行國際化和不同語種的適配詳情見:詳述iOS國際化
  • Configurations:用來配置iOS項目的xcconfig檔案,主要用於在幾套不同的開發環境編譯。xcconfig檔案其實就是xcode裡的config檔案,本質是一個用來儲存Build Settings索引值對的純文字檔案。這些索引值對覆蓋Build Settings中的值,所以當在xcconfig檔案中配置了的選項,在Build Settings中設定將失效。我們在項目中一般不會進行xcconfig檔案的自訂。具體xcconfig檔案是什麼東東,大家可以查看:iOS之Xcconfig雜談 。估計很多新入門的iOS開發對xcconfig檔案都不是很熟悉(其實我也不是很瞭解。。。), 但是大家可能都用過Cocoapods, 其實Cocoapods的項目組態管理很多都是依賴xcconfig檔案去實現的。所以在使用Cocoapods進行導包的項目中,我們通過開啟.xcworkspace檔案,我們會發現project-->info-->configutations下的都有對應的設定檔,而原先沒有用Cocoapods配置的則沒有相關的設定檔,具體區別如所示。

    

 2.2 target屬性設定

  在前面我提到了,target的屬性設定的內容比較多,總共有general、capabilities、resource tags、 info、build setting、build phases和build rules七項,接下來我們就一個一個來瞭解和學習。

 2.2.1 target的general屬性設定

  target的general屬性設定介面如所示,主要分為六個部分,下面我們隊每一部分的設定的意思進行一個解讀。

 

  • Identify(標識符)欄主要定義了一些和應用發布有關的識別屬性。
    • Display Name(App應用顯示名):安裝到iOS手機或iPad上App的名稱。
    • Bundle Identifier(包標識符)是該應用的唯一ID,用來讓作業系統和AppStore識別。在建立項目或者對象過程中Xcode就自行建立了包標識符,一般情況下不要修改它。
    • Version(外部版本號碼)使使用者能夠看到的版本號碼。
    • Build(組建號)開發人員自己看到的版本號碼,以區分自我裝載版本。
  • Signing(簽名)主要是進行認證管理,在真機調試或者打包時我們都需要進行簽名進行認證才可以的。這裡有一個簡單的使用教程,大家有需要可以戳這裡: IOS的Automatically Sign功能,直接在裝置上打包
  • Deployment Info(部署資訊)定義了一些和應用配置相關的識別屬性。
    • Deployment Target(部署對象):用來設定支援的最低版本。這個和project的info中的一個意思,並且,這兩個的設定最好是一樣,如果不一樣,最後的App會以target的設定為準。
    • Devices(裝置):用來設定支援的裝置,有iPhone、iPad和Universal三個選項。
    • Main Interface(主介面):應用啟動時預先載入的主介面視圖。一般有兩種方法:
      • 一種是通過Main.storyboard進行啟動,設定這種方法需要我們整個項目的邏輯和跳轉都在Main.storyboard中完成
      • 取消stroryboard的方式啟動主介面,而是通過代碼的方式運行main.m的方法進行啟動,並通過在AppDelegate的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中指定主介面視圖進行啟動。一般項目中都是採用這種方法進行的,因為一般項目中介面比較多,很多都是通過純程式碼的風格進行定義的,這樣方便修改和定位問題,項目的邏輯也更清晰,特別是多人合作的項目,這種風格更適合
    • Device Orientation(裝置方向):定義應用支援的方向。有Portrait、Upside Down、Landscape Left(橫評、Home鍵在左)、Landscape Right幾種方向。
    • Status Bar Style(狀態列樣式)
  •  App Icons and Launch Images:應用表徵圖和啟動頁面。主要設定三項:應用表徵圖、啟動圖片和啟動頁面。具體應用表徵圖和啟動頁面的大小尺寸介紹見官網:Human Interface Guidelines
    • App icon Source(應用表徵圖):對應著檔案資源Assets.xcassets目錄中的AppIcon中的圖片,如所示。最右邊的面板可以選擇添加哪一種或哪幾種裝置上的表徵圖,每一個型號的裝置上的表徵圖的尺寸是不同的。在中間有一個個的小格子,我們將所有切好的表徵圖直接拖過來,他們會自動找到自己應該放在的格子裡。這些小格子主要分為四類:
      • Notification:通知時的表徵圖,類似有應用相關的推送訊息時,有時候需要顯示本應用的表徵圖則會顯示這個尺寸的
      • Spotlight:搜尋小表徵圖,當在Spotlight中輸入應用程式名稱,搜尋結果中出現該應用時的表徵圖就是這個尺寸的,還有設定裡的表徵圖也是這個尺寸的。
      • App:這就是正常的App表徵圖,安裝好之後在案頭顯示的,或者分享推薦時顯示的應用也是這個尺寸的表徵圖
      • App store:市集中的顯示的表徵圖
    • Luanch Image Source(啟動圖片):同樣對應著檔案資源Assets.xcassets目錄中的LuanchImage中的圖片,設定了各種情況下的啟動圖片,具體介面就不了,和Appicon一樣,我們將所有切好的表徵圖直接拖過來,他們會自動找到自己應該放在的格子裡。啟動圖片實際上定義了應用啟動後的介面大小,所以在不同機型中我們需要做好適配,見下面的【啟動頁面在螢幕適配中的作用】。一款App必須設定對應裝置的啟動圖片,否則點開應用會是一片黑白。
    • Luanch Screen File(啟動分頁檔):是一個storyboard檔案,作用與Luanch Image一樣,但是開機檔案的優先順序高於啟動圖片,就是說如果兩個都設定了,那麼啟動頁面以開機檔案為準,如果都沒有設定,則無法啟動
    • 啟動頁面的作用:在我們點擊應用表徵圖啟動應用時,應用啟動需要一定的操作時間,再啟動期間,為了增強應用程式啟動時的使用者體驗,您應該提供一個啟動映像。啟動映像與應用程式的首螢幕看起來非常相似。當使用者在主畫面上點擊您的應用程式圖示時,iPhone OS會立即顯示這個啟動映像。一旦準備就緒,您的應用程式就會顯示它的首螢幕,來替換掉這個啟動佔位映像。一定要強調的是,之所以提供啟動映像,是為了改善使用者體驗,並不是為了提供:應用程式進入體驗」,比如啟動動畫。
    • 啟動頁面在螢幕適配中的作用:每個機型,比如同時支援iPhone和iPad的程式,需要分別為iPhone跟iPad指定啟動圖片。當舊的iPhone 4的程式,運行在iPhone 5上面,沒有iPhone 5的啟動圖片,就採用相容模式,上下留黑邊。當為iPhone 5指定了新的啟動圖片,系統就認為這個應用程式是已經適配了iPhone 5的。當舊的iPhone 5程式運行在iPhone 6上面,假如沒有經過適配。舊程式自動等比放大,鋪滿新手機,舊程式也可以正常運行。這種方案可算是自動適配。但因為舊程式展開了,整體看起來有點虛,也不能更好利用大屏空間。當需要開發人員手動適配的時候,跟iPhone 4過渡到iPhone 5一樣,在新程式中,指定一張新的啟動圖片。當指定了啟動圖,系統就認為應用已經做好了螢幕適配,螢幕解析度就變成應有的大小。在某機型上,如果是自動適配,比如iPhone 5,老版程式就會在螢幕上、下倆端多出倆塊黑條;比如iPhone6/6plus,老版程式就會自動等比展開。那如何關閉自動適配?指定啟動圖或者使用Launch Screen File.xib,即程式使用手動適配,不會做展開等,但是程式內部必須已做處理,否則使用自動適配方案。
  •  Embedded Binaries(綁定二進位檔案):用來串連二進位檔案,一般在使用第三方SDK的時候使用。
  •  Linked Frameworks and Libraries(連結的架構和庫):選擇要連結的架構和庫,既可以是SDK內建的架構,也可以是第三方架構,在Build Phases中也有類似的功能選項。

2.2.1 target的info屬性設定

   target的info屬性設定介面如所示,主要分為五個部分,下面我們隊每一部分的設定的意思進行一個解讀。

  在這一部分,最重要的就是第一部分Custom iOS Target Properties自訂iOS目標屬性,其他的四個部分基本上都不怎麼用,大家不用管就好了。在target的info選項卡中的五項資訊與我們項目資來源目錄下的info.plist檔案中的內容是一致,並且修改其中一個另一個會自動修改。此外,我們在2.2.1中講到的general選項卡中的一些設定也會對應到info.plist檔案中,所以這些內容都是相通的,我們修改一處,其他的地方會同步次修改。info.plist中其實載入的資訊會非常多,上面是建立項目之後自動產生的一些最基本的設定選項,每一項對應的意思如下解釋:

  • Localization native development region : 與本地化設定有關,為預設的開發語言
  • Executable file:程式安裝包的名稱
  • Bundle identifier:軟體唯一的標識,是根據公司的標識與項目名稱自動產生的,在上傳和測試的時候會用到
  • InfoDictionary version:版本資訊
  • Bundle name:App安裝後顯示的名稱
  • Bundle OS Type code:用來標識軟體包類型
  • Bundle versions string, short:發布的版本字串
  • Bundle creator OS Type code:建立者的標識
  • Bundle version:應用程式版本號碼
  • Application requires iPhone environment:用於指示程式包是否只能運行在iPhone OS 系統上,預設為YES
  • Launch screen interface file base name:歡迎介面的檔案名稱
  • Main storyboard file base name:預設情況下程式的主入口
  • Supported interface orientations:設定程式預設支援的方向

  除此之外,我們在開發過程可能還需要添加一些其他的資訊,包括一些許可權的添加,網路許可權、定位許可權、讀寫連絡人許可權等等,應用白名單的添加等都是在這裡進行配置的。關於info.plist的具體資訊和內容詳情參見:Xcode中的Info.plist欄位列表詳解

  另外四部分的簡單解釋:

 

  • Document Types 文件類型:定義了應用程式所能識別的文件類型,並且還可以定義在系統中顯示的該類型文檔的自訂表徵圖。
  • Exported UTIs 匯出的UTI:UTI Uniform Type Identifiers同一類型標識符。
  • Imported UTIs 匯入的UTI:
  • URL Types URL類型:用來定義URL以便讓應用程式理解應用間交換的資料結構。可用於:IOS喚醒其他程式,程式間相互調用。例如::在URLTypes中URLSchemes中組冊AAPP;在B程式中,openUrl:[NSURL urlWithString:@"AAPP:"];注意":"冒號,沒有冒號是不能成喚醒另一個程式的。其次如果參數中有“&”特殊字元穿,建議對參數進行base64轉換。

 

2.2.3 target的capabilities屬性設定

  target的capabilities屬性設定這一塊主要是一些效能設定開關選擇,例如推播通知、雲端儲存、遊戲中心、後台模式等,我們選擇需要的開關進行開啟或者關閉,這些相應的狀態都會在info.plist中進行修改。所以,同樣的,我們也可以在info.plist添加一些許可權或效能開關之後,在target的capabilities中也會進行相應的修改的。具體的介面如所示:

 2.2.4 target中的Resource Tag屬性設定

  target中的Resource Tag選項卡主要是為項目中的資源進行添加tag分類,方便我們對齊載入順序和載入時機進行選擇和設定,即實現按需載入,在需要的時候才載入資源,屬性設定介面如所示。這樣做的好處就是可以實現如下幾種資源載入形式:

  • 初始資源的消極式載入:app有一些資源是主要功能要用到的,但在啟動時並不需要。將這些資源標記為“初始需要”。作業系統在app啟動時會自動下載這些資源。例如,圖片編輯app有許多不常用的濾鏡。
  • app資源的消極式載入:app有一些只在特定情景下使用的資源,當應用可能要進入這些情境時,會請求這些資源。例如,在一個有很多關卡的遊戲中,使用者只需要當前關卡和下一關卡的資源。
  • 不常用資源的遠程儲存:app有一些很少使用的資源,當需要這些資源時會去請求它們。例如,當app第一次開啟時會展示一個教程,而這個教程之後就可能不會在用到。app在第一次啟動時請求教程的資源,這之後只在需要展示教程或者添加了新功能才去請求該資源。
  • 在應用程式內購買資源的遠程儲存:app提供包含額外資源的在應用程式內購買。app會在啟動完成後請求已購買模組的資源。例如,使用者在一個鍵盤app內購買了SuperGeeky表情包。應用程式會在啟動完成後請求表情包的資源。
  • 第一次啟動時必需資源的載入:app有一些資源只在第一次啟動時需要,之後的啟動不再需要。例如,app有一個只在第一次啟動時展示的教程。

  關於Resource Tag和按需載入的詳情內容和步驟參見下面兩篇文章:

  • On-Demand Resources Guide中文版(按需載入資源--上)

  • On-Demand Resources Guide中文版(按需載入資源--下)

2.2.5 target的build setting屬性設定

target的build setting選項卡的是最主要的一部分編譯選項設定,配置介面如所示,介面只是截了一部分,完整的build settings共有20項配置內容。從配置介面上看,每一項的配置都有四列,我們可以看到,從左至右的順序分別是:Resolved列、帶Target表徵圖列、帶Project表徵圖列、iOS Default列,每一列所代表的意義如下。

 

  • Resolved列最終確定的編譯方式,無法自己設定,其結果是根據其右邊三欄的選擇結果以及優先順序順序來確定最後編譯時間採用的編譯方式。在圖的第二行選項卡中選擇combined選項,可以直接地看到只有該欄的最後結果。
  • 帶Target表徵圖列target的build setting配置的編譯選項,可自訂。其優先順序最高,一旦進行設定,則最後的編譯方式以該欄的結果為準。
  • 帶Project表徵圖列project的build setting配置的編譯選項,可自訂,這一欄的結果與project中build setting選項卡中的結果是一致的,修改其中一個地方,另一處也會自動修改。其優先順序介於target和default之間,當target沒有設定編譯選項,而該欄進行了設定時,則最後的編譯方式以該欄為準。
  • iOS Default列在建立項目時系統內建的預設編譯選項,無法修改。優先順序最低,只有當其他兩欄都沒有設定選項時,最後的編譯方式才會以該欄為準。
  • 優先順序順序:帶Target表徵圖列 >> 帶Project表徵圖列 >> iOS Default列

  target的build setting選項卡中的每一行具體所代表的編譯詳情參見:Xcode 編譯選項詳解

2.2.6 target的build phase屬性設定

  target的build phase選項卡的的主要功能是配置編譯器在不同編譯階段的參數,包括編譯所需的資源檔(包括代碼、配置以及各種資源檔),配置介面如所示,主要包括四方面的內容。

  • Target Dependencies Target對象依賴階段:某些Target可能依賴某個Target輸出的值,這裡設定依賴。依賴於其他target的輸出的時候,在編譯時間系統會自動先編譯被依賴的target,得到輸出值,再編譯當前target。對象依賴階段可以讓Xcode知道必須在當前選擇的對象編譯之編譯的其它依賴對象(比如應用擴充、外掛程式等等)。這個階段是無法被刪除的。
  • Compile Sources 源檔案編譯階段 是指將有哪些原始碼被編譯,可以通過紅框中的【+】【-】按鈕進行添加或刪除資源來控制編譯的代碼檔案。並且可以通過修改改階段的Compiler Flags(編譯器標識)來為每個單獨檔案設定其編譯器編織,比如最佳化設定等等。
  • Link Binary With Libraries 連結二進位庫階段:是指編譯過程中會引用哪些庫檔案,我們同樣可以通過【+】【-】按鈕進行添加或刪除編譯所引用的庫檔案。
  • Copy  Bundle Resources 複製資源檔階段:是指產生的product的.app內將包含哪些資源檔,同樣可以通過紅框中的【+】【-】按鈕進行添加或刪除資源來控制編譯的資源檔。該階段定義了對象中的資源檔,包括應用程式、表徵圖、介面構造器、視頻、模板等等。這些資源都會被複製到安裝包的Contents/Resources檔案夾下。
2.2.7 target的build rules屬性設定

  關於target的build rules這一塊平時沒有接觸過,也沒有進行相關的設定,網上查詢了半天的資料也沒有找到(囧),如果大家有相關的資料,麻煩評論裡留一下,我可以補充上來。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.