2010-08-29 134 views
4

我需要連接到遠程主機並使用某些二進制協議交換數據。我連接着:CFStream:用戶友好的錯誤

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"whatever.host.com", 
      port, &readStream, &writeStream); 

一切都很好,除了錯誤處理。我

  1. 處理我流的委託
  2. NSStreamEventErrorOccurredtheError = [stream streamError];
  3. 試圖讓用戶友好的錯誤文本與[theError localizedDescription]檢索錯誤。

這裏是問題:而不是漂亮的錯誤信息,如「找不到主機」,我得到"Operation could not be completed. (NSUnknownErrorDomain error 8.)"
或者,當設備處於飛行模式,我得到"The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)"

問題:如何獲取套接字連接,我可以在其中檢索適當的錯誤消息?當我使用NSURLConnection(在另一個應用程序中)時,錯誤信息非常友好,所以我想得到類似的東西。

回答

-1

難道你不覺得只是發現錯誤,檢查錯誤類型並提供自定義錯誤信息會更容易嗎?可能我比重寫代碼更容易,只是爲了製作漂亮的消息。獎金:這種方式,你有完全的控制,並可以添加更長的描述,如果你想......

+1

不,我不想爲每個可能的連接錯誤編寫自定義錯誤消息 – unbeli 2010-09-04 21:33:25

+0

不過,我很肯定這是最簡單的解。但這取決於你。不能那麼多... – 2010-09-05 10:07:31

1

我相信本地化錯誤描述的供應必須發生在框架級別。換句話說,Foundation框架開發人員提供了更多有用的信息,並且讓本地化人員翻譯了他們,等等。根據您的描述來看,CoreFoundation層在這方面沒有得到如此多的關注。

是否有Foundation API可以在此處使用?

+0

是否有基礎API來打開普通套接字連接? – unbeli 2010-09-09 06:31:04

2

Apple沒有提供適當的iOS錯誤條件描述。這是而不是您的代碼或他們的錯誤 - 在iOS設備上,字符串不存在

爲了提供更有趣的錯誤信息,將由您來檢查CFErrorNSError對象的域和代碼並返回一些內容。在Apple的網站上有kCFErrorDomainCFNetwork的錯誤說明列表here。 - 這樣的代碼,將有助於建立你的錯誤陳述UI時調用它:

NSString *GetUsefulErrorDescription(NSError *e) { 
    NSString *codeString = [NSString stringWithFormat: @"%li", (long)[e code]]; 
    NSString *localized = NSLocalizedStringInTable(codeString, [e domain], nil); 
    if (!localized || [localized isEqual: codeString]) 
     return [e localizedDescription]; 
    else 
     return localized; 
} 

這看起來在一個名爲「kCFErrorDomainCFNetwork.strings」爲一個字符串,如「100」,在你的應用程序包文件(用於kCFSOCKSErrorUnknownClientVersion,它的值可以作爲「SOCKS服務器拒絕訪問,因爲它不支持與請求的SOCKS版本的連接」。)如果沒有這樣的錯誤描述可用,它將使用由NSError返回的字符串,這將是「The operation couldn 't be completed。[...]「

+0

這也是另一種自己寫所有可能錯誤的描述的方法。這正是我想要避免的。 – unbeli 2010-09-09 06:30:29

+0

在iOS上沒有選擇。 OS * flat out *不包含對這些錯誤的任何描述。 – 2010-09-09 16:11:56

+0

不正確,當使用NSURLConnection時,錯誤非常友好,所以有說明* somewhere *。 – unbeli 2010-09-09 19:55:19