Титановый модуль в задаче C вопрос
Итак, я пытался написать простой модуль цепочки для ключей для титана в xcode уже некоторое время, и все же я не могу сделать это правильно. когда я запускаю программу в xcode, она говорит, что сборка прошла успешно, но не открывает эмулятор для ее запуска. Я начал комментировать код, чтобы увидеть, какие методы вызывают проблемы, и эмулятор работает нормально, когда я закомментирую эти два метода. я новичок в цели 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 ответ
Откуда вы вызываете эти методы? Они в вашем основном модуле? Если вы сможете показать мне, как должны выглядеть ваши последние вызовы JavaScript, я могу с уверенностью решить вашу проблему.
Я вижу одну непосредственную проблему в том, что вы не можете отправлять примитивные типы (например, BOOL) обратно в Titanium. Вы должны сначала преобразовать его в число. (Не бойтесь, JavaScript и его истинные значения все еще могут использовать его как BOOL!) Есть макрос, который поможет вам преодолеть это - вернуть NSNumber* и обернуть ваши фактические результаты, например, так: return NUMBOOL(YES); или верните NUMBOOL (НЕТ);.
Еще могут быть ваши аргументы. Kroll собирается вызывать ваши методы с одним аргументом, из которого вы можете получить аргументы, которые вам были даны. Сигнатуры вашего метода, как правило, будут выглядеть следующим образом, если они представлены в JavaScript: -(void)mySpecialMethod:(id)args;
Третьим вопросом может быть название ваших методов. "get" и "set" - это специальные ключевые слова для Kroll, которые используются в свойствах. Из вашего JavaScript вы должны написать myModule.property = 'что-то', которое затем вызовет -(void)setProperty:(id)args в вашей target-c.
Наконец, я не уверен, почему они объявлены как методы уровня класса, а не методы уровня объекта. Возможно, если вы сможете подробнее объяснить, где используются эти методы, я смогу увидеть, что вы пытаетесь сделать, и помочь вам в этом.
Кроме того, вы должны взглянуть на основной исходный код для Titanium Mobile, чтобы узнать больше о том, что вы можете и не можете делать со своей целью-c в своих собственных модулях.
Надеюсь это поможет! -Dawson