2013-03-21 20 views
0

我試圖改變各種屬性的單元測試使得所注射的已知設置將不會使用不同的設置干擾實際運行的應用程序(特別是鑰匙扣,但潛在的捆綁標識符太)時Xcode的試驗方案腳本

(我設想這樣做的方法是使用基於plist中KeyChainService進入單元測試不同的kSecAttrAccessGroup

我也是用這個腳本AppCode打算。

問題是我找不到任何地方放置腳本(或任何變量),它會在任何測試階段之前發生的構建階段覆蓋正常的預執行腳本。

我的bash腳本如下:

plist="${PROJECT_DIR}/${INFOPLIST_FILE}" 
 if [[ "${plist}" == "/" ]]; then 
    # AppCode (no variables set) 
  plist=./myProject-Info.plist 
 fi 
 if [[ -z "$csKeyChain" ]]; then 
  csKeyChain=RUN 
 fi 
 if [[ -z "$bundleIdentifier" ]]; then 
  bundleIdentifier=com.mycompany.abc 
 fi 
  
 echo "Setting KeyChainService to $csKeyChain; CFBundleIdentifier to $bundleIdentifier" > ~/BUILD.txt 
 /usr/libexec/Plistbuddy -c "Set KeyChainService $csKeyChain" "${plist}" 
 /usr/libexec/Plistbuddy -c "Set CFBundleIdentifier $bundleIdentifier" "${plist}" 

回答

0

我最終解決共享鑰匙扣問題是如下的方式:

創造了鑰匙鏈一個單包裝的輔助類,它設置了一個「KeyChainIdentifier 「財產。在將值放入KeyChain時,這將用於爲每個不同的環境設置獨特的kSecAttrService。

static CSKeyChain *instance; 

+ (void)initialize { 
    static BOOL initialized = NO; 
    if (!initialized) { 
     initialized = YES; { 
      NSString *keyChainIdentifier = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"KeyChainIdentifier"]; 
      instance = [[CSKeyChain alloc] initWithKeyChainIdentifier:keyChainIdentifier]; 
     } 
    } 
} 

然後在單元測試setup()我加

[CSKeyChain setValue:@"csTest" forKeyPath:@"instance.keyChainIdentifier"]; 

我做的唯一的另一件事是使用證書時,爲了確保(kSecAttrKeyTypeRSA)功能,kSecAttrApplicationTag有keyChainIdentifier預先。因此,我將能夠運行不會干擾App正常操作的單元測試,此外,通過更改keyChainIdentifier和BundleIdentifier,將能夠在同一設備上爲不同環境運行應用程序。繁榮!