精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

波多野结衣午夜| 性活交片大全免费看| av在线之家电影网站| 久久国产麻豆精品| 欧美激情一区二区三区成人 | a成人v在线| 亚洲激情av在线| 欧美在线激情| 性一交一乱一色一视频麻豆| 久久中文欧美| 欧美国产第二页| 卡一卡二卡三在线观看| 2020国产精品极品色在线观看| 一本大道av伊人久久综合| 国产日韩欧美大片| 黄色影院在线播放| 成人久久久精品乱码一区二区三区| 国产成人福利网站| 国产无码精品视频| 亚洲女同另类| 丝袜亚洲欧美日韩综合| 精品人妻少妇嫩草av无码| 日韩在线观看中文字幕| 欧美性生活影院| 极品美女扒开粉嫩小泬| 午夜小视频在线观看| 国产精品久久久久aaaa樱花| 久久久亚洲综合网站| 成人福利小视频| 精品一区二区在线免费观看| 国产成人涩涩涩视频在线观看| 五月婷婷激情网| 欧美另类综合| 久久影视免费观看| 殴美一级黄色片| 国产欧美一区二区精品久久久| 精品福利二区三区| 超级砰砰砰97免费观看最新一期 | 免费黄色在线视频| 精品按摩偷拍| 精品久久久久香蕉网| 久久久精品视频国产| 日韩成人精品一区二区三区| 欧美无乱码久久久免费午夜一区| 成熟老妇女视频| 中文字幕在线高清| 大伊人狠狠躁夜夜躁av一区| 国产人妻777人伦精品hd| 欧美巨大xxxx做受沙滩| 悠悠色在线精品| 成人av在线不卡| 人妖欧美1区| 亚洲综合一二三区| 亚洲理论电影在线观看| 久草免费在线色站| 午夜免费久久看| 久久精品视频16| 两个人看的在线视频www| 亚洲成人av电影| 国产九九九九九| 成人片免费看| 91九色02白丝porn| 精品久久久久久中文字幕2017| 欧美电影h版| 欧美午夜片在线观看| 青青青在线视频免费观看| 国产成人精品一区二区三区视频| 欧洲中文字幕精品| 九九热精品在线播放| 成人在线啊v| 日韩欧美高清dvd碟片| 一本色道久久hezyo无码| 日韩av网站在线免费观看| 精品无码久久久久久国产| 免费看裸体网站| 亚洲最大av| 91av中文字幕| 亚洲天堂999| 国产精品综合在线视频| 国产精品sss| 国产在线观看免费| 亚洲欧美日韩在线| 国产h视频在线播放| av在线一区不卡| 欧美一级二级在线观看| 97人妻精品一区二区三区免| 日韩av在线播放网址| 欧美精品生活片| www.中文字幕在线观看| 六月丁香综合在线视频| 国产精品免费一区二区三区| 青青草观看免费视频在线| 国产精品久久久久久一区二区三区 | 艹b视频在线观看| 日韩精品视频中文字幕| 日韩精品在线观看网站| 天天色影综合网| 亚洲色诱最新| 92看片淫黄大片看国产片| 亚洲av成人无码久久精品老人| 国产精品色一区二区三区| 91黄色在线看| 久久99国产精品二区高清软件| 精品毛片乱码1区2区3区| 国产又粗又黄又猛| 日韩视频一区| 成人精品视频在线| 欧美孕妇孕交| 亚洲国产精品久久不卡毛片| 高清av免费看| 九九视频免费观看视频精品| 欧美第一页在线| 中文字幕在线观看欧美| 91丨porny丨户外露出| 国产日本欧美在线| 人人鲁人人莫人人爱精品| 亚洲精品一区二区在线观看| 性生交大片免费全黄| 欧美专区一区二区三区| 国产乱码精品一区二区三区卡| 国产日产一区二区| 91高清视频免费看| 国产高清自拍视频| 激情综合自拍| 91精品网站| 日本在线视频网| 欧洲精品中文字幕| 三上悠亚影音先锋| 亚洲免费影视| 精品国产第一页| 精品精品导航| 日韩精品一区二区三区swag| 国产精品99久久久久久成人| 秋霞成人午夜伦在线观看| 蜜桃久久精品乱码一区二区 | 久久av少妇| 欧美日韩一区二区三区| 制服丝袜第二页| 国产精品久久久久久模特 | 午夜精品国产更新| 日本wwwwwww| 国内精品久久久久久久影视蜜臀| 亚洲综合在线中文字幕| 国产乱色在线观看| 777xxx欧美| 亚洲最大的黄色网址| 国产综合色精品一区二区三区| 中文字幕中文字幕在线中心一区 | 在线观看操人| 日韩午夜在线观看| 国产在线视频你懂的| 国产成人精品综合在线观看| av在线免费观看国产| 成人三级av在线| 91成人福利在线| 青青色在线视频| 色激情天天射综合网| 成人国产精品久久久网站| 日本特黄久久久高潮 | 欧美日韩综合| 国产精品毛片一区视频| 在线观看涩涩| 神马久久桃色视频| av手机免费看| 香蕉加勒比综合久久 | 亚洲色欲色欲www在线观看| 国产女同无遮挡互慰高潮91| 欧美 亚欧 日韩视频在线| 国产精品亚洲一区| 625成人欧美午夜电影| 中文字幕日韩在线观看| 国产欧美一区二区三区视频在线观看| 一区二区三区四区激情| 亚洲av成人片色在线观看高潮| 午夜亚洲性色福利视频| 日韩精品久久久| www久久久| 7777精品久久久久久| 国产午夜视频在线观看| 91精品国产综合久久福利| 国产无精乱码一区二区三区| 欧美极品另类videosde| 久久久精品视频国产| 99视频+国产日韩欧美| 色女孩综合网| 凹凸av导航大全精品| 国产精品海角社区在线观看| aaa大片在线观看| 亚洲人成电影在线| a网站在线观看| 色婷婷亚洲综合| 欧美日韩一级大片| 久久精品这里都是精品| av影片在线播放| 日韩高清在线电影| 男人添女人下部视频免费| 国精一区二区| 国产在线资源一区| 亚洲人成777| 2024亚洲男人天堂| www.在线视频| 一区二区三区在线播放欧美| 亚洲xxxx天美| 欧美日韩视频在线一区二区| 国产一级生活片| 亚洲婷婷在线视频| 人妻少妇一区二区| 懂色av一区二区三区免费看| 激情 小说 亚洲 图片: 伦| 在线日韩中文| 欧美做受777cos| 日韩理论电影院| 欧美日韩国产不卡在线看| 亚洲日本va| 国产美女直播视频一区| 亚洲天堂av在线| 久久久久成人网| 在线看女人毛片| 波霸ol色综合久久| 国产香蕉在线| 亚洲女人被黑人巨大进入al| 天天操天天插天天射| 欧美大片在线观看一区| 国产色在线视频| 欧美日韩国产片| 中文字幕av影视| 日韩欧美在线免费观看| 日本中文字幕免费| 亚洲午夜电影在线| 一区二区三区免费高清视频| 亚洲人成在线播放网站岛国| 男女男精品视频网站| 国产亚洲自拍一区| 欧美成人午夜精品免费| www久久久久| 欲求不满的岳中文字幕| hitomi一区二区三区精品| 国产一卡二卡三卡四卡| 成人午夜电影网站| 亚洲欧美日韩偷拍| 不卡区在线中文字幕| 亚洲中文字幕一区| av在线播放成人| 人妻av一区二区| 91老师片黄在线观看| 国产中文字幕一区二区| 97精品久久久久中文字幕| 中文乱码人妻一区二区三区视频| av亚洲产国偷v产偷v自拍| 成人免费av片| 久久免费偷拍视频| 99在线视频免费| 亚洲欧美视频在线观看视频| 美女的奶胸大爽爽大片| 亚洲一区二区五区| 色婷婷av国产精品| 色婷婷国产精品综合在线观看| 亚洲无码精品一区二区三区| 欧美性猛片xxxx免费看久爱| 在线免费观看中文字幕| 欧美一区二区免费观在线| 男人天堂一区二区| 亚洲欧美一区二区精品久久久| 国产乱视频在线观看| 久久精品成人欧美大片古装| 国产高清一区二区三区视频| 欧美激情精品久久久久久久变态| а√在线中文在线新版| 日本91av在线播放| 涩涩涩久久久成人精品| 成人一区二区在线| 亚洲资源网站| 在线视频福利一区| 亚洲区一区二| 天天色综合社区| 高清在线不卡av| 巨胸大乳www视频免费观看| 国产精品久久夜| 国产一级特黄aaa大片| 日本乱人伦一区| 国产美女免费看| 精品亚洲一区二区三区| 欧美人xxx| 8x海外华人永久免费日韩内陆视频| 欧美色999| 97视频中文字幕| 加勒比久久综合| 免费cad大片在线观看| 另类av一区二区| 日韩精品视频网址| 久久综合色一综合色88| 婷婷激情四射网| 色av成人天堂桃色av| 性生活黄色大片| 亚洲性xxxx| 毛片在线网址| 成人黄色网免费| 亚洲自拍电影| 国产一线二线三线女| 免费精品99久久国产综合精品| 91超薄肉色丝袜交足高跟凉鞋| 国产蜜臀av在线一区二区三区| 免费中文字幕在线观看| 欧美午夜精品免费| 午夜av免费观看| 久久av在线播放| 久久麻豆视频| 日韩精品av一区二区三区| 亚洲人成久久| 亚洲熟女乱综合一区二区| 国产日韩综合av| 精品91久久久| 精品精品欲导航| av毛片在线| 成人亚洲激情网| 四虎成人av| 美女网站免费观看视频| 2021国产精品久久精品| 国产成人精品av久久| 欧美一卡2卡3卡4卡| av网站无病毒在线| 日韩av免费在线观看| 欧美精品国产白浆久久久久| 成年人视频网站免费| 国产很黄免费观看久久| 91日韩中文字幕| 欧美另类高清zo欧美| jizz在线免费观看| 国产精品99久久久久久久久| 亚洲精品无吗| 久在线观看视频| aaa国产一区| www.av麻豆| 亚洲激情 国产| 爱啪啪综合导航| 国内一区在线| 午夜在线一区| 三上悠亚ssⅰn939无码播放 | 久久久久久12| 国产区精品视频在线观看豆花| 日本人妻伦在线中文字幕| 国产东北露脸精品视频| 久草网视频在线观看| 精品国产三级a在线观看| 久草在线新免费首页资源站| 国产专区一区二区| 99热这里只有精品8| 欧美大片免费播放器| 色婷婷精品大在线视频| 川上优的av在线一区二区| 国产精品视频地址| 久久美女视频| 最好看的中文字幕| 亚洲国产视频在线| 欧洲亚洲在线| 国产精品露脸自拍| 久久久久亚洲| 天天躁日日躁狠狠躁免费麻豆| 欧美日韩裸体免费视频| 美女欧美视频在线观看免费| 国产va免费精品高清在线观看| 成人情趣视频网站| 肉色超薄丝袜脚交| 夜夜亚洲天天久久| 日本ー区在线视频| 国产精品一区二区在线| 亚洲人体av| 给我免费观看片在线电影的| 色天天综合色天天久久| 亚洲免费视频一区二区三区| 99一区二区| 久久精品人人做人人爽电影蜜月| www亚洲色图| 日韩欧美三级在线| 不卡福利视频| 天天做天天爱天天高潮| eeuss国产一区二区三区| 波多野结衣一二区| 欧美精品在线网站| 婷婷激情久久| 欧美日韩精品区别| 欧美日韩亚洲高清| sm国产在线调教视频| 美日韩免费视频| 国产美女视频一区| 黄色片中文字幕| 欧美精品一区二区免费| 久久av综合| 中文字幕一二三区| 在线视频综合导航| 另类视频在线| 在线视频一区观看| 久久综合国产精品| 性猛交富婆╳xxx乱大交天津| 国产成人精品一区二区三区| 欧美日韩亚洲一区二区三区在线| 97人妻人人揉人人躁人人| 精品国产一区二区三区久久影院| 福利一区在线| 男人操女人逼免费视频|