0

我正在尝试更改单元测试的各种属性,以便在实际运行应用程序时注入的已知设置不会干扰各种设置(特别是钥匙串,但也可能是捆绑标识符)

(我设想这样做的方式是根据plist 中kSecAttrAccessGroup的条目使用不同的单元测试。)KeyChainService

我还打算将此脚本与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}"
4

1 回答 1

0

我最终解决共享钥匙串问题的方式如下:

为设置“KeyChainIdentifier”属性的 KeyChain 创建了一个单例包装器帮助器类。这将用于在 KeyChain 中放置值时为每个不同的环境设置唯一的 kSecAttrService。

IE,

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。

因此,我将能够运行不会干扰应用程序正常运行的单元测试,此外,通过更改 keyChainIdentifier 和 BundleIdentifier,我将能够在同一设备上为不同环境运行应用程序。繁荣!

于 2013-03-22T15:46:57.540 回答