2011-08-04 5 views
0

わかりましたので、私はxcodeのチタンのための簡単なキーチェーンモジュールをいつか書き留めようとしていましたが、今でも正しいことができません。私がxcodeでプログラムを実行すると、ビルドは成功したと言われますが、エミュレータを起動することはできません。私はどのメソッドが問題を引き起こしているかを調べるためにコードをコメントアウトし始め、エミュレータはこれらの2つのメソッドをコメントアウトするとうまく動作します。私は客観的なCと書くモジュールの新しいので、任意のアドバイスが素晴らしいだろう。私の主な質問は、あなたはこれらの2つの方法で何かが間違って見ることができます。入力やアドバイスをいただければ幸いです。あなたからこれらのメソッドを呼び出している目的のCの質問のチタンモジュール質問

+ (BOOL)setString:(NSString *)string forKey:(NSString *)key { 
if (string == nil || key == nil) { 
    return NO; 
} 

key = [NSString stringWithFormat:@"%@ - %@", [Keychain appName], key]; 

// First check if it already exists, by creating a search dictionary and requesting  that 
// nothing be returned, and performing the search anyway. 
NSMutableDictionary *existsQueryDictionary = [NSMutableDictionary dictionary]; 

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; 

[existsQueryDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass]; 

// Add the keys to the search dict 
[existsQueryDictionary setObject:@"service" forKey:(id)kSecAttrService]; 
[existsQueryDictionary setObject:key forKey:(id)kSecAttrAccount]; 

OSStatus res = SecItemCopyMatching((CFDictionaryRef)existsQueryDictionary, NULL); 
if (res == errSecItemNotFound) { 
    if (string != nil) { 
     NSMutableDictionary *addDict = existsQueryDictionary; 
     [addDict setObject:data forKey:(id)kSecValueData]; 

     res = SecItemAdd((CFDictionaryRef)addDict, NULL); 
     NSAssert1(res == errSecSuccess, @"Recieved %d from SecItemAdd!", res); 
    } 
} else if (res == errSecSuccess) { 
    // Modify an existing one 
    // Actually pull it now of the keychain at this point. 
    NSDictionary *attributeDict = [NSDictionary dictionaryWithObject:data forKey:(id)kSecValueData]; 

    res = SecItemUpdate((CFDictionaryRef)existsQueryDictionary, (CFDictionaryRef)attributeDict); 
    NSAssert1(res == errSecSuccess, @"SecItemUpdated returned %d!", res); 

} else { 
    NSAssert1(NO, @"Received %d from SecItemCopyMatching!", res); 
} 

return YES; 

}

+ (NSString *)getStringForKey:(NSString *)key { 

key = [NSString stringWithFormat:@"%@ - %@", [Keychain appName], key]; 

NSMutableDictionary *existsQueryDictionary = [NSMutableDictionary dictionary]; 

[existsQueryDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass]; 

// Add the keys to the search dict 
[existsQueryDictionary setObject:@"service" forKey:(id)kSecAttrService]; 
[existsQueryDictionary setObject:key forKey:(id)kSecAttrAccount]; 

// We want the data back! 
NSData *data = nil; 

[existsQueryDictionary setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; 

OSStatus res = SecItemCopyMatching((CFDictionaryRef)existsQueryDictionary, (CFTypeRef *)&data); 
[data autorelease]; 
if (res == errSecSuccess) { 
    NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; 
    return string; 
} else { 
    NSAssert1(res == errSecItemNotFound, @"SecItemCopyMatching returned %d!", res); 
}  

return nil; 
} 
+1

エミュレータではなくシミュレータです。 – Sneakyness

答えて

1

?それらはあなたのメインモジュールにありますか?最終的なJavaScript呼び出しがどのように見えるかを私に示してもらえれば、私はあなたの問題にもっと自信を持って対処できます。

直面する問題の1つは、プリミティブ型(BOOLなど)をチタンに戻すことができないことです。最初に番号に変換する必要があります。 (恐れていない、JavaScriptと真実の値はまだBOOLのように使うことができます!)過去のことを助けるマクロがあります - NSNumber *を返して、実際の戻り値を次のようにラップします:return NUMBOOL(YES);またはNUMBOOL(NO)を返します。

もう1つはあなたの主張かもしれません。 Krollはあなたに与えられた引数を取り出すことができる単一の引数でメソッドを呼び出すことになります。あなたのメソッドのシグネチャは通常、JavaScriptにさらされた場合、次のようになります。 - (void)mySpecialMethod:(id)args;

3つ目の問題は、お使いのメソッドの名前である可能性があります。 "get"と "set"はKrollにとって特別なキーワードであり、プロパティで使用されます。あなたのJavaScriptからmyModule.property = 'something'と書くと、あなたの目的の中で - (void)setProperty:(id)argsが呼び出されます。

最後に、クラスレベルのメソッドとオブジェクトレベルのメソッドの2つを宣言している理由はわかりません。おそらく、これらの方法がどこで使用されているかについてもっと詳しく説明できれば、あなたが何をしようとしているのかを知ることができます。

これまで、core source code for Titanium Mobileを見て、あなた自身のモジュールであなたの目的-cでできることとできないことについて学んでください。

希望すると便利です。 -Dawson