成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Xcode的Targets來管理開發和生產版本的構建

移動開發
這篇文章由Eugene Trapeznikov貢獻。想象一下,你已經完成了應用程序的開發和測試,現在準備提交正式版本。問題是,一些web服務的url指向了測試服務器,同時API密鑰被配置用于測試環境。在提交app給蘋果審核前,你需要修改所有這些API密鑰和URL以適應生產版本。這聽起來還好,對吧?但是相較于在開發環境和生產環境之間來回修改相關數值,有沒有更好的方法來處理開發和生產版本的構建?這正是接下來Eugene要和你討論的。

[[164788]]

這篇文章由Eugene Trapeznikov貢獻。想象一下,你已經完成了應用程序的開發和測試,現在準備提交正式版本。問題是,一些web服務的url指向了測試服務器,同時API密鑰被配置用于測試環境。在提交app給蘋果審核前,你需要修改所有這些API密鑰和URL以適應生產版本。這聽起來還好,對吧?但是相較于在開發環境和生產環境之間來回修改相關數值,有沒有更好的方法來處理開發和生產版本的構建?這正是接下來Eugene要和你討論的。

進入Eugene的教程

對于初學者來說,有些人可能會奇怪,在App開發過程中,為什么需要使用兩個單獨的數據庫和環境。原因是當你繼續構建新的功能特性或繼續開發你的應用,你希望區分開現有的公開版本和生產版本。

標準的軟件開發實踐是在不同的開發環境下開發不同版本的軟件,像我們案例中講到的開發iphone應用。應用程序的開發版本通常使用一個不同于生產環境的數據庫(或如分析的其他系統)。這就是為什么我們應該為不同的環境中使用單獨的服務器和數據庫。開發人員在測試期間通常都使用虛擬圖像或虛擬數據。在測試環境中,使用諸如 “test comment”, “argharghargh” 和 “one more test comment”之類的測試數據并不少見。顯然,你不希望你的真實用戶看到這樣的消息。如果你的應用程序使用了一個分析系統的情況下,你甚至會在測試階段發送成千上萬的事件。同樣的,你不會把測試數據和生產數據放在同一個數據庫中。這就是為什么總是推薦區分開發和生產環境。

