2013-02-23 83 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);