2013-02-23 129 views
1

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

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

回答

1

我应该用[NSURL fileURLWithPath:publicKeyPath]

+2

虽然它的优良回答自己的问题,你真的需要提供一点比这更多的信息,所以,这个问题/答案就对别人有用的资源 – 2013-02-23 17:23:58

+0

@middaparka我认为有利于使用更加用户友好的NSU的论点对于更低级的CF类,RL类不言而喻,它们不需要解释。为什么要低于你绝对必要的水平? – RonLugge 2013-02-24 03:52:31

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的URL。这是一个完全有效的相对URL(它链接到scheme://authority/foo/bar其中scheme://authority由基本URL确定。

你需要的是一个绝对文件URL,这意味着你要+fileURLWithPath:,或者使用-URLForResource:withExtension:,这将给你从一开始就文件网址:。

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