Iphone 目标C问题中的钛模块

Iphone 目标C问题中的钛模块,iphone,objective-c,titanium,titanium-modules,Iphone,Objective C,Titanium,Titanium Modules,好的,我已经尝试在xcode中为钛编写一个简单的钥匙链模块有一段时间了,但是我仍然无法正确地完成它。当我在xcode中运行程序时,它说构建成功了,但没有打开模拟器来运行它。我开始注释代码以查看哪些方法导致了问题,当我注释这两个方法时,仿真器运行良好。我不熟悉objective c和编写模块,所以任何建议都很好。我的主要问题是你能看出这两种方法有什么不对吗。非常感谢您的任何意见或建议 + (BOOL)setString:(NSString *)string forKey:(NSString *)k

好的,我已经尝试在xcode中为钛编写一个简单的钥匙链模块有一段时间了,但是我仍然无法正确地完成它。当我在xcode中运行程序时,它说构建成功了,但没有打开模拟器来运行它。我开始注释代码以查看哪些方法导致了问题,当我注释这两个方法时,仿真器运行良好。我不熟悉objective 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;
}


您从哪里调用这些方法?它们在你的主模块里吗?如果您能告诉我您希望最后的JavaScript调用是什么样子的,我可以更加自信地解决您的问题

我看到的一个直接问题是,您无法将基本类型(例如BOOL)发送回Tianium。你需要先把它转换成一个数字。(不用担心,JavaScript和它的真实值仍然可以像BOOL一样使用它!)有一个宏可以帮助您克服这一点——返回一个NSNumber*,并像这样包装您的实际返回:return NUMBOOL(YES);或返回NUMBOOL(否)

另一个可能是你的论点。Kroll将用一个参数调用您的方法,您可以从中检索提供给您的参数。如果暴露在JavaScript中,您的方法签名通常是这样的:-(void)mySpecialMethod:(id)args

第三个问题可能是方法的名称。“get”和“set”是Kroll的特殊关键字,用于属性。从JavaScript编写myModule.property='something',然后在objective-c中调用-(void)setProperty:(id)args

最后,我不知道为什么要将它们声明为类级方法,而不是对象级方法。也许如果你能解释更多关于这些方法在哪里被使用的话,我可以看到你正在尝试做什么,并帮助你达到目的

除此之外,您还应该了解更多关于在您自己的模块中可以使用objective-c做什么和不能使用objective-c做什么的信息


希望这有帮助-道森

这是个模拟器,不是模拟器。
+ (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;
}