精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何使用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

2018-04-18 10:04:56

數字化 CIO

2021-11-22 09:00:00

后端開發CMS

2024-01-03 09:07:50

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

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

語言模型管理企業數據

2019-06-06 10:30:30

Windows管理中心Windows 10

2021-03-14 13:00:36

FedoraPoetry Python

2016-12-12 13:54:37

Xcode誕生macOS

2014-03-18 16:01:57

Arduino灌溉系統

2010-06-09 16:27:30

PHP+MySQL

2024-09-23 00:00:10

2011-07-06 17:48:30

iPhone Xcode 模擬器

2012-06-29 17:46:41

BMCIT服務管理SaaS

2020-07-28 15:20:43

PythonUI代碼
點贊
收藏

51CTO技術棧公眾號

中文字幕在线不卡一区二区三区| 日韩中文字幕高清在线观看| 一区二区三区高清在线| 91最新在线免费观看| 黑人巨大精品一区二区在线| 日韩欧美高清一区二区三区| 欧美日韩亚洲91| 日韩中文字幕一区| 国产精品一区二区黑人巨大| 影音先锋久久| 精品网站999www| 国产l精品国产亚洲区久久| 国产在线自天天| 久久精品国产网站| 久久久久国产精品免费网站| 一级黄色性视频| 日韩毛片免费视频一级特黄| 亚洲高清免费在线| 日本一区二区免费看| 国产欧美久久久精品免费| 中文一区一区三区高中清不卡免费| 任你弄精品视频免费观看| 91福利国产成人精品照片| 五月天色婷婷综合| 四虎精品成人影院观看地址| 蜜臀av一区二区三区| 欧美大片免费观看在线观看网站推荐| 黄色短视频在线观看| 亚洲承认视频| 亚洲一区在线看| 亚洲精品一区国产精品| 欧美 日韩 国产 成人 在线 91 | 黄色网络在线观看| 日本美女一级片| 精品影视av免费| 18性欧美xxxⅹ性满足| 日本午夜在线观看| 亚洲精品蜜桃乱晃| 欧美videossexotv100| 精品日韩久久久| 欧美在线极品| 亚洲日穴在线视频| 日韩av电影免费在线| 日韩中文字幕综合| 国产一区二区三区免费在线观看| 国产成人av在线| 奇米影视第四色777| 亚洲欧美亚洲| 超碰91人人草人人干| 免费福利视频网站| 亚洲成人一品| 亚洲理论在线a中文字幕| 成人啪啪18免费游戏链接| 日本午夜精品久久久久| 欧美性一级生活| 亚洲自偷自拍熟女另类| heyzo高清国产精品| 亚洲精品高清在线观看| 伊人情人网综合| 阿v免费在线观看| 99精品欧美一区二区三区小说| 91传媒视频在线观看| 91在线你懂的| 久久精品久久综合| 国产精品一区二区三区毛片淫片 | 成人av片网址| 国产精品探花视频| 久久精品国产一区二区三区免费看| 青草青草久热精品视频在线网站| 日本一级黄色大片| 久久一区二区三区喷水| 三级精品视频久久久久| 99久久久无码国产精品不卡| 大胆日韩av| 色婷婷综合久久久久| 熟女少妇a性色生活片毛片| 操欧美老女人| 久久久97精品| 欧美黑人一级片| 黑人一区二区| 91精品国产色综合| 天堂在线免费观看视频| 亚洲一区区二区| 欧美一级黑人aaaaaaa做受| 在线观看免费国产视频| 天堂午夜影视日韩欧美一区二区| 国产福利精品av综合导导航| 国产精品xxxxxx| 久久精品二区亚洲w码| 亚洲自拍另类欧美丝袜| 狠狠躁夜夜躁av无码中文幕| 91免费国产在线观看| 久久伦理网站| av网站在线免费播放| 综合分类小说区另类春色亚洲小说欧美| 自拍另类欧美| 国产乱码在线| 日韩欧美精品中文字幕| 午夜免费福利在线| 成人h动漫免费观看网站| 日韩av网站导航| 久久精品国产亚洲AV成人婷婷| 一区二区中文| 91国在线精品国内播放| 制服丝袜在线一区| 福利一区二区在线观看| 欧美在线一二三区| 麻豆免费在线视频| 香蕉加勒比综合久久| 玩弄japan白嫩少妇hd| 日韩区一区二| 国产一区二区三区视频| 免费看一级一片| 亚洲一级电影| 欧美夜福利tv在线| 99在线精品视频免费观看软件| av电影在线观看一区| 日韩亚洲一区在线播放| 丁香高清在线观看完整电影视频| 欧美羞羞免费网站| 久久久久国产免费| 日本一区二区三区视频| 午夜精品国产精品大乳美女| 亚洲天堂中文字幕在线| www.亚洲国产| 在线精品高清中文字幕| 欧美一级片在线视频| 99在线观看免费视频精品观看| 国产日韩一区在线| 99热在线只有精品| 亚洲国产精品黑人久久久| 欧美大黑帍在线播放| 日韩午夜电影免费看| 亚洲跨种族黑人xxx| 精品无码黑人又粗又大又长| 看电视剧不卡顿的网站| 欧美激情论坛| 欧美黄色视屏| 欧美一区二区黄色| 网爆门在线观看| 国产精品一区毛片| 国产麻豆一区二区三区在线观看| 在线视频三区| 在线视频欧美精品| 给我看免费高清在线观看| 国产精品扒开腿做爽爽爽软件| 国产日韩在线亚洲字幕中文| 日韩精品123| 午夜天堂影视香蕉久久| 人妻av一区二区三区| 68国产成人综合久久精品| 国产精品国产三级国产aⅴ浪潮 | 欧美视频一区在线| 亚洲精品成人无码熟妇在线| 99成人在线| 国产精品夜夜夜一区二区三区尤| caopo在线| 欧美色大人视频| 老头老太做爰xxx视频| 国产精品久久久久久久久久妞妞| 国产精品入口免费| 变态调教一区二区三区| 亚洲福利视频网站| 日韩免费黄色片| 不卡区在线中文字幕| 一二三四视频社区在线| 日本在线视频一区二区三区| 欧美精品亚州精品| 亚洲最大成人av| 最新中文字幕一区二区三区| 日本精品一区在线| 小说区亚洲自拍另类图片专区| 成人免费高清完整版在线观看| 日本在线观看| 日韩欧美一区在线| 亚洲成人日韩在线| 日本欧美一区二区在线观看| 亚洲不卡1区| 日韩在线短视频| 中文国产成人精品| 国产欧美综合视频| 亚洲国产精品久久人人爱 | 91视频综合网| 成人白浆超碰人人人人| aa在线免费观看| 狠狠做深爱婷婷综合一区| 欧美一区二三区| 蜜桃成人在线视频| 欧美三级日本三级少妇99| 午夜激情视频在线播放| 国产精品亚洲一区二区三区在线| 国产91在线亚洲| 免费久久精品| 国产成人aa精品一区在线播放| 午夜不卡视频| 日韩精品一区二区三区在线播放| www.av麻豆| 中文无字幕一区二区三区| 亚洲综合在线一区二区| 国产日韩欧美一区二区三区在线观看| 欧美在线激情| 日韩免费大片| 57pao成人国产永久免费| 最新国产在线观看| 精品国产乱码久久久久久浪潮| 欧美在线观看不卡| 综合色中文字幕| 91精品人妻一区二区| 韩国v欧美v亚洲v日本v| a级黄色片网站| 西野翔中文久久精品国产| 国产精品视频地址| av在线小说| 精品国产一区二区三区久久| www.好吊色| 在线区一区二视频| 国产黄色片视频| 国产日韩精品一区二区三区| 在线观看免费视频污| 欧美一级一区| 在线视频福利一区| 在线一级成人| 国产精品免费在线| vam成人资源在线观看| 欧美日韩国产91| eeuss影院在线播放| 日韩电影免费观看在线观看| 国产又粗又猛又黄又爽| 欧美日韩一区二区免费在线观看| 小向美奈子av| 国产亚洲一二三区| gogo亚洲国模私拍人体| 日韩精品亚洲专区| 免费毛片网站在线观看| 中文字幕免费一区二区| 亚洲伊人婷婷| 欧美久久精品一级c片| 精品视频免费观看| 欧洲大片精品免费永久看nba| 欧美中文字幕第一页| 黄页网站在线| 色爱av美腿丝袜综合粉嫩av| 天堂资源中文在线| 亚洲国产精品电影| 国产高潮在线观看| 欧美一区午夜视频在线观看| 最近中文字幕免费观看| 欧美在线综合视频| 国产寡妇亲子伦一区二区三区四区| 一区二区三区产品免费精品久久75| 91麻豆精品久久毛片一级| 久久久噜噜噜久噜久久综合| 又黄又爽的网站| 成人午夜私人影院| 香蕉视频1024| 成人视屏免费看| 蜜臀av粉嫩av懂色av| 韩国v欧美v日本v亚洲v| 黄色片视频在线| 蜜桃久久精品一区二区| 97超碰成人在线| 麻豆精品在线视频| 中文字幕亚洲欧洲| 久久99精品网久久| 亚洲第一天堂久久| 国产精品88av| 制服丝袜av在线| 大尺度一区二区| 91视频啊啊啊| 久久久久久久久岛国免费| 成人性生活免费看| 99精品在线免费| 亚洲狠狠婷婷综合久久久久图片| 久久亚洲精华国产精华液| 精品人妻无码一区二区三区 | 在线播放黄色av| 国产乱对白刺激视频不卡| 国产成人精品一区二区三区在线观看 | 欧美1o一11sex性hdhd| 精品精品久久| 伊人情人网综合| 国内精品嫩模av私拍在线观看| 男人天堂手机在线视频| 日韩一区亚洲二区| 日韩.欧美.亚洲| 久久精品播放| 懂色av一区二区三区四区五区| 欧美全黄视频| 午夜精品久久久久久久无码| 日韩av中文字幕一区二区| 亚洲午夜精品一区| av午夜精品一区二区三区| 国产又黄又粗视频| 亚洲综合偷拍欧美一区色| 精品一区二区三区四| 欧美日韩精品二区| 在线观看日韩一区二区| 91精品国产免费久久综合| 男人天堂综合网| 亚洲女人天堂av| 黄色网在线免费看| 国语自产精品视频在免费| 日韩电影免费观看高清完整版| 国产suv精品一区二区| 国产精品久一| 久久久久久国产精品mv| 亚洲91视频| 日本韩国欧美在线观看| 精品一区二区久久| 亚洲成av人片在线观看无| 久久日韩粉嫩一区二区三区| 波多野结衣在线网址| 色婷婷av一区二区三区大白胸| 99久久精品国产一区二区成人| 亚洲白虎美女被爆操| 在线观看麻豆蜜桃| 91精品国产高清自在线看超| 亚洲精品555| 91亚洲精华国产精华| 美女亚洲一区| 老子影院午夜伦不卡大全| 狠狠久久亚洲欧美| 尤物视频最新网址| 亚洲国产精品麻豆| 国产免费不卡视频| 中文字幕欧美亚洲| www.综合| av一区二区三区四区电影| 色呦哟—国产精品| 国内外免费激情视频| aaa亚洲精品一二三区| 久草免费新视频| 制服丝袜亚洲色图| 成人免费黄色网页| 欧美激情一级精品国产| 韩国三级成人在线| 一区二区三区四区五区视频| 久久精品人人| 久久中文字幕人妻| 亚洲午夜一区二区三区| 国产影视一区二区| 亚洲男人天堂视频| 在线最新版中文在线| 欧美激情在线观看视频| 96sao精品免费视频观看| 日韩精品伦理第一区| 亚洲一区二区动漫| 国产一级二级在线观看| 精品成人久久av| 免费看av毛片| 18久久久久久| 竹菊久久久久久久| 国产视频一区二区三区在线播放 | 中文高清一区| 女同性恋一区二区三区| 性做久久久久久免费观看| 天堂中文在线资源| 91产国在线观看动作片喷水| 成功精品影院| 久久人妻无码一区二区| 国产伦精品一区二区三区视频青涩| 久久嫩草捆绑紧缚| 欧美老女人第四色| 黄色网在线播放| 91手机在线观看| 亚洲视频精品| 国产激情视频网站| 欧美自拍偷拍一区| 久草免费在线| 99国产在线视频| 国产农村妇女精品一二区| 少妇真人直播免费视频| 欧美视频日韩视频在线观看| 日韩在线观看www| 国产精品v欧美精品v日韩| 一区二区三区导航| 亚洲码无人客一区二区三区| 在线观看成人小视频| 婷婷视频在线| 国产精品一区二区三区不卡| 国产麻豆综合| 国产一二三四区| 亚洲福利视频网| 91天天综合| 日韩精品视频在线观看视频| 91美女视频网站| 91片黄在线观看喷潮| 久久久久一本一区二区青青蜜月| 亚洲精品推荐| 国产又黄又猛的视频| 亚洲成人免费看| 成人福利在线| 国产精品一区二区三区在线| 日韩精品亚洲一区二区三区免费| 久草中文在线视频| 国产亚洲成av人片在线观看桃| 久久丁香四色| www黄色在线| 亚洲综合丝袜美腿| av在线免费观看网站|