0

単体テストのさまざまなプロパティを変更して、実際にアプリを実行するときに、注入された既知の設定がさまざまな設定に干渉しないようにしようとしています (具体的にはキーチェーンですが、バンドル識別子も可能性があります)。

(私がこれを行う方法は、plistkSecAttrAccessGroupのエントリに基づいて単体テストに別のものを使用することです。)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 を設定するために使用されます。

つまり、

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 に答える