Титановый модуль в задаче C вопрос - PullRequest
0 голосов
/ 04 августа 2011

Хорошо, поэтому я уже некоторое время пытаюсь написать простой модуль цепочки для ключей для титана в 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 Ответ

1 голос
/ 10 августа 2011

Откуда вы вызываете эти методы?Они в вашем основном модуле?Если вы сможете показать мне, как должны выглядеть ваши последние вызовы JavaScript, я могу с большей уверенностью решить вашу проблему.

Одна непосредственная проблема, которую я вижу, состоит в том, что вы не можете отправлять примитивные типы (BOOLэкземпляр) вернемся к титаниуму.Вы должны сначала преобразовать его в число.(Не бойтесь, JavaScript и его истинные значения все еще могут использовать его как BOOL!) Есть макрос, который поможет вам преодолеть это - вернуть NSNumber * и обернуть ваши фактические результаты, как показано ниже: return NUMBOOL (YES);или верните NUMBOOL (NO);.

Другой может быть вашими аргументами.Kroll будет вызывать ваши методы с одним аргументом, из которого вы можете получить аргументы, которые вам были даны.Сигнатуры методов обычно выглядят следующим образом, если они представлены в JavaScript: - (void) mySpecialMethod: (id) args;

Третьей проблемой может быть имя ваших методов.«get» и «set» - это специальные ключевые слова для Kroll, которые используются в свойствах.Из вашего JavaScript вы должны написать myModule.property = 'кое-что', которое затем вызывает - (void) setProperty: (id) args в вашей цели -c.

Наконец, я не уверен, почему у вас есть этиобъявлены как методы уровня класса, против методов уровня объекта.Возможно, если вы сможете подробнее объяснить, где используются эти методы, я смогу увидеть, что вы пытаетесь сделать, и помочь вам в этом.

В прошлом вы должны взглянуть на основной источник .код для Titanium Mobile , чтобы узнать больше о том, что вы можете и не можете делать со своей целью-c в своих собственных модулях.

Надеюсь, это поможет!-Dawson

...