CFReadStreamRef总是为零

时间:2013-02-23 16:53:10

标签: objective-c cocoa core-foundation

我正在尝试读取存储公钥的public.pem文件,但CFReadStreamRef始终返回nil。 publicKeyPathurl不是nil(正如我在调试器中看到的那样),我没有其他线程读取或写入文件。我该如何解决这个问题?

NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public" ofType:@"pem"];
CFURLRef url  = (CFURLRef)CFBridgingRetain([NSURL URLWithString:publicKeyPath]);
CFReadStreamRef cfrs = CFReadStreamCreateWithFile(kCFAllocatorDefault, url);

2 个答案:

答案 0 :(得分:1)

我应该使用[NSURL fileURLWithPath:publicKeyPath]

答案 1 :(得分:1)

NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public" ofType:@"pem"];

这将返回类似/private/var/mobile/.../public.pem/foo/bar的内容。

CFURLRef url  = (CFURLRef)CFBridgingRetain([NSURL URLWithString:publicKeyPath]);

这将从字符串 /foo/bar创建一个网址。这是一个完全有效的相对网址(它链接到scheme://authority/foo/bar,其中scheme://authority由基本网址确定。

您想要的是绝对文件网址,这意味着您需要+fileURLWithPath:。或者,使用-URLForResource:withExtension:,它将从一开始就为您提供文件URL:

NSURL *url= [[NSBundle mainBundle] URLForResource:@"public.pem" withExtension:nil];
CFReadStreamRef cfrs = CFReadStreamCreateWithFile(kCFAllocatorDefault, (__bridge CFURLRef)url);