2010-12-21 35 views
12

我有一個現有的應用程序,需要編譯爲不同的客戶端爲不同的客戶定製iPhone應用程序

每個客戶端需要自己的圖標和閃屏。
我還希望能夠有條件地包含各種功能,具體取決於特定客戶是否需要它們。

我已經嘗試爲每個客戶設置不同的目標,但迄今沒有多少運氣。
具有相同名稱但不同路徑的不同資源不斷混合在一起。

理想情況下,我希望能夠通過複製另一個類似的客戶端來構建應用程序,然後只需創建最小數量的更改以爲新客戶端創建應用程序。

設置此應用程序的最佳方法是什麼?

+0

感謝您爲此付出了代價。這裏同樣的問題。 FWIW,看到我的問題在一個類似的主題:http://stackoverflow.com/questions/4112483/how-does-xcode-handle-import-header-statements-in-with-multiple-targets – makdad 2010-12-27 06:33:31

回答

9

每個客戶的單獨目標應該是要走的路。對於這些功能,我建議首先在目標設置中設置一個標識客戶端的宏(在生成選項卡上的「預處理器宏」下),然後創建一個FeatureDefines。.h文件看起來像這樣:

#ifdef macroClientA // assume client A wants features 1 and 3 
# define macroFeature1 
# define macroFeature3 
#endif 

// and similarly for the other clients 

現在你可以使用

#import featureDefines 
#ifdef macroFeature1 

你需要的,如果有1所希望或不測試任何地方。

對於單獨的圖標,您的目標設置可以爲每個客戶指定一個不同的info.plist文件,而這些文件又可以爲該圖標指定不同的文件名。

對於單獨的啓動畫面,iOS始終要求將啓動畫面命名爲Default.png,但它們可以位於項目目錄的不同子目錄中。您可以右鍵點擊Xcode所說的「Groups & Files」,選擇Target Membership,然後勾選您想使用的複選框並確保其他選項未被選中,從而控制哪個目標用於哪個目標。

對於資源,我建議命名資源文件是這樣的:使用

resourceName.ext //常規資源,如果沒有專門的客戶一個
資源名稱,clientName.ext //客戶端 - 特定資源

下一頁設置,看起來像這樣的一般資源查找方法:

-(NSString *) resourcePathForResourceName: (NSString *) resourceName extension: (NSString *) ext { 
    NSString *clientName; 
    #ifdef macroClientA 
    clientName = @"clientA"; 
    #endif // and similarly for the other clients 
    NSString *clientSpecificName = [NSString stringWithFormat: @"%@-%@.%@", resourceName, clientName, ext]; 
    NSString *genericName = [NSString stringWithFormat: @"%@.%@"]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath: clientSpecificName]) 
    return clientSpecificName; 
    else if ([[NSFileManager defaultManager] fileExistsAtPath: genericName]) 
    return genericName; 
    else 
    // handle the error 
} 

運行的所有資源文件抓住通過方法可以讓你在不改變一行代碼的情況下將特定於客戶端的資源添加到您的項目中。

+0

謝謝,我接受這個答案,因爲它或多或少是我在想/解決問題的方式。 – 2010-12-30 10:14:14

3

您可以爲每個客戶端創建一個單獨的目標,並將每個客戶端資產置於其具有相同名稱的文件夾中。我做了類似的事情,我有兩個項目有很多共同之處,只是從每個項目中添加/刪除了適當的資產。

在您的場景中,在這一點上,您可以爲每個目標添加一個具有客戶端特定資源的新文件夾,並且不需要任何代碼更改。如果路徑有問題,可以考慮使用不需要完整路徑的方法,即文件名。

0

編寫代碼以允許外部配置文件執行大部分設置,然後在目標中包含正確的資源。有一個項目爲每個客戶提供一個新目標,您可以選擇每個目標包含哪些資產。如果您在多個目標中遇到問題,可以使用git來管理核心項目,然後爲每個客戶端分支它。

6

我有一個類似的方案,以及它如何我處理如下:

1)應用的核心代碼被保持在一個「APPLICATION_NAME基」的文件夾

2)不同的客戶端是在他們的「application_name-client_name」文件夾

3)項目文件位於客戶端文件夾中,並且包含來自基礎文件夾的引用而不使用副本。

4)需要對客戶端項目唯一的文件位於客戶端文件夾中。通常使用相同名稱的圖像。或.h .m文件,這些文件對於單個項目而言必須是唯一的。還允許您不按項目基礎在項目中包含文件。

保持代碼中心,但允許每個客戶端不同的代碼,而不會導致混淆。

+0

這與不同的目標指定要使用的源文件夾。比名稱更加清潔。 – Nuthatch 2012-01-27 14:21:07

0

我只想創建一個設置界面,讓客戶端進入並根據他們的公司/個人需求定製應用程序。例如,從他們的圖片庫中提供圖片等。

0

您可以爲每個客戶製作項目,幷包含來自同一路徑的所有來源,而無需將其複製到項目目錄中。 因此,您可以使用相同的代碼庫替換項目中的圖標/閃屏。 這看起來像迄今爲止最簡單的方法。

相關問題