在使用兩個獨立的環境時,你的應用程序需要有一個辦法找出它應該連接到的環境。一種常用的方法是在你的主應用代理里定義一個全局變量,它會將您的應用程序初始化為開發或生產模式。

  1. enum environmentType { 
  2.     case development, production 
  3.    
  4. let environment:environmentType = .production 
  5.    
  6. switch environment { 
  7. case .development: 
  8.     // set web service URL to development 
  9.     // set API keys to development 
  10.     print("It's for development"
  11. case .production: 
  12.     // set web service URL to production 
  13.     // set API keys to production 
  14.     print("It's for production"

這種方法需要你每次切換環境時改變全局變量。雖然這種方法也許快捷,方便,但是它有一些重要的限制。首先,因為我們在開發和生產兩個環境中使用一個Bundle ID,你不能在一臺設備上安裝應用的兩個版本。當你需要要測試開發版本的應用程序時,同時仍在該設備上使用生產版本的應用,這就變的不方便了。此外,這種方法很有可能將應用的開發版本上傳到應用商店。如果你忘記了改變這個全局變量,你將會上傳錯誤的應用給你的用戶。我記得有一次在提交應用程序到應用商店之前我忘記改變全局變量,用戶下載的是應用的開發版本,這是可怕的。

在這篇文章中,我將展示一個更好的方法來區分開發和生產構建。具體而言,我們將在Xcode中創建一個開發的target。這種方法法適用于新的和現有的大型項目,所以你可以用一個現有的應用程序對照本教程。

通過應用這種方法,應用的開發和生產版本將使用相同的基礎代碼,但可以有不同的圖標,bundle ID 和指向不同的數據庫。發布和提交過程將會非常簡單。最重要的是,你的測試人員和經理可以在同一設備上安裝兩個版本的應用程序,所以他們完全知道他們在體驗哪個版本。

如何創建一個新的Target

所以你如何在Xcode中創建一個開發的target?我使用示例項目“todo”引導您一步一步完成整個過程。。您也可以使用自己的項目并按照步驟:

1. 在項目的導航面板進入項目設置。在Targets區域下,右鍵單擊現有目標并選擇 `Duplicate` 復制現有的目標。

2.Xcode會詢問你新的target是否是為iPad開發。對于本教程,我們只是選擇“Duplicate Only”。

提示:如果您的項目支持通用設備,Xcode不會提示上述消息。

3.現在我們有一個名為`todo copy`的新的target和build scheme。重命名并使之更容易理解。

  • 在Targets列表中選擇新的target。按Enter鍵編輯文本,添加一個更合適的名字。我更傾向于“todo Dev”。你可以自由選擇任何你喜歡的名字。

  • 接下來,找到“Manage Schemes…”,選擇您在步驟1中創建的shceme,并按“輸入”,使scheme的名稱和新的target的名稱相同(這是你為新的target所選擇的名字)

4. 步驟4是可選的,但強烈推薦。如果你想簡單地區分開發和生產版本構建,你應該為每個版本使用單獨的icon和啟動頁。這將使測試人員更清晰地知道正在使用哪個app,防止上傳開發版本。

跳到 `Assets.xcassets` 添加一個新的圖標。右擊圖標 > App Icons & Launch Images > New iOS App Icon. 新圖標重命名為“AppIcon-Dev”同時添加自己的圖片。

5.現在回到項目設置,選擇您的開發target,并改變Bundle Identifier。你可以簡單地將“Dev”追加到原來的ID上。如果執行了步驟4,請確保更改應用app icon,設置為在上一步中創建的。

 

6. Xcode會自動為你的target添加plist文件(如todo copy-Info.plist)。你可以在項目的根文件夾找到它。將它從“copy”重命名為“Dev”,并將它放在原始的plist文件下。這里你將更容易管理文件。

7. 現在打開你開發target的“Build Settings”,滾動到“Packaging”,并將值改為開發的plist文件(todo Dev.plist)。

8. ***,我們會為生產和開發target配置預處理宏/編譯器標識。之后我們就可以使用該標識在我們的代碼來檢測應用程序正在運行的版本。

對于Objective-C的項目,去到`Build Settings`下`Apple LLVM 7.0 - Preprocessing`。拓展`Preprocessor Macros`在Rebug和Release區域添加一個變量。對于開發target(即todo Dev),將該值設置為`DEVELOPMENT = 1`。另一個,將值設為`DEVELOPMENT=0`來表示生產版本。

對于swift的項目,編譯器不再支持預處理指令。作為替代,它使用編譯時的屬性和build配置。選中開發target,添加一個標識表示開發版本。找到`Build Setting`往下滾動到`Swift Compiler - Custom Flags`部分。將值設為`-DDEVELOPMENT`表示這個target作為開發版本。

現在,您已經創建并配置了開發target,下一步呢?

使用Target和宏

根據已配置的宏DEV_VERSION,我們可以在代碼中利用它動態地編譯項目。下面是一個簡單的例子:

Objective-C:

  1. #if DEVELOPMENT 
  2. #define SERVER_URL @"http://dev.server.com/api/" 
  3. #define API_TOKEN @"DI2023409jf90ew" 
  4. #else 
  5. #define SERVER_URL @"http://prod.server.com/api/" 
  6. #define API_TOKEN @"71a629j0f090232" 
  7. #endif 

Objective-C中你可以使用`#if`檢查`DEVELOPMENT`的環境,并相應的設置URLs/ API密鑰。

Swift:

  1. #if DEVELOPMENT 
  2. let SERVER_URL = "http://dev.server.com/api/" 
  3. let API_TOKEN = "DI2023409jf90ew" 
  4. #else 
  5. let SERVER_URL = "http://prod.server.com/api/" 
  6. let API_TOKEN = "71a629j0f090232" 
  7. #endif 

Swift中你仍然可以使用`#if`判定build的參數動態編譯。然而,除了使用`#define`定義基本常量,在swift中我們也可以用`let`定義一個全局常量。

提示:通常,你會把上面的代碼放在app delegate中。但這最終是取決于你在哪里初始化應用程序設置。

現在,當您選擇“todo Dev”scheme運行項目,你創建開發版本會自動將服務器的配置設置為開發環境。現在,您可以上傳開發版本到TestFlight 或 HockeyApp供測試人員和管理人員來測試。

接著如果你需要創建一個生產版本,您可以簡單地選擇"todo"scheme。不需要更改代碼。

管理多個target的一些注意事項

1.當你添加新的文件到項目中,不要忘記選擇兩個target,以保持你的代碼同步在兩個版本。

2.如果你使用的CocoaPods,不要忘了添加新的target到你的podfile中。您可以使用`link_with`指定多個target。您可以進一步細節請查閱的 CocoaPods 文檔。你的podfile看起來是這樣的:

  1. source 'https://github.com/CocoaPods/Specs.git' 
  2. platform :ios, '7.0' 
  3. workspace 'todo' 
  4. link_with 'todo''todo Dev' 
  5. pod 'Mixpanel' 
  6. pod 'AFNetworking' 

3.如果你使用持續集成系統,如 Travis CI 或Jenkins,別忘了配置兩個target的build和deliver。

你對這個教程有什么想法?如何管理你的開發和生產構建?給我留言評論分享您的想法。

責任編輯:倪明 來源: cocoachina
相關推薦

2011-07-20 10:59:46

2021-11-22 09:00:00

后端開發CMS

2024-01-03 09:07:50

文件存儲分塊文件存儲分片Net開發

2018-04-18 10:04:56

數字化 CIO

2020-02-17 16:28:49

開發技能代碼

2011-07-26 18:00:43

2021-01-05 20:24:04

Git開源軟件開發

2014-08-25 12:14:02

Docker協助開發

2011-08-08 17:05:02

XCode UserScript 腳本

2022-07-08 14:50:12

時間管理技巧工作效率

2023-04-27 19:02:30

語言模型管理企業數據

2021-03-14 13:00:36

FedoraPoetry Python

2019-06-06 10:30:30

Windows管理中心Windows 10

2016-12-12 13:54:37

Xcode誕生macOS

2010-06-09 16:27:30

PHP+MySQL

2014-03-18 16:01:57

Arduino灌溉系統

2024-09-23 00:00:10

2011-07-06 17:48:30

iPhone Xcode 模擬器

2012-06-29 17:46:41

BMCIT服務管理SaaS

2011-07-07 09:20:30

Xcode
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国久久| 国精品一区二区 | 国产精品久久一区 | 国产精品久久久久久亚洲调教 | 国产激情视频网站 | 久久国产视频网站 | 色又黄又爽网站www久久 | 国产精品亚洲一区二区三区在线 | 一本色道精品久久一区二区三区 | 久久国产精品一区二区三区 | 久久不卡区 | .国产精品成人自产拍在线观看6 | 2021狠狠天天天| 免费1区2区3区 | 麻豆久久精品 | 国产精品久久久久久久三级 | 在线观看视频中文字幕 | 黄色片免费在线观看 | 国产精品久久久久久久久久久免费看 | 欧美福利久久 | 国产精品国产三级国产aⅴ中文 | 日韩精品成人一区二区三区视频 | 久久久久久国产精品久久 | 中文精品视频 | 久久久久国产 | 亚洲 欧美 激情 另类 校园 | 九九综合九九 | 久久精品99国产精品 | 国产9 9在线 | 中文 | 国产精品美女久久久久久免费 | 日韩中文字幕在线播放 | 日日操夜夜操天天操 | 欧洲精品在线观看 | 日韩欧美在线播放 | 日韩在线播放网址 | 日韩爱爱网 | 人人叉 | 欧美亚洲视频 | av网站免费在线观看 | 精品久久久久久亚洲精品 | 国产一级免费在线观看 |