background:
? ? ? ?最近公司代碼要求從swift3升級到swift5,語法問題so easy,問題是CocoaAsyncSocket 無法connect 的問題。
? ? ? ? server 端一切正常,連接到設定的address和port,client connect server 時,server 一直收不到connect 的回調,而client disconnect 回調, error info 是:
Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" UserInfo={NSLocalizedDescription=Operation not permitted, NSLocalizedFailureReason=Error in connect() function}
網上找了半天,找不到合適的,直到一個帖子說了可能是entitlements設置引起的,于是我仔細關注了project里面entitlements的修改內容。
通過git 對比查看修改的內容,發現工程文件里,自動刪除了一下代碼:
CODE_SIGN_ENTITLEMENTS = xxxx.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = xxxxxxxxx;
關鍵在第一行,刪除了client 的entitlements,而這個文件是用于和其他外部工程或者其他target 溝通的文件,刪除了這個文件,可不就找不到外部target 了嗎
但是我并沒有手動改這個文件配置啊,但是明確是我就是改了entitleMents啊,所以我仔細對比這塊兒
這是以前的:
發現改之后也還是這樣,release client 的,debug 是client 對應finder 的entitlements,理論上這是不對的,理論上,debug socket 也是連不通的,但是卻找到了,可能是Xcode9的bug ,也可能是優化。
而用Xcode 10,升級到swift5之后,配置沒有改,但是peoject文件的修改內容就嚴格按照這個配置來了,所以dubug 就找不到client 的entitlements了,所以socekt連接不上。
修改方式是什么呢,是將bug 修改成和release 一致,這樣debug 也能找到entitlements,連接上socket了:
總結一下:
Xcode 9 雖然entitlements debug 下設置錯誤,但是內部不知道做了什么處理,找到了正確的entitlements。
升級到Xcode10.3 ,swift3 ? 升級到swift5, Xcode10 完全按照setting 來,所以刪除了debug下對應的entitlements設置,所以connect連接不上。解決辦法就是將debug 下entitlements設置正確,問題解決.