問題1:域名沒法解析html
當報{_kCFStreamErrorCodeKey=1, _kCFStreamErrorDomainKey=12}錯誤時 意味着DNS沒法解析域名,這時候你跑去問安卓的,然而他們那邊又是正常的,爲何呢?關鍵在於MQTTWebsocketTransport.m 52行,git
- (NSURL*) endpointURL { NSString *protocol = (self.tls) ? @"wss" : @"ws"; NSString *portString = (self.port == 0) ? @"" : [NSString stringWithFormat:@":%d",(unsigned int)self.port]; NSString *path = self.path; NSString *urlString = [NSString stringWithFormat:@"%@://%@%@%@", protocol, self.host, portString, path]; NSURL *url = [NSURL URLWithString:urlString]; return url;}複製代碼
緣由是庫默認你傳的host 不帶wss:// 或 ws:// 因此源碼給拼上了。全部致使庫拋出異常,Error Domain=kCFErrorDomainCFNetwork Code=1 "(null)" UserInfo={_kCFStreamErrorCodeKey=1, _kCFStreamErrorDomainKey=12}web
問題2:因服務端mqtt 默認的protocol 和你本地的protocol可能會不同,這個問題只要你又實現代理方法,或者經過wireshark 抓包對比就能看出protocol差別。bash
- (void)protocolError:(LDSMQTTSession *)session error:(NSError *)error;複製代碼
問題3:關於在子線程調一下接口時publishHandler的回調有可能比一下接口的回覆更慢!!!爲何呢?session
- (UInt16)publishData:(NSData *)data onTopic:(NSString *)topic retain:(BOOL)retainFlag qos:(MQTTQosLevel)qos publishHandler:(MQTTPublishHandler)publishHandler;複製代碼
- (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid複製代碼
由於代理所在線程爲主線程,那麼又是爲何不能放子線程呢?由於mqtt init時會獲取當前線程的runloop 用於開啓checkdup等定時器,以及 encoder,decoder 代理的runloop .若是放在子線程,encoder,decoder 代理方法並不執行!!! (暫時不知道緣由,但願大神指點)socket
問題3:關於mqtt創建鏈接以及證書驗證流程,下次補充!ide
MQTT中文站點:www.gitbook.com/book/mcxiao…oop